我想最小化一个非常简单的目标函数,但是我在从pythonapi到CPLEX进行正确调用时遇到了一些问题
我研究了如何使用set_quadratic
和set_quadratic_coefficients
here,但这并没有解决我的问题。在
我的目标函数有一组线性变量和一组二次变量
varCoefs = [1]*(numB + numQ)
varLower = [0]*(numB + numQ)
varNames = [(x,"b%s"%x) for x in range( numB )]
varNames += [(len(varNames) + x,"q%s"%x) for x in range( numQ )]
varCoefs += [10]*len(deltas)
varLower += [1]*len(deltas)
varNames += [(len(varNames) + x,"delta%s"%x) for x in range( len(deltas) )]
varCoefs += [0]*len(target.v)
varLower += [0]*len(target.v)
sContent = [(len(varNames) + x,"s%s"%x) for x in range( len(target.v) )]
varNames += sContent
varCoefs += [-1]
varLower += [0]
varNames += [(len(varNames),'mu')]
problem.variables.add(obj = varCoefs, lb = varLower)
problem.variables.set_names(varNames)
# problem.objective.set_quadratic_coefficients([[['s%s' % x], [1]] for x in range( len(target.v) )])
problem.objective.set_quadratic(
[cplex.SparsePair(ind=[sContent[x][0]], val=[1]) for x in range( len(target.v) )]
)
在最后一次调用之前,所有的工作都加上二次项。此时CPLEX抛出以下错误CPLEX Error 1226: Array entry 13919 not ascending.
两次,忽略该命令,Python代码继续。在
我查了一下error,但这对我也没什么帮助。在
我确实试着重写上面的代码,先按名称和下界添加变量。。。然后打电话给set_linear
和{
我错过了什么?在
如果使用可分离的二次目标函数调用
set_quadratic
,则它对应于CPXXcopyqpsep。如果使用不可分离的二次目标函数调用set_quadratic
,则它对应于CPXXcopyquad。我同意您得到的错误不是特别有用,但是如果您知道它在可调用C库中的来源,它就更有意义了。在话虽如此,以下是一个完整的示例,使用您的代码片段,使用一些虚拟输入:
我把它写得很长,而不是用列表理解来让它更清楚一点。LP文件的内容如下:
试验1.lp:
^{pr2}$试验2.lp
试验3.lp
您可以看到test2.lp和test3.lp是相同的(后者覆盖了前者,但做了相同的事情)。希望这能让它更容易理解。一般来说,使用这种打印出LP的技术来解决非常简单的问题,是一种更有用的调试技术。在
您还应该查看CPLEX附带的python示例。例如,qpex1.py、miqpex1.py、indefqpex1.py。在
我解决了这个问题,首先添加二次项,设置它们的系数,然后在单独调用中添加线性项,见下文。在
然而,我仍然想知道为什么它是这样工作的,而不是相反的。在
相关问题 更多 >
编程相关推荐