如何在Python中使用cvxopt与cplex或gurobi求解器?

3

我有一个非常大的线性规划问题(超过10,000个方程和20,000个变量)。优化问题甚至包含在循环中,需要多次求解。因此,我想使用稀疏矩阵和高效的求解器来进行优化。我知道cvxopt可以使用商业求解器如Cplex和Gurobi,但我需要许可证吗?我该如何在cvxopt中调用Cplex?

当我使用以下代码:

solvers.lp(f, Ain, Bin, Aeq, Beq, solver='gurobi')

solvers.lp(f, Ain, Bin, Aeq, Beq, solver='cplex')

问题无法被解决(显示为infeasible)。我认为这是因为我没有包含许可证。

我是一名学生,拥有免费的Cplex许可证,但不知道如何在Python cvxopt中包含它。

以下是我的代码:


while(1): 
# some code before
    f=matrix(OPT['c1M'].T)
    Ain=sparse_to_spmatrix(OPT['AinM'])
    OPT['Xu']=np.reshape(OPT['Xu'],(len(OPT['Xu']),1))
    OPT['Xd'] = np.reshape(OPT['Xd'], (len(OPT['Xd']), 1))
    Bin=matrix(np.vstack([OPT['BinM'], OPT['Xu'], -OPT['Xd']]))
    Aeq=sparse_to_spmatrix(OPT['AeqM'])
    Beq=matrix(OPT['BeqM'])
    sol = solvers.lp(f, Ain, Bin, Aeq, Beq,solver='glpk',options={'glpk':{'msg_lev':'GLP_MSG_OFF'}})
# some code after


为什么要使用cvxopt(主要是学术研究求解器;模型支持较少),而不是使用这些求解器的工具?这样做,您可以控制“易于使用”和“快速”之间的权衡。 - sascha
CPLEX Python API是CPLEX可调用库C API的轻量级封装。 - sascha
@sacha非常感谢!我将查看这些文档。但是从其他答案中我看到Cplex API不支持稀疏矩阵输入。 - Zihang
让我们在聊天中继续这个讨论 - Zihang
有“大多数人”(以及一些玩具演示)和那些以此为生的人;-) - sascha
显示剩余5条评论
1个回答

0

来自https://medium.com/ibm-data-ai/optimization-simply-do-more-with-less-zoo-buses-and-kids-part2-python-java-c-cc04558e49b5的小例子

# Import packages.
import cvxpy as cp
# Define and solve the CVXPY problem.
nbBus40 = cp.Variable(integer=True)
nbBus30 = cp.Variable( integer=True)
cost = 500*nbBus40+400*nbBus30
prob = cp.Problem(cp.Minimize(cost),[40*nbBus40+30*nbBus30>=300,
                                     nbBus40>=0,nbBus30>=0
                                     ])
prob.solve(solver=cp.CPLEX,verbose=True)
# Print result.
print("\nThe minimal cost is", prob.value)
print("number buses 40 seats = ",nbBus40.value)
print("number buses 30 seats = ",nbBus30.value)

这与cvxopt无关(也不是LP问题),没有任何展示。 - sascha
我的问题非常大。如果可以解决这个问题,我很愿意使用cvxpy。然而,你展示的代码是一个非常小而密集的问题。那么如何为大问题设置Cplex呢? - Zihang
@Zihang,你没有展示任何代码,但似乎你知道一切都太慢了。cvxpy 本来就可以与稀疏矩阵进行本地化处理,而且它的规范化(cvxpy = 复杂重构建模工具和 cvxopt = 求解器(+一些建模)之间的核心区别)应该是可以忽略不计的。如果您已经按照问题中所示获得了标准形式,只需尽可能以代数方式发布此内容,例如 constraints.append(A * x == b)。cvxpy 可能会非常缓慢,因为它正在执行许多魔法操作。但是,如果输入是 ready = simple = algebraic = standard-form,则这种情况不会发生(不可观察)。 - sascha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接