在Pyomo中更新飞行中的ConstraintList

时间:2017-03-06 14:44:09

标签: python optimization decomposition pyomo

我正在编写一个benders decomp。 python中的python算法。我的问题就像你在下面的步骤1中看到的那样,我需要找到一种方法来更新添加的约束,而不是删除并向子问题constraintList添加新约束。

有没有优雅的方式?

这样的东西

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

s.Cut_Defn [1] .pop

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

???

Icedkk

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.")

1 个答案:

答案 0 :(得分:0)

您可以构建可以在以后使用Expression对象或可变Param更新的约束。可变Param允许您更新系数或rhs,而Expression允许您更新约束的子表达式。例如:

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

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