我试图在Pyomo中声明一个非线性目标约束,每次我试图使用Bonmin求解器解决它,我都会得到以下错误:
错误:解算器(asl)返回非零返回代码(322225477)错误:解算器日志:Bonmin 1.8。6使用Cbc 2.9。9和Ipopt 3.12。8分钟:回溯(最近一次呼叫最后一次):
文件“”,第2行,在results=opt中。求解(模型)
文件“C:\Anaconda\lib\site packages\pyomo\opt\base\solvers.py”在solve“Solver(%s)中的第626行没有正常退出。(姓名)
Solver(asl)没有正常退出
我的目标函数定义是:
`def obj_func(model):
global summer
summer = 0
global volumer
volumer = 0
for i in range(0,len(data)):
summer += model.x[i]*data.loc[i,'Predicted.Profit']
for j in range(0,len(data)):
volumer += model.x[j]*data.loc[j,'Predicted.Liters.Sold']
return summer/volumer`
我通过SolverFactory调用解算器,最后,我还想知道创建约束的最有效方法,因为我的约束范围为100,其中一些是非线性的。当我尝试使用这种模式解决问题时,我的内存使用率达到100%,计算机挂起。
您应该检查解算器输出以了解其失败的原因。调用解算器时,可以通过添加tee=True
选项将此输出打印到屏幕上:
SolverFactory('bonmin').solve(model, tee=True)
另外,在声明Pyomo约束和目标时,应该避免使用=
。在构建Pyomo表达式时,它通常会导致显著的性能下降。以下是编写目标函数的推荐方法:
def obj_func(model):
return sum(model.x[i]*data.loc[i,'Predicted.Profit'] for i in model.I)/sum(model.x[j]*data.loc[j,'Predicted.Liters.Sold'] for j in model.J)
model.Objective(rule=_obj_func)
其中模型。I
和型号。J
是PyomoSet
组件或Python列表。