【发布时间】:2019-06-21 09:48:11
【问题描述】:
我有一个 AbstractModel 和一个 ConcreteModel 解决同样的问题,但它们的表现不同。主要是关于变量的初始值和ipopt的容差。
当我将变量 model.x 初始化为 10 并且 opt.options["tol"] = 1E-64: ConcreteModel 可以找到最优解,而抽象模型“Solved To Acceptable Level”。 (但他们找到的解决方案其实是一样的)
当我将变量 model.x 初始化为 100 并且 opt.options["tol"] = 1E-64: ConcreteModel 可以找到最佳解决方案,而抽象模型有时“已解决到可接受的水平”,有时“无法加载状态不佳的 SolverResults 对象:错误”。
如果我只使用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()
【问题讨论】: