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

Implementing a constraint based on previous variable's value in 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支持implications(使用==>运算符),所以我们可以直接这样写。 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。这可以通过约束 x(i,t+1) >= x(i,t).

来实现

更好的解释是:我们不想要非常短的 运行 长度。 IE。模式:不允许使用 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 发生。