0

我有一个 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的默认值tolerance,无论我如何初始化变量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()

具体模型的求解脚本

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

1 回答 1

1

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

于 2019-06-21T14:16:13.433 回答