我有一个 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的默认值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()