我在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)
  • [ 0.00e+00 0.00e+00 5.00e-01 5.00e-01 5.00e-01 -0.00e+00 ... ]
  • [ 0.00e+00 0.00e+00 5.00e-01 5.00e-01 5.00e-01 -0.00e+00 ... ]
  • [ 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未被定义,但是我没有任何文档可以确认。

    最佳答案

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

    A :(状态x)= ilp(c,G,h,A,b)
    x是所有浮点数

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

    C(状态x)= ilp(c,G,h,A,b,I,B)
    x是float,integer和binary的混合,具体取决于
    集合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
    

    关于python - 有关整数和二进制设置键的cvxopt.glpk.ilp文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48834817/

    10-10 17:53