Python 关于Integer&;的cvxopt.glpk.ilp文档;二进制集合键
我有一个混合整数规划问题(通过列生成减少库存),我在AMPL中解决了这个问题,并使用cvxopt将其移植到Python。CVXOPT“op”没有提供我需要的二进制变量选项,所以我用GLPK扩展它以使用“ILP”。我得到了ilp状态=“LP松弛是原始不可行的”,我知道这是不正确的,因为之前的AMPL解决方案。所以我知道我的配置不正确。我试图通过在stackoverflow问题中的示例来理解整数“I”和二进制“B”键的使用 我的问题是,I&B键之间有什么区别,例如:Python 关于Integer&;的cvxopt.glpk.ilp文档;二进制集合键,python,glpk,cvxopt,mixed-integer-programming,Python,Glpk,Cvxopt,Mixed Integer Programming,我有一个混合整数规划问题(通过列生成减少库存),我在AMPL中解决了这个问题,并使用cvxopt将其移植到Python。CVXOPT“op”没有提供我需要的二进制变量选项,所以我用GLPK扩展它以使用“ILP”。我得到了ilp状态=“LP松弛是原始不可行的”,我知道这是不正确的,因为之前的AMPL解决方案。所以我知道我的配置不正确。我试图通过在stackoverflow问题中的示例来理解整数“I”和二进制“B”键的使用 我的问题是,I&B键之间有什么区别,例如: stat, sol1 = glp
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 5.00e-01-0.00e+00…]
我看过了
帮助(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是浮点、整数和二进制的混合体,具体取决于 集合I和集合B中的索引。
如果设置I和Boverlap,则B取代 问题#33785396提供了一个我将在此处重复使用的示例。它来自:
(1) 你为什么要看bin/int变量的定义?如果relax是不可行的,那么任何离散约束也是不可行的,那么cvxopt是开源的。(2)如果需要,你可以查看代码。(3)你的示例没有完全打印出来,只显示了两个不同的结果,这并不奇怪。(4)如果没有离散变量(I或B)它显然是连续的。为什么结果3令人惊讶?请检查(5)我有点怀疑cvxopt是构建列生成模型的正确库。我不是在寻找bin/int变量的定义。我在寻找关于ILP函数的详细文档,特别是“I”和“B”参数的声明。示例是“不完整的”因为我使用的是之前发布的问题39384909中的代码作为示例。您引用的glpk.c源代码非常有用,因为我应该能够回答来自该源代码的关于“I”和“B”参数的问题,所以非常感谢。我不知道ILP包含simplex()并且会返回浮点结果。我认为它只会返回整数答案。非常感谢!如果我有一个像
x0+x1这样的不等式,换句话说,我想通过使用不等式来防止2个二进制文件为真,而使用1位寄存器的简单实现将无法实现。我想我可以做一个简单的工作示例,但JU如果你知道的话。再次感谢大家,glpk.ilp
强制我提供G,h,A,b
作为双倍,因此在该范围内不会发生溢出
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