Есть ли способ изменить значения ограничения во время работы решателя?
По сути, у меня есть ограничение, которое зависит от значения переменной. Проблема в том, что ограничение оценивается на основе начального значения переменной, но не обновляется при изменении переменной.
Вот простой пример:
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.
Если невозможно изменить значения ограничений во время решения, как я могу по-другому сформулировать эту проблему, чтобы достичь того, что я ищу? Я прочитал этот другой пост, но не смог понять его из инструкции.