我在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/