我想模拟一个约束,我想说一个模式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);
}
;}
当然,您可以发布一个约束(H是一个大数字):
(endOf(mode1,H) <= startOf(mode2,-H)) => (endOf(mode1,-H) <= startOf(mode3,H))
说明:
(endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
mode1
或mode2
不存在,由于常数H
,暗示的左侧是假的,所以它不约束mode3mode1
或mode3
,那么暗示的右侧是正确的,因此它不会限制mode2
现在,如果你有许多三元组(mode1,mode2,mode3)
这个约束成立,那么考虑一个更全局的公式也会非常有用,它也会利用问题的其他约束:mode2
和mode3
有什么共同之处,如果mode2
在mode1
之后执行那么mode3
还需要被执行吗? mode2
和mode3
之间是否存在其他时间依赖关系?下面是否存在一些逻辑约束(如presenceOf(mode1)==presenceOf(mode2)
)?等等
事实上,问题的定义对我来说仍然不明确。让我总结一下我的理解:
现在还不清楚: