【问题标题】:Creating a if..then type rule (constraint) in Pyomo在 Pyomo 中创建 if..then 类型规则(约束)
【发布时间】:2018-09-10 12:44:16
【问题描述】:

我是 Pyomo 的新手。我想为我的线性规划问题添加一个 if..then.. 类型约束。我有一个抽象模型,这是我想做的一个例子:

如果节点 j1 的需水量不到一半,则 j2 和 j1 之间的最小流量必须设置为 j1 中的需求值(A 和 B 是模型变量,d 是已知参数)。

if A(j1)<0.5 then B(j2,j1)>=d(j1)

我在定义模型约束时尝试了以下方法。但由于模型尚未从其数据文件中创建实例,它无法识别 j1 和 j2。

def rule_(model):
    term1=floor(model.A[j1]/0.5)
    return (term1*model.B[j1,j2]>term1*mdoel.demand[j1])
model.rule=Constraint(rule=rule_)

如果我在使用数据文件实例化模型后采取这些行,我认为约束将根本不会实现。

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: pyomo


    【解决方案1】:

    "If/then" 表达式和floor() 不是线性的,所以它们不能直接插入线性程序。但是,您可以通过设置二进制标志并使用它来激活和停用约束来获得相同的效果。请注意,二进制变量也不是线性的,但它们通常由混合整数求解器处理。

    model.flag = Var(within=Binary)
    def set_flag_rule(model):
        # force the flag to be set if A[j1] < 0.5
        return ((1 - model.flag) * 0.5 <= model.A[j1])
    model.set_flag = Constraint(rule=set_flag_rule)
    
    def rule(model):
        # force B[j1, j2] to meet demand if the flag is set
        return (model.B[j1,j2] >= model.flag * model.demand[j1])
    model.rule=Constraint(rule=rule)
    

    【讨论】:

    • 谢谢。你的回答帮助很大。但是,我想指出您提出的强制标志的约束将无法正常工作。 A[j1] 介于 0 和 1 之间,也许我应该在我的问题中提到这一点。我认为最好的方法是使用两个约束来强制标志: def set_flag_rule_one(model): return ((1 - model.flag) * 0.5>= model.A['j1']-0.5) model.set_flag_one = Constraint( rule=set_flag_rule_one) def set_flag_rule_two(model): return (-model.flag * 0.5
    • 但是有一个问题。即使仅使用这两个约束(而不使用“规则”约束),与没有这些行时相比,模型也给出了不同的解决方案。为什么会这样?!
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2017-04-13
    • 2021-10-21
    • 1970-01-01
    • 2021-01-21
    • 2018-05-29
    相关资源
    最近更新 更多