1

我想对一个约束进行建模,我想说如果一个模式mode1被安排在另一个模式之前的序列上,mode2那么并行工作机器上的一个模式mode3(所以在另一个序列中)不能在mode1另一个序列结束之前启动。所以或多或少我想为此编写一个 if (before...) 块。它是如何正常工作的?

forall(m1 in Modes, m2 in Modes, m3 in Modes: 
       m1.opId==1 && m2.opId==2 && 
       m3.opId==3 && m1.mch==m2.mch==1) {
    if (before(mchs[1], modes[m1], modes[m3]) == 1) {
        endBeforeStart(modes[m1],modes[m2);
    }
;}
4

1 回答 1

1

当然,您可以发布一个约束,例如(H 是一个大数):

(endOf(mode1,H) <= startOf(mode2,-H)) => (endOf(mode1,-H) <= startOf(mode3,H))

解释:

  • 如果 mode1、mode2 和 mode3 都存在,则约束为:(endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
  • 如果mode1ormode2不存在,由于 constants H,左边的蕴涵是假的,所以它不约束 mode3
  • 如果mode1ormode3不存在,则蕴涵的右侧为真,因此它不约束mode2

现在,如果您有许多(mode1,mode2,mode3)符合此约束的三元组,那么考虑一个更全局的公式将非常有用,该公式还可以利用问题的其他约束:做什么mode2mode3有共同点,以便 if在then 之后mode2执行也需要后执行?和之间是否存在其他时间依赖性?下面是否有一些逻辑约束(如)?等等mode1mode3mode2mode3presenceOf(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,如果您还需要的话)对这些额外资源进行建模处理这些资源的分配)以限制可以并行执行的准备活动的数量?
于 2019-04-24T08:50:39.193 回答