在 Pyomo 中用 max 和 min 编写约束

问题描述 投票:0回答:1

我必须从下图中用 4 个约束在 pyomo 中编写 Pavg 和 H_ad 约束,

# 1. Average Pressure

def Avg_pressure(model, I, J, T, S, r):
    return model.Pavg[I, J, T, S] == max(model.A1p[r] * model.Pin[I, J, T, S] + model.A2p[r] * model.Pout[I, J, T, S] + model.Bp[r] for r in model.R1_2)
model.constraint52 = Constraint(model.Pipe, model.T, model.S, model.R1_2, rule=Avg_pressure)

model.pprint()

上述约束给出了异常错误,

PyomoException:无法转换非常量 Pyomo 表达式 (0.54886306Pin[2,3,1,1] + 0.44727615Pout[2,3,1,1] + 3.02961114e-05 < 0.62043087Pin[2,3,1, 1] + 0.31263309Pout[2,3,1,1] + 0.00039507888) 为布尔值。 此错误通常是由于在变量中使用 Var、unit 或 mutable Param 引起的 布尔上下文,例如“if”语句,或检查容器时 成员资格或平等。例如, m.x = Var() 如果 m.x >= 1: 经过 和 m.y = Var() 如果 m.y 在 [m.x, m.y] 中: 经过 都会导致这个异常。

由于我无法正确编写最大和最小部分,目前我提到如下约束,

# 1. Average Pressure

def Avg_pressure(model, I, J, T, S, r):
    return model.Pavg[I, J, T, S] >= model.A1p[r] * model.Pin[I, J, T, S] + model.A2p[r] * model.Pout[I, J, T, S] + model.Bp[r]
model.constraint51 = Constraint(model.Pipe, model.T, model.S, model.R1_2, rule=Avg_pressure)
# 5. H_ad_and_Pressure out

def H_ad_and_Pressure(model, I, J, T, S, r):
    return model.h_ad[I, J, T, S] <= model.Ah[I, J, r] * model.Pout[I, J, T, S] + model.Bh[I, J, r]
model.constraint55 = Constraint(model.C, model.T, model.S, model.R1_2, rule=H_ad_and_Pressure)

集合、参数和变量都定义良好。只是在最大和最小之间挣扎。即使您考虑具有相同类型的最大值和最小值的不同变量的不同约束也没关系。

optimization mathematical-optimization linear-programming pyomo stochastic
1个回答
0
投票

没有足够的上下文来给出太多答案,但我希望它类似于下面的内容。

p_avg
似乎没有在任何地方使用,所以我只是将其填充到目标中以最小化它。还有其他未定义的下标等,但这是基本思想。然后,如果需要,您可以继续在其他表达式中使用
p_avg
,如果这些表达式的“意义”是最小化它们,您可以将其从目标中删除。

# capture average
def cap_avg(model, i, j, k, r):
    return model.p_avg[i, j, k] >= model.p_in[i, j, k] * model.A[r]
model.c1 = Constraint(model.I, model.J, model.K, model.R, rule=cap_avg)

# use objective to minimize average
model.obj = Objective(expr=sum(model.p_avg[i, j, k] for i in model.I, for j in model.J, for k in model.K))
© www.soinside.com 2019 - 2024. All rights reserved.