You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RCPSP场景下如何计算资源闲置时长?已用cumulFunction实现资源日消耗

计算RCPSP中资源闲置时长的方法

针对你已经用cumulFunction计算资源消耗的场景,有两种直接的方式计算资源r的闲置时长(即resUsage[r]为0的总时长):

方法一:基于现有cumulFunction扩展计算

利用integral和step函数,结合项目总工期来推导闲置时长:

  1. 首先定义项目的总工期(所有活动完成的最晚时间):

    dvar float projectEnd;
    subject to {
        projectEnd == max(i in activities) endOf(resItvs[i][r]); // 取所有活动的结束时间最大值
    }
    
  2. 计算资源r被占用的总时长:
    用step(resUsage[r] > 0)生成一个0-1函数(资源占用时为1,闲置时为0),对其积分得到占用的总时长:

    dexpr float occupiedTime[r in resources] = integral( step(resUsage[r] > 0), 0, projectEnd );
    
  3. 闲置时长 = 总工期 - 占用时长:

    dexpr float idleTime[r in resources] = projectEnd - occupiedTime[r];
    

这种方法完全复用了你已有的resUsage定义,无需额外修改资源消耗的计算逻辑。

方法二:直接计算资源占用区间的并集长度

如果不想依赖cumulFunction,可以直接计算所有使用资源r的活动时间区间的并集总长度,再用总工期减去该值得到闲置时长:

// 计算资源r所有占用区间的并集总长度
dexpr float occupiedDuration[r in resources] = unionLength( resItvs[i][r] for i in activities where reqRes[i][r] != 0 );

// 闲置时长
dexpr float idleTime[r in resources] = projectEnd - occupiedDuration[r];

这里的unionLength是CPLEX CP中用于计算多个区间并集总长度的内置函数,能自动处理区间重叠的情况,确保计算的是实际被占用的连续时长。

离散时间场景适配

如果你的RCPSP是按离散天数建模的,可以直接遍历每一天判断资源是否闲置:

dexpr int idleDays[r in resources] = sum(t in 0..projectEnd-1) ( resUsage[r][t] == 0 ? 1 : 0 );

内容的提问来源于stack exchange,提问作者sarwatatwadhika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:51:13