转换为布尔值,用于整数线性编程


11

我想在整数线性程序中表达以下约束:

y={0if x=01if x≠0.

我已经有整型变量,我承诺- 100 ≤ X ≤ 100。如何以适合于整数线性规划求解器的形式表达上述约束?x,y−100≤x≤100

据推测,这将需要引入一些其他变量。我需要添加哪些新变量和约束?可以使用一个新变量完全完成此操作吗?二?

等效地,这是在问如何执行约束

y≠0 if and only if x≠0.

在我已经有暗示的约束的情况下和0 ≤ ÿ ≤ 1。|x|≤1000≤y≤1


(我的目标是修复https://cs.stackexchange.com/a/12118/755中的错误。)


1
你尝试了什么?您是否尝试过通过一些示例来查看是否看到模式?如果是,您是否尝试过猜测然后尝试证明呢?
— 布里卡

1
h!我知道你在那儿做什么了,@ Brika。如果您想看看我尝试了什么,请在这里以及为什么错误的解释。如果您想查看我的下一个尝试,请参阅我的答案。感谢您阅读我的旧问题,如果将来可以改进它们,我很乐意听到您的任何建议!
— DW

这是非常好的。;)
— Brika

Answers:


4

我想我可以用一个额外的二元变量做δ∈{0,1}:

−100y≤x≤100y
0.001y−100.001δ≤x≤−0.001y+100.001(1−δ)

更新资料

假设x是一个连续变量。如果我们限制x被整数值,那么第二个约束可被简化为:

y−101δ≤x≤−y+101(1−δ)


1
我通过一个小程序对它进行了详尽的测试来验证了此正确性。谢谢您的解决方案!
— DW

@ErwinKalvelagen,能否请您使用二进制变量delta来解释您的逻辑,例如,如果y = {a:x> 0,b:x <0},则为更一般的情况。
— 尼克

1
@Nick二进制变量用于为“ OR”构造建模。请参阅此处以回答您的问题。
— Erwin Kalvelagen '16

@ErwinKalvelagen,一个很好的答案,我尝试将您的方法应用于此处的问题cs.stackexchange.com/questions/64794/…。
— 尼克

1
xx

1

0≤x≤NN=100

  1. 0≤z1,z2,z≤1
  2. x−N(1−z1)≤0
  3. −x−Nz1≤−1
  4. −x−N(1−z2)≤0
  5. x−Nz2≤−1
  6. z1+z2−1≤z
  7. z≤z1
  8. z≤z2

z1=1⟺x≤0z2=1⟺x≥0z=z1∧z2


z=1−yx=100y=1z=0z1,z2x−Nz2≤−1x<Nx≤99x=99y=1y=0x−N≤x≤N0≤x≤N

1

t,ut=1x≥0u=1x≤0y=¬(t∧u)

0≤t,u,y≤11+x≤101t≤101+x1−x≤101u≤101−xt+u−1≤1−y1−y≤t1−y≤u

x≤99x≤100x≥−99

@TLW,谢谢您抓住了它!我已经编辑了答案以修复该错误。我用一个小程序对它进行了详尽的测试,我认为它现在应该是正确的。
— DW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.