能否为stateFunction添加约束使其分段仅按升序/降序排列?
实现状态函数分段的升序/降序约束
你已经定义了3个区间和状态函数,并添加了基础约束:
dvar interval MyInterval[0..2]; stateFunction MyStateFunction; forall(i in 0..2) { alwaysConstant(MyStateFunction, MyInterval[i]); alwaysIn(MyStateFunction, MyInterval[i], value_min[i], value_max[i]); }
现在要限制函数在各区间的常量值只能按升序或降序排列,完全可以通过添加额外约束实现,分以下几种情况:
非严格升序(后段值 ≥ 前段值)
直接对相邻区间的状态函数值添加不等式约束:
forall(i in 0..1) { MyStateFunction.atStart(MyInterval[i+1]) >= MyStateFunction.atEnd(MyInterval[i]); }
由于alwaysConstant已经保证区间内值恒定,用区间起始或结束点的值就能代表整个区间的常量值。
严格升序(后段值 > 前段值)
把上面的>=替换为>即可:
forall(i in 0..1) { MyStateFunction.atStart(MyInterval[i+1]) > MyStateFunction.atEnd(MyInterval[i]); }
非严格降序(后段值 ≤ 前段值)
forall(i in 0..1) { MyStateFunction.atStart(MyInterval[i+1]) <= MyStateFunction.atEnd(MyInterval[i]); }
严格降序(后段值 < 前段值)
forall(i in 0..1) { MyStateFunction.atStart(MyInterval[i+1]) < MyStateFunction.atEnd(MyInterval[i]); }
可选:允许升序或降序二选一
如果需要让模型自动选择升序或降序(而非固定一种),可以用逻辑或组合两种约束:
( forall(i in 0..1) MyStateFunction.atStart(MyInterval[i+1]) >= MyStateFunction.atEnd(MyInterval[i]) ) || ( forall(i in 0..1) MyStateFunction.atStart(MyInterval[i+1]) <= MyStateFunction.atEnd(MyInterval[i]) );
内容的提问来源于stack exchange,提问作者Asya Troyan
相关产品推荐
相关产品推荐

