【问题标题】:Linearization of if-then constraintif-then 约束的线性化
【发布时间】:2021-10-21 05:37:24
【问题描述】:

我正在尝试线性化这种形式的约束: 如果 a == b 那么 c = 1 其中 a 和 b 是正整数,c 是二进制变量。 我正在寻找这样的解决方案 https://math.stackexchange.com/questions/2792360/how-to-linearize-if-then-constraint 在这种情况下不起作用。 感谢任何可以帮助我的人。

【问题讨论】:

  • c = 1 if a==b else 0?或者更简单,c = int(a==b)
  • @not_speshal 不能这样做。我将约束插入到 Pyomo 上,我需要一个精确的数学线性公式
  • 我不清楚为什么其他解决方案不适用于您的情况。你能解释为什么不吗?您是否尝试过,还是只是因为相反的框架而看起来不对?
  • @TMBailey Pyomo 要求约束表达式返回未嵌套的表达式对象。返回带有嵌套表达式 (a==b) 的表达式无法编译。此外,编程中常用的 if 不符合线性表达式的条件...尝试将其视为一种阶跃函数,其中您有一定的 x 阈值,其中 y 值发生变化,它显然是非线性的。跨度>
  • @Unziello 您应该在问题中包含该评论。了解 为什么 在这种情况下它不起作用会更有帮助。在您的问题中包含所有相关信息,因为人们可能会错过评论中提供的信息

标签: python optimization linear-programming pyomo linearization


【解决方案1】:

含义

 a = b => c = 1

 (a,b: integer variables, c: a binary variable)

可以重新表述为:

 c = 0 => a >= b + 1 
          or
          a <= b - 1

(使用 a,b 是整数)。 “或”需要一个额外的二进制变量。所以我们可以这样写:

 a >= b + 1 - M δ - M c
 a <= b - 1 + M (1-δ) + M c
 δ ∈ {0,1}

这里M 是一个足够大的常数(要谨慎选择)。

【讨论】:

  • 不错。 pyomo 似乎希望约束中的变量都出现在不等式的同一侧,但这很容易做到。
  • 不,Pyomo 不需要。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多