我有一个AbstractModel和ConcreteModel解决了相同的问题,但是它们的执行方式有所不同。主要是关于变量的初始值和ipopt的容差。
当我将变量model.x初始化为10并选择opt.options [“ tol”] = 1E-64时: ConcreteModel可以找到最佳解决方案,而抽象模型“已解决到可接受水平”。 (但是他们找到的解决方案实际上是相同的)
当我将变量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()
答案 0 :(得分:1)
您为ConcreteModel调用了两次solve,看起来您看到的输出是默认的Ipopt公差,而不是1E-64的公差。为什么要设置这么低的公差? 1E-64小于机器精度,因此收敛到不可能的小公差。