Python pyomo的抽象模型与具体模型?“怎么做?”;选择权[选择权];在寻找最佳解决方案方面有什么不同?
我有一个抽象模型和一个具体模型来解决同一个问题,但它们的表现不同。主要是关于变量的初始值和ipopt的公差Python pyomo的抽象模型与具体模型?“怎么做?”;选择权[选择权];在寻找最佳解决方案方面有什么不同?,python,pyomo,ipopt,Python,Pyomo,Ipopt,我有一个抽象模型和一个具体模型来解决同一个问题,但它们的表现不同。主要是关于变量的初始值和ipopt的公差 当我将变量model.x初始化为10和opt.options[“tol”]=1E-64时: 具体模型可以找到最优解,而抽象模型“求解到可接受的水平”。(但他们找到的解决方案实际上是相同的) 当我将变量model.x初始化为100和opt.options[“tol”]=1E-64时: 具体模型可以找到最佳解决方案,而抽象模型有时“已解决到可接受的水平”,有时“无法加载状态不好的SolverR
model.x = Var(model.Crops, model.Inputs, initialize = 100, within=NonNegativeReals)
抽象模型的求解脚本
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()
您为ConcreteModel调用了两次solve,您看到的输出似乎是针对默认Ipopt公差的,而不是针对1E-64公差的。你为什么设定这么低的容忍度?1E-64比机器精度小,因此收敛到的公差非常小。不,我有两种不同的型号。这里我只是展示了两个模型的脚本。公差值究竟告诉我们什么?但您可以看到,在1E-64的低公差下,具体模型仍然能够找到最佳解决方案。为什么抽象模型不能呢?仔细检查你的脚本。在问题中发布的ConcreteModel脚本中,在设置解算器公差之前,调用
opt.solve(model,tee=True)
。因此,您在屏幕上看到的具有默认Ipopt公差1E-8的输出。阅读这里的Ipopt选项:我将公差线移到了求解线之前,它也给出了“求解到可接受水平”。谢谢你的提示!