Python-CVXOPT中的整数线性编程(ILP)函数无法生成正确的结果

Joh*_*ohn 1 binary optimization python-2.7 integer-programming

我正在尝试使用Python 2.7上的CVXOPT库解决https://en.wikipedia.org/wiki/Integer_programming#Example中找到的简单示例;最佳答案是(1,2)或(2,2)。我得到(0.0,0.0)。我在下面的代码中做错了什么?谢谢 !

import numpy as np
import cvxopt
from cvxopt import glpk

c=cvxopt.matrix([0,-1]) #-1 since we're maximising the 2nd variable
G=cvxopt.matrix([[-1,1],[3,2],[2,3],[-1,0],[0,-1]],tc='d')
h=cvxopt.matrix([1,12,12,0,0],tc='d')
(status, x)=glpk.ilp(c,G.T,h,B=set([0,1]))
print status
print x[0],x[1]    #should be (1,2) or (2,2)
print sum(c.T*x)
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 5

您的代码基本上是正确的,但需要进行两个小修改:

  1. c向量也必须是双精度。
  2. 变量x [0]和x [1]应该是整数,而不是二进制。

然后,通过以下方式给出可行的解决方案:

import numpy as np
import cvxopt

c=cvxopt.matrix([0,-1],tc='d')
G=cvxopt.matrix([[-1,1],[3,2],[2,3],[-1,0],[0,-1]],tc='d')
h=cvxopt.matrix([1,12,12,0,0],tc='d')
(status, x)=cvxopt.glpk.ilp(c,G.T,h,I=set([0,1]))
print status
print x[0],x[1] 
print sum(c.T*x)
Run Code Online (Sandbox Code Playgroud)