RCPSP场景下如何计算资源闲置时长?已用cumulFunction实现资源日消耗
计算RCPSP中资源闲置时长的方法
针对你已经用cumulFunction计算资源消耗的场景,有两种直接的方式计算资源r的闲置时长(即resUsage[r]为0的总时长):
方法一:基于现有cumulFunction扩展计算
利用integral和step函数,结合项目总工期来推导闲置时长:
首先定义项目的总工期(所有活动完成的最晚时间):
dvar float projectEnd; subject to { projectEnd == max(i in activities) endOf(resItvs[i][r]); // 取所有活动的结束时间最大值 }计算资源
r被占用的总时长:
用step(resUsage[r] > 0)生成一个0-1函数(资源占用时为1,闲置时为0),对其积分得到占用的总时长:dexpr float occupiedTime[r in resources] = integral( step(resUsage[r] > 0), 0, projectEnd );闲置时长 = 总工期 - 占用时长:
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
相关产品推荐
相关产品推荐

