关于Integer& amp;的cvxopt.glpk.ilp文档二进制设置键

时间:2018-02-16 21:03:50

标签: python glpk cvxopt mixed-integer-programming

我有一个混合整数编程问题,(使用列生成减少库存),我已经在AMPL中解决了,并且我使用cvxopt移植到Python。 CVXOPT“op”不提供我需要的二进制变量选项,所以我用GLPK扩展它以使用“ILP”。我得到了ilp状态=“LP放松是原始的不可行的”,我知道这是不正确的,因为先前的AMPL解决方案。所以我知道我的配置不正确。我试图理解使用整数“I”&通过使用stackoverflow问题The integer linear programming(ILP) function in CVXOPT returns non integers中的示例来处理二进制“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 ... ]

  4. 我看过help(ilp),但它只是说I& B是整数和二进制变量的集合(我明白),但它没有描述如果使用会发生什么两者(I& B),或它们重叠,或者一个或另一个是空集,或未定义。我原以为sol1 = sol2,因为它只是两种不同的方式来定义集合I.我假设sol3是整数而没有二进制变量,因为{{1}未定义,但我没有任何文件证实。

1 个答案:

答案 0 :(得分:1)

我找到了问题的答案,所以我在这里发布,以防其他人对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