如何定义依赖序列的约束?

时间:2019-04-23 14:59:50

标签: cplex constraint-programming opl cp-optimizer

我想建模一个约束,要说的是,是否在并行工作机上的模式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);
    }
;}

1 个答案:

答案 0 :(得分:1)

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

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

说明:

  • 如果存在模式1,模式2和模式3,则约束为:(endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
  • 如果缺少mode1mode2,则由于常量H,蕴含的左侧为false,因此它不限制mode3
  • 如果没有mode1mode3,则蕴涵的右边为true,因此它不限制mode2

现在,如果您有许多受此约束约束的三元组(mode1,mode2,mode3),考虑一个更全面的表述也将利用该问题的其他约束将非常有用:mode2和{ {1}}的共同点在于,如果mode3是在mode2之后执行的,那么mode1也需要在之后执行吗? mode3mode2之间是否还有其他时间依赖性?下面是否存在一些逻辑约束(例如mode3)?等

实际上,问题的定义对我来说仍然不清楚。 让我总结一下我的理解:

  • 每项工作我都包含两项活动:“ prep_i”,然后是“ op_i”
  • “准备”和“操作”活动都必须分配给 一些机器(一台机器一次只能执行一项活动)
  • 给定作业的“准备”和“操作”可能在同一台机器上执行,但这不是必需的

现在还不清楚:

  • 对于给定的机器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来建模这些附加资源)呢?还需要处理这些资源的分配)以限制可以并行执行的准备活动的数量?