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

时间:2018-09-10 12:44:16

标签: pyomo

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

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

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_)

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

有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

“ 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)