Token导航 LogoToken导航

Agent Skill · 研究检索

resource-allocation-optimizer(资源分配优化器)

resource-allocation-optimizer 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

resource-allocation-optimizer 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为权限未标注;许可证信息还不明确,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 61,129。

总安装 356周安装 15GitHub Stars 111下载 125核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:resource-allocation-optimizer(资源分配优化器)
来源仓库:https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction
仓库路径:skills/resource-allocation-optimizer
安装命令:
npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction --skill resource-allocation-optimizer
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction --skill resource-allocation-optimizer

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

查找、检索和筛选与资源分配优化相关的信息。适合根据关键词快速定位候选结果。通过 npx skills add 命令从指定仓库安装并使用。需确认权限范围、维护状态,注意是否触发联网或文件读写。resource-allocation-optimizer 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/resource-allocation-optimizer

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agent…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    权限没有明确标注,第一次使用时只给一个无关紧要的任务,观察它到底读了哪些文件和网络。

常见问题

6 条

resource-allocation-optimizer 怎么安装?

在终端执行 npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_const…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

resource-allocation-optimizer 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

resource-allocation-optimizer 需要什么权限?

权限级别没有明确标注。第一次使用时建议只给无关紧要的任务,观察它实际读写了哪些内容。

resource-allocation-optimizer 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

resource-allocation-optimizer 用的人多吗?

公开数据是累计安装 356 次,近一周安装 15 次,下载 125 次,GitHub 111 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

resource-allocation-optimizer 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
resource-allocation-optimizer

资源分配优化器 · 本页

356111权限未标注未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Resource Allocation Optimizer

Overview

Optimize resource allocation in construction schedules. Level workforce and equipment utilization, resolve over-allocations, and balance workload across the project duration.

"Resource leveling reduces peak demand by 30% and improves productivity" — DDC Community

Resource Leveling Concept

Before Leveling:                    After Leveling:
Workers                             Workers
  20│    ████                         15│  ████████████
  15│  ████████                        10│████████████████
  10│████████████                       5│████████████████████
   5│██████████████████                 0└──────────────────────
   0└────────────────────                  Week 1  2  3  4  5  6
      Week 1  2  3  4  5
                                       Peak reduced, duration extended

Technical Implementation

from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
from datetime import datetime, timedelta
from collections import defaultdict
import heapq

@dataclass
class Resource:
    id: str
    name: str
    resource_type: str  # labor, equipment, material
    capacity: float  # units available per day
    cost_per_unit: float = 0.0
    skills: List[str] = field(default_factory=list)

@dataclass
class ResourceAssignment:
    activity_id: str
    resource_id: str
    units: float  # units required per day
    start_day: int
    end_day: int

@dataclass
class Activity:
    id: str
    name: str
    duration: int
    early_start: int
    late_start: int
    total_float: int
    resource_requirements: Dict[str, float] = field(default_factory=dict)
    is_critical: bool = False

@dataclass
class ResourceProfile:
    resource_id: str
    daily_usage: Dict[int, float]  # day -> units used
    peak_usage: float
    average_usage: float
    utilization_rate: float

@dataclass
class LevelingResult:
    original_duration: int
    new_duration: int
    activities_shifted: List[Tuple[str, int, int]]  # (id, old_start, new_start)
    resource_profiles: Dict[str, ResourceProfile]
    peak_reduction: Dict[str, float]

class ResourceOptimizer:
    """Optimize construction resource allocation."""

    def __init__(self):
        self.resources: Dict[str, Resource] = {}
        self.activities: Dict[str, Activity] = {}
        self.assignments: List[ResourceAssignment] = []

    def add_resource(self, id: str, name: str, resource_type: str,
                    capacity: float, cost_per_unit: float = 0.0,
                    skills: List[str] = None) -> Resource:
        """Add resource to pool."""
        resource = Resource(
            id=id,
            name=name,
            resource_type=resource_type,
            capacity=capacity,
            cost_per_unit=cost_per_unit,
            skills=skills or []
        )
        self.resources[id] = resource
        return resource

    def add_activity(self, id: str, name: str, duration: int,
                    early_start: int, late_start: int,
                    resource_requirements: Dict[str, float] = None,
                    is_critical: bool = False) -> Activity:
        """Add activity with resource requirements."""
        activity = Activity(
            id=id,
            name=name,
            duration=duration,
            early_start=early_start,
            late_start=late_start,
            total_float=late_start - early_start,
            resource_requirements=resource_requirements or {},
            is_critical=is_critical
        )
        self.activities[id] = activity

        # Create assignments
        for res_id, units in activity.resource_requirements.items():
            assignment = ResourceAssignment(
                activity_id=id,
                resource_id=res_id,
                units=units,
                start_day=early_start,
                end_day=early_start + duration
            )
            self.assignments.append(assignment)

        return activity

    def calculate_resource_profile(self, resource_id: str,
                                  activity_starts: Dict[str, int] = None) -> ResourceProfile:
        """Calculate daily resource usage profile."""
        if resource_id not in self.resources:
            raise ValueError(f"Resource {resource_id} not found")

        resource = self.resources[resource_id]
        daily_usage = defaultdict(float)

        # Use provided starts or early starts
        starts = activity_starts or {act.id: act.early_start for act in self.activities.values()}

        for assignment in self.assignments:
            if assignment.resource_id != resource_id:
                continue

            act_start = starts.get(assignment.activity_id, assignment.start_day)
            act = self.activities[assignment.activity_id]

            for day in range(act_start, act_start + act.duration):
                daily_usage[day] += assignment.units

        usage_values = list(daily_usage.values()) if daily_usage else [0]
        project_duration = max(daily_usage.keys()) + 1 if daily_usage else 0

        return ResourceProfile(
            resource_id=resource_id,
            daily_usage=dict(daily_usage),
            peak_usage=max(usage_values),
            average_usage=sum(usage_values) / len(usage_values) if usage_values else 0,
            utilization_rate=sum(usage_values) / (project_duration * resource.capacity) if project_duration else 0
        )

    def identify_overallocations(self) -> Dict[str, List[Tuple[int, float]]]:
        """Identify days where resources are over-allocated."""
        overallocations = {}

        for resource in self.resources.values():
            profile = self.calculate_resource_profile(resource.id)
            over_days = [
                (day, usage - resource.capacity)
                for day, usage in profile.daily_usage.items()
                if usage > resource.capacity
            ]
            if over_days:
                overallocations[resource.id] = over_days

        return overallocations

    def level_resources(self, resource_ids: List[str] = None,
                       allow_duration_extension: bool = True,
                       max_extension_days: int = 30) -> LevelingResult:
        """Level resources by shifting non-critical activities."""
        resource_ids = resource_ids or list(self.resources.keys())

        # Store original starts
        original_starts = {act.id: act.early_start for act in self.activities.values()}
        original_duration = max(act.early_start + act.duration for act in self.activities.values())

        # Current activity starts (will be modified)
        current_starts = dict(original_starts)

        # Sort activities by float (most float = most flexibility)
        sorted_activities = sorted(
            [a for a in self.activities.values() if not a.is_critical],
            key=lambda a: -a.total_float
        )

        activities_shifted = []

        # Iteratively resolve overallocations
        for _ in range(100):  # Max iterations
            overallocations = self._check_overallocations(current_starts, resource_ids)

            if not overallocations:
                break

            # Find activity to shift
            shifted = False
            for act in sorted_activities:
                if act.id in [o[0] for o in overallocations]:
                    # Try to shift this activity
                    new_start = self._find_valid_start(
                        act, current_starts, resource_ids,
                        allow_duration_extension, max_extension_days
                    )

                    if new_start is not None and new_start != current_starts[act.id]:
                        old_start = current_starts[act.id]
                        current_starts[act.id] = new_start
                        activities_shifted.append((act.id, old_start, new_start))
                        shifted = True
                        break

            if not shifted:
                break

        # Calculate new duration and profiles
        new_duration = max(
            current_starts[act.id] + act.duration
            for act in self.activities.values()
        )

        resource_profiles = {}
        peak_reduction = {}

        for res_id in resource_ids:
            original_profile = self.calculate_resource_profile(res_id, original_starts)
            new_profile = self.calculate_resource_profile(res_id, current_starts)
            resource_profiles[res_id] = new_profile
            peak_reduction[res_id] = original_profile.peak_usage - new_profile.peak_usage

        return LevelingResult(
            original_duration=original_duration,
            new_duration=new_duration,
            activities_shifted=activities_shifted,
            resource_profiles=resource_profiles,
            peak_reduction=peak_reduction
        )

    def _check_overallocations(self, starts: Dict[str, int],
                               resource_ids: List[str]) -> List[Tuple[str, int, str]]:
        """Check for overallocations with given starts."""
        overallocations = []

        for res_id in resource_ids:
            resource = self.resources[res_id]
            daily_usage = defaultdict(list)

            for assignment in self.assignments:
                if assignment.resource_id != res_id:
                    continue

                act = self.activities[assignment.activity_id]
                act_start = starts[assignment.activity_id]

                for day in range(act_start, act_start + act.duration):
                    daily_usage[day].append((assignment.activity_id, assignment.units))

            for day, activities in daily_usage.items():
                total = sum(units for _, units in activities)
                if total > resource.capacity:
                    for act_id, _ in activities:
                        overallocations.append((act_id, day, res_id))

        return overallocations

    def _find_valid_start(self, activity: Activity, current_starts: Dict[str, int],
                         resource_ids: List[str], allow_extension: bool,
                         max_extension: int) -> Optional[int]:
        """Find valid start day that doesn't cause overallocation."""
        min_start = activity.early_start
        max_start = activity.late_start if not allow_extension else activity.late_start + max_extension

        for start in range(min_start, max_start + 1):
            # Check if this start causes overallocation
            test_starts = dict(current_starts)
            test_starts[activity.id] = start

            overallocations = self._check_overallocations(test_starts, resource_ids)
            activity_over = [o for o in overallocations if o[0] == activity.id]

            if not activity_over:
                return start

        return None

    def optimize_for_cost(self, target_duration: int = None) -> Dict:
        """Optimize resource allocation for minimum cost."""
        # Calculate baseline cost
        baseline_cost = self._calculate_total_cost()

        # Try different allocation strategies
        strategies = []

        # Strategy 1: Minimize overtime
        overtime_result = self._minimize_overtime()
        strategies.append({
            "strategy": "Minimize Overtime",
            "cost": overtime_result["cost"],
            "duration": overtime_result["duration"]
        })

        # Strategy 2: Level resources
        level_result = self.level_resources()
        level_cost = self._calculate_total_cost(
            {act.id: act.early_start for act in self.activities.values()}
        )
        strategies.append({
            "strategy": "Level Resources",
            "cost": level_cost,
            "duration": level_result.new_duration
        })

        return {
            "baseline_cost": baseline_cost,
            "strategies": strategies,
            "recommended": min(strategies, key=lambda s: s["cost"])
        }

    def _calculate_total_cost(self, starts: Dict[str, int] = None) -> float:
        """Calculate total resource cost."""
        starts = starts or {act.id: act.early_start for act in self.activities.values()}
        total_cost = 0.0

        for res_id, resource in self.resources.items():
            profile = self.calculate_resource_profile(res_id, starts)

            for day, usage in profile.daily_usage.items():
                # Regular cost
                regular_units = min(usage, resource.capacity)
                total_cost += regular_units * resource.cost_per_unit

                # Overtime cost (1.5x)
                overtime_units = max(0, usage - resource.capacity)
                total_cost += overtime_units * resource.cost_per_unit * 1.5

        return total_cost

    def _minimize_overtime(self) -> Dict:
        """Minimize overtime by resource leveling."""
        result = self.level_resources(allow_duration_extension=True)
        cost = self._calculate_total_cost(
            {act.id: act.early_start for act in self.activities.values()}
        )
        return {"cost": cost, "duration": result.new_duration}

    def generate_resource_histogram(self, resource_id: str,
                                   starts: Dict[str, int] = None) -> str:
        """Generate ASCII histogram of resource usage."""
        profile = self.calculate_resource_profile(resource_id, starts)
        resource = self.resources[resource_id]

        if not profile.daily_usage:
            return "No usage data"

        max_day = max(profile.daily_usage.keys())
        max_usage = max(profile.daily_usage.values())

        lines = [
            f"# Resource Histogram: {resource.name}",
            f"Capacity: {resource.capacity} | Peak: {profile.peak_usage}",
            ""
        ]

        # Scale for display
        scale = 20 / max_usage if max_usage > 0 else 1

        for day in range(max_day + 1):
            usage = profile.daily_usage.get(day, 0)
            bar_len = int(usage * scale)
            over = "!" if usage > resource.capacity else " "
            lines.append(f"Day {day:3d}: {'█' * bar_len}{over} ({usage:.1f})")

        return "\n".join(lines)

Quick Start

# Initialize optimizer
optimizer = ResourceOptimizer()

# Add resources
optimizer.add_resource("CARP", "Carpenters", "labor", capacity=10, cost_per_unit=450)
optimizer.add_resource("IRON", "Ironworkers", "labor", capacity=8, cost_per_unit=550)
optimizer.add_resource("CRANE", "Tower Crane", "equipment", capacity=1, cost_per_unit=2500)

# Add activities with resource requirements
optimizer.add_activity(
    "A", "Foundation Forms", duration=10,
    early_start=0, late_start=0,
    resource_requirements={"CARP": 8},
    is_critical=True
)
optimizer.add_activity(
    "B", "Rebar Installation", duration=8,
    early_start=5, late_start=10,
    resource_requirements={"IRON": 6, "CRANE": 1}
)
optimizer.add_activity(
    "C", "Steel Erection", duration=15,
    early_start=10, late_start=10,
    resource_requirements={"IRON": 10, "CRANE": 1},
    is_critical=True
)

# Check for overallocations
overallocations = optimizer.identify_overallocations()
for res_id, days in overallocations.items():
    print(f"{res_id} over-allocated on days: {[d[0] for d in days]}")

# Level resources
result = optimizer.level_resources()
print(f"Duration change: {result.original_duration} → {result.new_duration} days")
print(f"Activities shifted: {len(result.activities_shifted)}")

for res_id, reduction in result.peak_reduction.items():
    print(f"{res_id} peak reduced by: {reduction:.1f} units")

# Generate histogram
print(optimizer.generate_resource_histogram("IRON"))

Requirements

pip install (no external dependencies)

平台分布

Codex

37.05%
按下载量换算46

Claude

29.43%
按下载量换算37

Cursor

17.83%
按下载量换算22

Gemini CLI

10.56%
按下载量换算13

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

权限未标注

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills