在PYOMO中即时更新约束清单



我正在编码弯曲器分解。Pyomo中的Python算法。我的问题是您可以在第1步中看到的那样,我需要找到一种方法来以某种方式更新添加的约束,而不是删除和添加新约束列表。

有什么优雅的方式吗?

之类的东西

s.cut_defn [1] .update(s.x == m.x.value)

s.cut_defn [1] .pop

s.cut_defn.add(s.x == m.x.value)

???

iedkk

ps:在步骤0,我在子问题限制清单中添加了约束。在步骤1中,我实际上想在步骤0中更新添加的约束,但是我不能这样做,因此我删除了第一个添加的约束,然后添加了下一个约束,这是代码的有点糟糕的方法。

import sys
from pyomo.opt.base import SolverFactory
from pyomo.core import *
import pyomo.environ
import numpy as np
import timeit
# Importing Models
from master import m
from sub import s
# Misc. init.
start = timeit.default_timer()
GAP = float('Inf')
maxit = 5
###################################
# STEP 0: Init.
opt = SolverFactory('glpk')
results_M = opt.solve(m)            # solve master
s.Cut_Defn.add(s.x == m.x.value)    # s.x = m.x.value
results_S = opt.solve(s)            # solve sub
print('i','t','Mx','t','Sx','t','Ma','t','Sy',
          't','Lmda','t','Zup','t','Zdo','t','Gap',
          't','Objective')
#######################################################################
# Benders Loop    
for i in sequence(maxit):
    ###################################
    # STEP 1: Subproblem Solution
    if i == 1:
        pass
    else:
        del s.Cut_Defn[i-1]
        s.Cut_Defn.add(s.x == m.x.value)
        results_S = opt.solve(s)
    ###################################
    # Adding the Master Cut
    Lambda = s.dual[s.Cut_Defn[i]]          # get Lambda from Solver
    m.Cut_Defn.add(s.Obj() + float(Lambda)*(m.x-s.x.value) <= m.a) # add Cut to Master
    ###################################
    # STEP 2: Convergence Checking
    Zup = s.Obj() - s.x.value/4
    Zdo = m.Obj()
    newGAP = Zup - Zdo
    if newGAP > 0.00001:
        GAP = min(GAP, newGAP)
    else:
        print(i,'t',round(m.x.value,1),'t',round(s.x.value,1),'t',round(m.a.value,1),'t',round(s.y.value,1),
                't',round(Lambda,2),'t',round(Zup,1),'t',round(Zdo,1),'t',round(newGAP,2),
                't',round(m.Obj(),5))
        break
    ###################################
    # STEP 3: Re-Solve Masterproblem
    print(i,'t',round(m.x.value,1),'t',round(s.x.value,1),'t',round(m.a.value,1),'t',round(s.y.value,1),
            't',round(Lambda,2),'t',round(Zup,1),'t',round(Zdo,1),'t',round(GAP,2),
            't',round(m.Obj(),5))
    #solve_all_instances(solver_manager, 'cplex', [Instance_M])
    results_M = opt.solve(m)
stop = timeit.default_timer()
print("Benders converged in", round(stop-start,2),"s.")

您可以通过使用表达式对象或可突出参数来构建可以更新的约束。可变的参数允许您更新系数或RHS,而表达式可以更新约束的子表达。示例:

model = ConcreteModel()
model.p = Param(mutable=True)
model.e = Expression()
model.x = Var()
model.c = Constraint(expr=model.e == model.p)
# set the constraint rhs to 1
model.p.value = 1
# set the constraint lhs to x**2
model.e.expr = model.x**2

请注意,您不应使用表达式存储关系表达式(例如==>=<=)。

最新更新