我有 3 个间隔:
dvar 间隔 MyInterval[0..2];
我有状态功能
stateFunction MyStateFunction;
我有限制:
alwysConstant(MyStateFunction, MyInterval[i]); alwyasIn(MyStateFunction, MyInterval[i], value_min[i], value_max[i]);
结果,我可以得到这样的图表:
但是我可以编写一个约束,使函数的各个部分仅按 升序 或 降序 顺序排列吗? (所以IMG_2上的情况是不可取的)
我会使用替代方案:
using CP;
int value_min[0..2]=[1,1,1];
int value_max[0..2]=[3,3,3];
dvar interval MyInterval[0..2] size 10;
dvar interval MyIntervalOptions[0..2][1..3] optional;
dvar int value[0..2];
stateFunction MyStateFunction;
subject to
{
endBeforeStart(MyInterval[0],MyInterval[1]);
endBeforeStart(MyInterval[1],MyInterval[2]);
forall(i in 0..2) alternative(MyInterval[i],all(o in 1..3)MyIntervalOptions[i][o]);
forall(i in 0..2)
{
alwaysConstant(MyStateFunction, MyInterval[i]);
alwaysIn(MyStateFunction, MyInterval[i], value_min[i], value_max[i]);
forall(o in 1..3) alwaysEqual(MyStateFunction, MyIntervalOptions[i][o],o);
value[i]==sum(o in 1..3) presenceOf(MyIntervalOptions[i][o])*o;
}
(value[0]<value[1]) && (value[1]<value[2]) || (value[0]>value[1]) && (value[1]>value[2]);
}
这给出了