我试图在Pyomo中声明非线性目标约束,每次尝试使用Bonmin Solver求解时,都会出现以下错误:
错误:求解器(asl)返回了非零返回码(3221225477) 错误:求解器日志:使用Cbc 2.9.9和Ipopt 3.12.8 bonmin的Bonmin 1.8.6: 追溯(最近一次通话):
文件“”,第2行,在 结果= opt.solve(模型)
文件“ C:\ Anaconda \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py”,行626,在求解中 “ Solver(%s)无法正常退出”%self.name)
ApplicationError:求解器(asl)无法正常退出
#我的Objective函数定义是:
`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%,并且计算机挂起。
答案 0 :(得分:0)
您应该检查求解器的输出以查看失败的原因。您可以通过在调用求解器时添加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)
其中model.I
和model.J
是Pyomo Set
组件或Python列表。