根据Pyomo中的变量值更改约束

时间:2018-08-28 06:26:50

标签: 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。

如果在求解时无法更改约束值,那么如何才能用不同的方式表述此问题以实现所需的功能?我已经读过this other post,但从说明中看不出来。

1 个答案:

答案 0 :(得分:1)

我在@Gabe的另一个问题中给您相同的答案:

  

您在规则内部使用的任何if-logic都不应包含以下值:   变量(除非它基于变量的初始值,   在任何情况下,无论使用哪种变量,都应将其包装在value()中   在返回的主表达式之外)。

例如: model.x[a, b].value应该是model.x[a, b].value()

但是,这仍然可能无法为您提供所需的解决方案。