如果条件放大

时间:2019-05-07 14:41:42

标签: linear-programming ampl glpk

我是ampl的新手,我想在if条件中使用以下信息:

我有一个二进制变量X [p,r],其中{p中的p,R中的r}。 现在,我想做一个新的约束,使得在X [p,r] = 0的情况下使用变量R [p,r]。 我不知道如何编写它,或者即使放大器不能处理它,我也尝试了以下约束,但是它们没有用:

s.t. a1{r in R, p in P and X[p,r]=0}: 
s.t. a2{r in R p in P and X[p,r]=0};
s.t. a2{r in R ,p in P, and X[p,r]=0};
s.t. a2{r in R, p in P: and X[p,r]=0};

1 个答案:

答案 0 :(得分:1)

您不能在约束的“全部”部分(在AMPL中,{...}内部的部分)中包含决策变量。取而代之的是,您需要在约束本身中建立一个逻辑,该逻辑说约束仅在X[p,r] = 0时有效。执行此操作的方式取决于约束的类型:> =,=或<=。我将分别编写每种情况,并以通用的方式而不是针对您的问题进行处理。

在下面的说明中,我假定约束条件写为

a[1]y[1] + ... + a[n]y[n] >=/=/<= b, 

其中a[i]b是常数,而y[i]是决策变量。我还假设如果x = 0约束是成立的,其中x是二进制决策变量,并且我们不关心约束x = 1是否成立。

M是一个等于大数的新参数(常量)。

大于或等于约束:

约束为a[1]y[1] + ... + a[n]y[n] >= b。将其重写为

a[1]y[1] + ... + a[n]y[n] >= b - Mx.

然后,如果约束x = 0成立,并且如果约束x = 1 a[i]不起作用,因为右侧非常负。

(如果所有a[1]y[1] + ... + a[n]y[n] >= bx, 均为非负数,则可以改用

a[1]y[1] + ... + a[n]y[n] <= b

更严格。)

小于或等于约束:

约束为a[1]y[1] + ... + a[n]y[n] <= b + Mx. 。将其重写为

x = 0

然后,如果x = 1成立,则约束成立,如果a[1]y[1] + ... + a[n]y[n] = b成立,则由于RHS很大而没有效果。

平等约束:

约束为a[1]y[1] + ... + a[n]y[n] <= b + Mx a[1]y[1] + ... + a[n]y[n] >= b - Mx. 。将其重写为

x = 0

然后,如果x = 1,则相等约束成立,如果M,则约束无效。

注意:如果您的模型相对较大,即解决它花费的时间不可忽略,那么您需要小心使用大M型公式。特别是,您希望dplyr尽可能小,同时仍要强制执行上述约束的逻辑。