【问题标题】:how to declare a non linear objective function in pyomo? and efficient way of declaring constraints?如何在 pyomo 中声明非线性目标函数?和声明约束的有效方式?
【发布时间】:2019-04-26 05:25:43
【问题描述】:

我试图在 Pyomo 中声明一个非线性目标约束,每次我尝试使用 Bonmin Solver 解决它时,都会收到以下错误:

错误:求解器 (asl) 返回非零返回码 (3221225477) 错误:求解器日志:Bonmin 1.8.6 使用 Cbc 2.9.9 和 Ipopt 3.12.8 bonmin: Traceback(最近一次调用最后一次):

文件“”,第 2 行,在 结果 = opt.solve(模型)

文件“C:\Anaconda\lib\site-packages\pyomo\opt\base\solvers.py”,第 626 行,在求解 "求解器 (%s) 没有正常退出" % self.name)

ApplicationError: 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%,并且我的计算机挂起。

【问题讨论】:

  • 查找日志。它们被写入某个地方。但这听起来就像一个内存错误,然后很难推荐一些不同于解决较小模型或购买 ram 的东西。它看起来像是一般 nlp 求解器通常无法扩展的 ML 任务。
  • “看起来像是一般 nlp 求解器通常无法扩展的 ML 任务”是什么意思?
  • 您是否正在使用大数据进行机器学习?然后不要指望能够使用一般的非线性 opt
  • 不,我有大小为 (178848,40) 的数据集。我能够非常轻松地运行 CBC,但使用 BONMIN 或 COUENNE 失败
  • 这很大,你不应该将线性选择与非线性选择进行比较。

标签: python constraints nonlinear-optimization pyomo


【解决方案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)

其中 model.Imodel.J 是 Pyomo Set 组件或 Python 列表。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多