如何定义序列相关约束?

问题描述 投票:1回答: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);
    }
;}
cplex constraint-programming opl cp-optimizer
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))
  • 如果mode1mode2不存在,由于常数H,暗示的左侧是假的,所以它不约束mode3
  • 如果没有mode1mode3,那么暗示的右侧是正确的,因此它不会限制mode2

现在,如果你有许多三元组(mode1,mode2,mode3)这个约束成立,那么考虑一个更全局的公式也会非常有用,它也会利用问题的其他约束:mode2mode3有什么共同之处,如果mode2mode1之后执行那么mode3还需要被执行吗? mode2mode3之间是否存在其他时间依赖关系?下面是否存在一些逻辑约束(如presenceOf(mode1)==presenceOf(mode2))?等等

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

  • 每项工作我都包含两项活动:'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)来模拟这些额外资源处理这些资源的分配)以限制可以并行执行的准备活动的数量?
© www.soinside.com 2019 - 2024. All rights reserved.