在 GNU Mathprog/AMPL 中基于前一个变量的值实现约束



我有一个二进制程序,我的一个变量x_it定义在两个集合上,即I: Set of objectsT: 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是不允许的。这有时被称为机器调度中的最小启动时间,可以用不同的方式进行建模。

  1. 禁止模式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
    
  2. 模式01表示0111:

    x(i,t+1)+x(i,t+2) >= 2*(x(i,t)-x(i,t-1))
    

这两种方法都将阻止模式010和0110的出现。

最新更新