pyomo的AbstractModel VS ConcreteModel? “ opt.options [” tol“]”如何在找到最佳解决方案方面有所不同?

时间:2019-06-21 09:48:11

标签: python pyomo ipopt

我有一个AbstractModel和ConcreteModel解决了相同的问题,但是它们的执行方式有所不同。主要是关于变量的初始值和ipopt的容差。

  1. 当我将变量model.x初始化为10并选择opt.options [“ tol”] = 1E-64时: ConcreteModel可以找到最佳解决方案,而抽象模型“已解决到可接受水平”。 (但是他们找到的解决方案实际上是相同的)

  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()

1 个答案:

答案 0 :(得分:1)

您为ConcreteModel调用了两次solve,看起来您看到的输出是默认的Ipopt公差,而不是1E-64的公差。为什么要设置这么低的公差? 1E-64小于机器精度,因此收敛到不可能的小公差。