我有一个混合整数编程问题,(使用列生成减少库存),我已经在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
)
[ 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
是整数而没有二进制变量,因为{{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