Python pyomo的抽象模型与具体模型?“怎么做?”;选择权[选择权];在寻找最佳解决方案方面有什么不同?

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

我有一个抽象模型和一个具体模型来解决同一个问题,但它们的表现不同。主要是关于变量的初始值和ipopt的公差

  • 当我将变量model.x初始化为10和opt.options[“tol”]=1E-64时: 具体模型可以找到最优解,而抽象模型“求解到可接受的水平”。(但他们找到的解决方案实际上是相同的)

  • 当我将变量model.x初始化为100和opt.options[“tol”]=1E-64时: 具体模型可以找到最佳解决方案,而抽象模型有时“已解决到可接受的水平”,有时“无法加载状态不好的SolverResults对象:错误”

  • 如果我只使用ipopt的默认公差值,无论我如何初始化变量模型,ConcreteModel和AbstractModel都可以找到相同的最佳解决方案。x

  • 所以我想知道opt.options[“tol”]是如何起作用的?为什么在这种情况下,ConcreteModel总是能够找到最优解,而AbstractModel却不能

    变数

    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选项:我将公差线移到了求解线之前,它也给出了“求解到可接受水平”。谢谢你的提示!