如何在pyomo中声明非线性目标函数?约束的有效方式?

时间:2018-11-23 15:33:53

标签: python constraints nonlinear-optimization pyomo

我试图在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%,并且计算机挂起。

1 个答案:

答案 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.Imodel.J是Pyomo Set组件或Python列表。