0

我在 IBM OPL 中创建了一个时间表:

dvar sequence schedule in all(j in Jobs) job[j]; 

如果 CP-Module 生成解决方案,则该解决方案有时不是非延迟解决方案。然而,这是不允许的,因此我想强制执行非延迟时间表。

我在主题部分尝试了不同的解决方案......

 forall(t in Jobs)
   if (t > 1)
   startOf(job[t]) == endOf(job[t-1]);

...但是当工作 t-1 后面没有工作 t 时,这些失败(显然)。

谁能给我一个关于如何解决这个问题的提示?

亲切的问候,弗兰兹

4

2 回答 2

0

endAtStart仅当您的作业在前一个作业完成时始终准备好开始时才有效。如果不是这种情况,您将收到错误消息。

更好的解决方案是考虑目标中的无延迟。你想要实现的是尽快开始每一项新工作。因此,您可以例如使用staticLex函数:

minimize staticLex(startOf(job[1]), startOf(job[2]),...);

但是,此表达式可能会变得很长,您需要对间隔数进行硬编码。一个小解决方法是分配间隔减少加权因子

minimize sum(j in Jobs) startOf(job[j])*100^-ord(Jobs,j);

我希望这对你有用!

问候简

于 2020-10-23T05:17:07.803 回答
0

您应该尝试使用 endAtStart。(OPL 约束来限制区间变量的相对位置。)关于

于 2015-11-30T09:10:09.453 回答