【问题标题】:cvxopt.glpk.ilp documentation on Integer & Binary set keys关于整数和二进制集键的 cvxopt.glpk.ilp 文档
【发布时间】:2018-07-27 20:06:15
【问题描述】:

我有一个混合整数编程问题(使用列生成来削减库存),我已经在 AMPL 中解决了这个问题,并且我使用 cvxopt 将其移植到了 Python。 CVXOPT“op”不提供我需要的二进制变量选项,所以我用 GLPK 扩展它以使用“ILP”。我得到了 ilp 状态 =“LP 松弛是根本不可行的”,我知道这是不正确的,因为之前的 AMPL 解决方案。所以我知道我的配置不正确。我试图通过玩stackoverflow问题The integer linear programming(ILP) function in CVXOPT returns non integers中的示例来了解整数“I”和二进制“B”键的使用。

我的问题是,I&B 键之间有什么区别,例如:

stat, sol1 = glpk.ilp(W, G.T, h, I=set([0, 1]))
stat, sol2 = glpk.ilp(W, G.T, h, I={0,1})
stat, sol3 = glpk.ilp(W, G.T, h)

有以下 3 种不同的解决方案:(print(soli.T)

  1. [ 0.00e+00 0.00e+00 5.00e-01 5.00e-01 5.00e-01 -0.00e+00 ... ]

  2. [ 0.00e+00 0.00e+00 5.00e-01 5.00e-01 5.00e-01 -0.00e+00 ... ]

  3. [ 5.00e-01 5.00e-01 5.00e-01 5.00e-01 5.00e-01 -0.00e+00 ... ]

我看过help(ilp),但它只是说 I&B 是整数和二进制变量的索引集(我理解),但它没有描述如果你同时使用两者会发生什么 (I&B) ,或者它们重叠,或者其中一个是空集,或者没有定义。我会认为上面的sol1=sol2,因为它只是定义集合 I 的两种不同方法。我假设 sol3 是所有整数并且没有二进制变量,因为 B 未定义,但我没有'没有任何文件可以确认。

【问题讨论】:

  • (1) 为什么要看bin/int vars的定义?如果放松是不可行的,那么任何离散约束的一 (2) cvxopt 都是开源的。如果需要,您可以查看代码。 (3) 您的示例打印不完整,仅显示 2 个不同的结果,这不足为奇。(4) 如果没有变量是离散的(I 或 B),它显然是连续的。为什么结果 3 令人惊讶?查看the code (5) 我有点怀疑 cvxopt 是构建列生成模型的正确库。
  • 我不是在寻找 bin/int vars 的定义。我正在寻找有关 ILP 函数的详细文档,特别是“I”和“B”参数的声明。该示例是“不完整的”,因为我使用之前发布的问题 39384909 中的代码作为示例。您引用的 glpk.c 源代码很有用,因为我应该能够从该源代码中回答有关“I”和“B”参数的问题,因此感谢您。我不知道 ILP 包含 simplex() 并且会返回浮点结果。我以为它只会返回整数答案。

标签: python glpk cvxopt mixed-integer-programming


【解决方案1】:

我找到了我的问题的答案,因此我将其发布在这里,以防其他人对 cvxopt.glpk.ilp() 和 I & B 参数有相同的问题。

A: (status, x) = ilp(c, G, h, A, b)
x 都是浮点数

B: (status, x) = ilp(c, G, h, A, b, I)
x 是浮点数和整数的混合,具体取决于集合 I 中的索引

C (status, x) = ilp(c, G, h, A, b, I, B) x 是浮点数、整数和二进制数的混合,具体取决于 集合 I 和集合 B 中的索引。
如果集合 I 和 Boverlap,则 B 取代。

问题 #33785396 提供了一个我将在此处重复使用的示例。来自于: https://en.wikipedia.org/wiki/Integer_programming#Example

For A: the result is                           [1.8,  2.8]  all float
For B: with I={0}, the result is               [2.0,  2.67] int & float
For B: with I={1}, the result is               [2.67, 2.0]  float & int
For B: with I={0,1}, the result is             [2.0,  2.0]  int & int
For C: with I={0,1} and B={0}, the result is   [1.0,  2.0]  binary & int
For C: with I={0,1} and B={0,1}, the result is [0.0,  1.0]  binary & binary

【讨论】:

  • 非常感谢!如果我例如有一个像x0+x1 <= 1 这样的不等式,并且x0, x1 都是二进制的,你知道从你的研究中x0+x1 是否有能力达到2,如果两者都是“真”,或者这会被限制为1(甚至是模数)到 0)?
  • 换句话说,我想通过使用不等式来防止 2 个二进制文件为真,而使用 1 位寄存器的幼稚实现将无法做到这一点。我想我可以做一个最小的工作示例,但以防万一你知道。再次感谢
  • 没关系,glpk.ilp 强迫我提供 G, h, A, b 作为双打所以在该范围内不会发生溢出
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2012-03-18
相关资源
最近更新 更多