在求解器运行时,是否可以更改约束的值?
基本上,我有一个依赖于变量值的约束。问题在于约束是根据变量的初始值评估的,但不会随着变量的更改而更新。
这是一个简单的示例:
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。
如果在求解时无法更改约束值,那么如何才能用不同的方式表述此问题以实现所需的功能?我已经读过this other post,但从说明中看不出来。
答案 0 :(得分:1)
我在@Gabe的另一个问题中给您相同的答案:
您在规则内部使用的任何if-logic都不应包含以下值: 变量(除非它基于变量的初始值, 在任何情况下,无论使用哪种变量,都应将其包装在value()中 在返回的主表达式之外)。
例如:
model.x[a, b].value
应该是model.x[a, b].value()
但是,这仍然可能无法为您提供所需的解决方案。