Изменить ограничения на основе значения переменной в Pyomo

Есть ли способ изменить значения ограничения во время работы решателя?

По сути, у меня есть ограничение, которое зависит от значения переменной. Проблема в том, что ограничение оценивается на основе начального значения переменной, но не обновляется при изменении переменной.

Вот простой пример:

from pyomo.environ import *
from pyomo.opt import SolverFactory
import numpy as np

# Setup
model = ConcreteModel()
model.A = Set(initialize = [0,1,2])
model.B = Set(initialize = [0,1,2])
model.x = Var(model.A, model.B, initialize=0)

# A constraint that I'd like to keep updating, based on the value of x
def changing_constraint_rule(model, a):
    x_values = list((model.x[a, b].value for b in model.B))
    if np.max(x_values) == 0:
        return Constraint.Skip
    else:
        # Not really important what goes here, just as long as it updates the constraint list
        if a == 1 : return sum(model.x[a,b] for b in model.B) == 0
        else:       return sum(model.x[a,b] for b in model.B) == 1
model.changing_constraint = Constraint(model.A, rule = changing_constraint_rule)

# Another constraint that changes the value of x
def bounding_constraint_rule(model, a):
    return sum(model.x[a, b] for b in model.B) == 1
model.bounding_constraint = Constraint(
    model.A,
    rule = bounding_constraint_rule)

# Some objective function
def obj_rule(model):
    return(sum(model.x[a,b] for a in model.A for b in model.B))
model.objective = Objective(rule=obj_rule)

# Results
opt = SolverFactory("glpk")
results = opt.solve(model)
results.write()
model.x.display()

Если я запускаю model.changing_constraint.pprint(), я вижу, что никаких ограничений не было, поскольку начальное значение переменной model.x было установлено на 0.

Если невозможно изменить значения ограничений во время решения, как я могу по-другому сформулировать эту проблему, чтобы достичь того, что я ищу? Я прочитал этот другой пост, но не смог понять его из инструкции.


person Tom Roth    schedule 28.08.2018    source источник


Ответы (1)


Я даю вам тот же ответ на другой вопрос @Gabe:

Любая if-логика, которую вы используете внутри правил, не должна включать значения переменных (если она не основана на начальном значении переменной, и в этом случае вы должны заключить переменную в value () везде, где вы используете ее вне основного выражения что возвращается).

например: model.x[a, b].value должно быть model.x[a, b].value()

Но все же это может не дать вам решения, которое вы ищете.

person oakca    schedule 31.08.2018
comment
увы, думаю, не будет. Все равно спасибо за ответ - person Tom Roth; 01.09.2018