我想建模一个约束,要说的是,是否在并行工作机上的模式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);
}
;}
答案 0 :(得分:1)
当然,您可以发布一个约束,例如(H是一个大数字):
(endOf(mode1,H) <= startOf(mode2,-H)) => (endOf(mode1,-H) <= startOf(mode3,H))
说明:
(endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
mode1
或mode2
,则由于常量H
,蕴含的左侧为false,因此它不限制mode3 mode1
或mode3
,则蕴涵的右边为true,因此它不限制mode2
现在,如果您有许多受此约束约束的三元组(mode1,mode2,mode3)
,考虑一个更全面的表述也将利用该问题的其他约束将非常有用:mode2
和{ {1}}的共同点在于,如果mode3
是在mode2
之后执行的,那么mode1
也需要在之后执行吗? mode3
和mode2
之间是否还有其他时间依赖性?下面是否存在一些逻辑约束(例如mode3
)?等
实际上,问题的定义对我来说仍然不清楚。 让我总结一下我的理解:
现在还不清楚: