【问题标题】:if condition in ampl如果条件在ampl
【发布时间】:2019-05-07 14:41:41
【问题描述】:

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

我有一个二进制变量 X[p,r],其中 {p in P,r in 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};

【问题讨论】:

  • 您的意思是该约束仅在X[p,r] = 0存在 还是您想要一个强制R[p,r]X[p,r] = 0 时为非零的约束?
  • 我的意思是约束只有在 X[p,r] = 0 时才存在
  • @LarrySnyder610 你能帮我吗?如果你知道?

标签: linear-programming ampl glpk


【解决方案1】:

您不能在约束的“for all”部分(在 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] &gt;= 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] &lt;= b。改写为

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

那么,如果x = 0,则约束成立,如果x = 1,则没有效果,因为RHS非常大。

等式约束:

约束是a[1]y[1] + ... + a[n]y[n] = b。改写为

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

那么,如果x = 0,则等式约束成立,如果x = 1,则约束无效。

注意:如果您的模型相对较大,即需要大量时间来求解,那么您需要小心使用 big-M-type 公式。特别是,您希望M 尽可能小,同时仍然强制执行上述约束的逻辑。

【讨论】:

  • 谢谢,我知道这些方法,但我想尽可能少地使用约束。你知道是否有办法计算索引 p 使得 X[p,r]=0?
  • sum {p in P} (1 - X[p,r]) 怎么样?
  • big-M 公式的另一个警告是,根据 M 的大小以及求解器和数字公差的更精细细节,您最终可能会得到结果,例如x=0x*M &gt;= 1。有关此示例,请参阅我的 recent answer on another post
  • @user9272398:顺便说一句,我们正在努力推出Stack Exchange site for Operations Research,欢迎提出此类问题。如果您有兴趣,请查看并考虑“提交”。
  • 如果您使用的是 CPLEX、Gurobi 或 Xpress,并且您的约束是线性的,那么您可以编写 s.t. a1 {r in R, p in P}: X[p,r] = 0 ==&gt; [your constraint expression],它被解释为“X[p,r] 等于 0 意味着 [您的约束表达式] ”或等效地“如果 X[p,r] 等于 0 则 [你的约束表达式]”。此定义将产生这样的效果:您的约束将仅对 p 和 r 强制执行,使得 X[p,r] 在解决方案中等于 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多