在Pyomo中创建if..then类型规则(约束)

在Pyomo中创建if..then类型规则(约束),pyomo,Pyomo,我是Pyomo的新手。我想添加一个if..then。。线性规划问题的类型约束。我有一个抽象模型,这是我想做的一个例子: 如果节点j1接收的水量不足其需水量的一半,则j2和j1之间链路中的最小流量必须设置为j1中的需水量值(A和B为模型变量,d为已知参数) 如果我在使用数据文件实例化模型之后使用这些行,我认为约束将根本无法实现 有人能帮忙吗?谢谢。“If/then”表达式和floor()不是线性的,因此它们不能直接插入到线性程序中。但是,通过设置二进制标志并使用该标志激活和停用约束,可以获得相同的

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

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

如果我在使用数据文件实例化模型之后使用这些行,我认为约束将根本无法实现

有人能帮忙吗?谢谢。

“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)
model.flag=Var(内部=二进制)
def设置标志规则(型号):
#如果[j1]<0.5,则强制设置标志
返回((1-model.flag)*0.5=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),但有一个问题。即使只有这两个约束(并且不使用“规则”约束)与没有这些线时相比,模型给出了不同的解决方案。为什么会发生这种情况?!
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_)
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)