我在IBM OPL中创建了一个调度:
dvar sequence schedule in all(j in Jobs) job[j]; 如果CP模块生成解决方案,则该解决方案有时不是非延迟解决方案。然而,这是不允许的,因此我想执行一个无延迟的时间表。
我在主题到部分尝试了不同的解决方案...
forall(t in Jobs)
if (t > 1)
startOf(job[t]) == endOf(job[t-1]);..。但是,当作业t-1后面没有作业t时,这些方法(显然)会失败。
谁能给我一个关于如何解决这个问题的提示?
温馨的问候,弗朗茨
发布于 2015-11-30 17:10:09
您应该尝试使用endAtStart。(OPL约束用于限制区间变量的相对位置。)问候
发布于 2020-10-23 13:17:08
仅当您的作业始终准备好在前一个作业完成时启动时,endAtStart才能工作。如果不是这样,您将收到一个错误。
一个更好的解决方案将是考虑到目标中的不拖延。你要达到的目标是尽快开始每一项新工作。例如,您可以使用staticLex函数:
minimize staticLex(startOf(job[1]), startOf(job[2]),...);但是,此表达式可能会变得非常长,您需要硬编码间隔数。一个小的解决方法是指定间隔递减加权因子
minimize sum(j in Jobs) startOf(job[j])*100^-ord(Jobs,j);我希望这对你有用!
问候Jan
https://stackoverflow.com/questions/33985230
复制相似问题