如何在Python中使用cvxopt的cplex或gurobi解算器?

如何在Python中使用cvxopt的cplex或gurobi解算器?,python,optimization,sparse-matrix,cplex,cvxopt,Python,Optimization,Sparse Matrix,Cplex,Cvxopt,我有一个非常大的线性规划问题(超过10000个方程和20000个变量)。优化问题甚至包含在一个循环中,并多次求解。因此,我希望使用稀疏矩阵和高效的解算器来执行优化。我知道cvxopt可以使用Cplex和Gurobi等商业解决方案,但我需要许可证吗?如何在cvxopt中调用Cplex 当我使用: lp(f,Ain,Bin,Aeq,Beq,solver='gurobi') solver.lp(f、Ain、Bin、Aeq、Beq、solver='cplex') 这个问题无法解决(显示不可行)。我想那是

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

当我使用: lp(f,Ain,Bin,Aeq,Beq,solver='gurobi') solver.lp(f、Ain、Bin、Aeq、Beq、solver='cplex')

这个问题无法解决(显示不可行)。我想那是因为我没有执照

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

这是我的密码


而(一):
#之前的一些代码
f=矩阵(OPT['c1M'].T)
Ain=稀疏到SPU矩阵(OPT['AinM'])
OPT['Xu']=np.重塑(OPT['Xu'],(len(OPT['Xu']),1))
OPT['Xd']=np.重塑(OPT['Xd'],(len(OPT['Xd']),1))
Bin=矩阵(np.vstack([OPT['BinM'],OPT['Xu'],-OPT['Xd']]))
Aeq=稀疏到SPU矩阵(OPT['AeqM'])
Beq=矩阵(OPT['BeqM'])
sol=solvers.lp(f,Ain,Bin,Aeq,Beq,solver='glpk',options={'glpk':{'msg_lev':'GLP_msg_OFF'})
#后面的代码
中的小示例


这并没有显示任何关于cvxopt的内容(它不是LP)。我的问题非常大。如果问题能够解决,我可以使用cvxpy。但是,您显示的代码是一个非常小的问题。如何设置Cplex以解决大问题?@Zihang你没有显示任何代码,但你似乎知道一切都太慢了。cvxpy本机使用稀疏矩阵,其规范化(cvxpy=复杂重新格式化建模工具和cvxopt=解算器(+一些建模)之间的核心区别应该可以忽略不计。如果您已经获得了问题中所示的标准表格,只需将其尽可能地发布,例如
constraints.append(A*x==b)
。cvxpy可以非常慢,是的,因为它有很多魔力。但是,如果ready=simple=algebratic=standard form input,这种情况就不会发生(可以观察到)。为什么要使用cvxopt(主要是学术研究解算器;最低限度的建模支持),而不是使用那些解算器的工具呢?这样做,你可以控制好使用和快速之间的平衡。这对我来说毫无意义。cvxopt可以使用稀疏结构,使用非cvxopt的解算器(例如cplex)会导致复制到这些解算器的内部结构(不同)。这甚至可能发生在基于cvxopt的解算器中。我说的不是cplex studio,而是cplex的python接口。它们不知道稀疏矩阵,但是围绕稀疏使用而构建的。它们是低lvl(一个是高lvl,一个是低lvl),并且(至少在绑定到python时)速度尽可能快(基本上是C绑定!)。不需要离开python解释器@萨沙谢谢你,萨沙。我使用cvxopt的原因是它支持稀疏矩阵输入。矩阵Ain,Bin非常大(~18000*20000),因此不可能使用它们的稠密形式。Cplex和gurobiapi似乎不支持稀疏输入。如果我一个接一个地输入约束条件,我可以预见它会慢得多。你错了,应该更仔细地阅读他们的文档!这个解算器很昂贵,因为。。。并在数千家公司使用。你认为他们会错过像你这样的简单用例吗(他们需要向客户推荐一些开源项目)?
# 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)