我有一个二进制程序,我的一个变量x_it
定义在两个集合上,即I: Set of objects
和T: Set of the weeks of the year
,因此x_it
是一个二进制变量,代表对象i
是否在第t
周被分配给某个对象。我在AMPL/GNU Mathprog中未能实现的约束是,如果x_it
等于1
,那么x_i(t+1)
和x_i(t+2)
也应该取1
的值。有没有一种方法可以在简单的数学编程语言中实现这种约束?
您想要实现的含义是:
x(i,t) = 1 ==> x(i,t+1) = 1, x(i,t+2) = 1
AMPL支持含义(使用==>运算符(,所以我们可以直接编写它。MathProg没有。
将含义实现为直接线性不等式的一种简单方法是:
x(i,t+1) >= x(i,t)
x(i,t+2) >= x(i,t)
这可以很容易地在AMPL、MathProg或任何建模工具中表达。
这是对这个问题的纯粹、天真的翻译。然而,这意味着一旦单个x(i,t)=1
都跟随在x(i,t+1),x(i,t+2),x(i,t+3)..=1
之后。这可以仅通过约束条件CCD_ 14来实现。
一个更好的解释是:我们不想要很短的跑步长度。即图案:010和0110是不允许的。这有时被称为机器调度中的最小启动时间,可以用不同的方式进行建模。
禁止模式010和0110:
(1-x(i,t-1))+x(i,t)+(1-x(i,t+1)) <= 2 (1-x(i,t-1))+x(i,t)+x(i,t+1)+(1-x(i,t+2)) <= 3
模式01表示0111:
x(i,t+1)+x(i,t+2) >= 2*(x(i,t)-x(i,t-1))
这两种方法都将阻止模式010和0110的出现。