提问者:小点点

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


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


共1个答案

匿名用户

您应该检查解算器输出以了解其失败的原因。调用解算器时,可以通过添加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列表。