【问题标题】:AbstractModel VS ConcreteModel of pyomo? how does "opt.options["tol"]" make the difference in finding optimal solution?pyomo 的 AbstractModel VS ConcreteModel? "opt.options["tol"]" 如何在寻找最佳解决方案方面发挥作用?
【发布时间】:2019-06-21 09:48:11
【问题描述】:

我有一个 AbstractModel 和一个 ConcreteModel 解决同样的问题,但它们的表现不同。主要是关于变量的初始值和ipopt的容差。

  1. 当我将变量 model.x 初始化为 10 并且 opt.options["tol"] = 1E-64: ConcreteModel 可以找到最优解,而抽象模型“Solved To Acceptable Level”。 (但他们找到的解决方案其实是一样的)

  2. 当我将变量 model.x 初始化为 100 并且 opt.options["tol"] = 1E-64: ConcreteModel 可以找到最佳解决方案,而抽象模型有时“已解决到可接受的水平”,有时“无法加载状态不佳的 SolverResults 对象:错误”。

  3. 如果我只使用ipopt的默认公差值,无论我如何初始化变量model.x,ConcreteModel和AbstractModel都能找到相同的最优解。

所以我想知道 opt.options["tol"] 有何不同?为什么在这种情况下 ConcreteModel 总是能够找到最佳解决方案,而 AbstractModel 却不能?

变量

model.x = Var(model.Crops, model.Inputs, initialize = 100, within=NonNegativeReals)

解决 AbstractModel 的脚本

instance = model.create_instance(data="AbstractCDFarm.dat")
opt = SolverFactory("ipopt")
opt.options["tol"] = 1E-64
results = opt.solve(instance, tee=True) 
instance.display()

ConcreteModel 的求解脚本

opt = SolverFactory('ipopt')
opt.solve(model, tee=True) 
opt.options["tol"] = 1E-64
results = opt.solve
model.display()

【问题讨论】:

    标签: python pyomo ipopt


    【解决方案1】:

    您为 ConcreteModel 调用了两次求解,看起来您看到的输出是针对默认 Ipopt 容差而不是针对 1E-64 的容差。你为什么设置这么低的容忍度? 1E-64 比机器精度小,因此收敛到的容差非常小。

    【讨论】:

    • 不,我有两个分开的模型。这里我只是展示了两个模型的脚本。公差值到底告诉我们什么?但是你可以看到,在 1E-64 的低容差下,具体模型仍然能够找到最优解。为什么没有抽象模型?
    • 仔细检查您的脚本。在您的问题中发布的 ConcreteModel 脚本中,您在设置求解器容差之前调用 opt.solve(model, tee=True)。因此,您在屏幕上看到的输出具有默认的 Ipopt 容差 1E-8。在此处阅读有关 Ipopt 选项的信息:​​coin-or.org/Ipopt/documentation/…
    • 我在求解线之前移动了公差线,它也给出了“解决到可接受的水平”。感谢您的提示!
    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 2022-11-11
    • 2012-04-23
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多