在 GNU Mathprog/AMPL 中实现基于先前变量值的约束
Implementing a constraint based on previous variable's value in GNU Mathprog/AMPL
我有一个二进制程序和我的一个变量,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支持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。这有时在机器调度中称为最小正常运行时间,可以用不同的方式建模。
禁止模式 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 发生。
我有一个二进制程序和我的一个变量,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支持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。这有时在机器调度中称为最小正常运行时间,可以用不同的方式建模。
禁止模式 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 发生。