当然,您可以发布一个约束,例如(H 是一个大数):
(endOf(mode1,H) <= startOf(mode2,-H)) => (endOf(mode1,-H) <= startOf(mode3,H))
解释:
- 如果 mode1、mode2 和 mode3 都存在,则约束为:
(endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
- 如果
mode1
ormode2
不存在,由于 constants H
,左边的蕴涵是假的,所以它不约束 mode3
- 如果
mode1
ormode3
不存在,则蕴涵的右侧为真,因此它不约束mode2
现在,如果您有许多(mode1,mode2,mode3)
符合此约束的三元组,那么考虑一个更全局的公式将非常有用,该公式还可以利用问题的其他约束:做什么mode2
和mode3
有共同点,以便 if在then 之后mode2
执行也需要后执行?和之间是否存在其他时间依赖性?下面是否有一些逻辑约束(如)?等等mode1
mode3
mode2
mode3
presenceOf(mode1)==presenceOf(mode2)
事实上,问题的定义对我来说仍然不是很清楚。让我总结一下我的理解:
- 每个作业 i 包含两个活动:“prep_i”,然后是“op_i”</li>
- “准备”和“操作”活动都必须分配给某些机器(一台机器一次只能执行一项活动)
- 给定作业的“准备”和“操作”可能在同一台机器上执行,但这不是必需的
现在还不清楚:
- 看来,对于给定的机器 M,如果我们表示 'op_i1' -> 'op_i2' -> 'op_i3' ... 机器上的操作顺序,那么对应的准备活动 'prep_i1', 'prep_i2', 'prep_i3 ', ... 也必须以相同的方式排序(即使它们不一定在同一台机器上执行)。这是真的吗?也可能是您还想要排序:'prep_i1' -> 'op_i1'-> 'prep_i2' -> 'op_i2' -> 'prep_i3' -> 'op_i3' ...?
- 如果不是,并且如果问题只是准备活动“prep_i”还需要一些可用的额外资源,数量有限,为什么不使用 cumul 函数(或其他 noOverlap,如果您还需要的话)对这些额外资源进行建模处理这些资源的分配)以限制可以并行执行的准备活动的数量?