Python cvxopt glpk ilp返回第一个可行的解决方案

时间:2016-07-15 17:42:02

标签: python performance glpk integer-programming cvxopt

我正在使用cvxopt.glpk.ilp来解决一个非常复杂的混合整数程序。我想知道在找到第一个解决方案后是否有办法让程序终止?这需要太长时间,一个可行的解决方案可以很好地用于我的目的。

2 个答案:

答案 0 :(得分:1)

如果您正在使用PuLP(另一个像cvxopt这样的python库)来调用glpk来解决MIP,那么有一个名为maxtime的参数。如果设置maxtime=1那么解算器会做什么,在找到第一个解决方案后立即终止搜索(差不多)。我敢打赌cvxopt应该为glpk提供一些类似的参数,因为PuLP或cvxopt只是这些解算器的包装器。

在Xpress中复制粘贴maxtime参数的描述,这是另一个求解器,但我认为glpk应该有类似的东西,你可能需要找到它。

The maximum time in seconds that the Optimizer will run before it terminates, including the problem setup time and solution time. For MIP problems, this is the total time taken to solve all the nodes.

        0 = No time limit.
        n > 0 = If an integer solution has been found, stop MIP search after n seconds, otherwise continue until an integer solution is finally found.
        n < 0 = Stop in LP or MIP search after -n seconds.

答案 1 :(得分:0)

如果我理解正确,你只对一个可行的解决方案感兴趣吗?

然后将目标函数设置为零就足够了。

以下是整数线性程序的Wikipedia example,以下Python代码返回一个可行的解决方案:

import cvxopt
import cvxopt.glpk

# original program maximizing the second variable
# c=cvxopt.matrix([0,-1],tc='d')  

# modified program returning only a feasible solution
c=cvxopt.matrix([0,0],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',status)
print('variables',x[0],x[1]) 
print('objective',sum(c.T*x))