我是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};
答案 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
尽可能小,同时仍要强制执行上述约束的逻辑。