stateFunction 的各个部分是否有限制只能按升序或降序排列?

问题描述 投票:0回答:1

我有 3 个间隔:

dvar 间隔 MyInterval[0..2];

我有状态功能

stateFunction MyStateFunction;

我有限制:

alwysConstant(MyStateFunction, MyInterval[i]); alwyasIn(MyStateFunction, MyInterval[i], value_min[i], value_max[i]);

结果,我可以得到这样的图表:

IMG_1 或者 IMG_2

但是我可以编写一个约束,使函数的各个部分仅按 升序 降序 顺序排列吗? (所以IMG_2上的情况是不可取的

mathematical-optimization cplex solver constraint-programming docplex
1个回答
0
投票

我会使用替代方案:

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]);
    
}

这给出了

© www.soinside.com 2019 - 2024. All rights reserved.