Pyomo如何定义与变量相关联的参数?附实操代码示例
问题根因
Pyomo中Param是固定常量,定义时就需要确定取值,无法和优化变量Var建立动态关联,你当前的写法会触发参数初始化错误。你需要把依赖变量的hd改为变量或表达式实现关联逻辑。
可行方案
方案1:将hd定义为整数变量(需要对hd加约束时推荐)
把hd从Param改为整数类型的Var,保留你写的约束规则即可,代码修改如下:
from pyomo.environ import * # Create a new model M = ConcreteModel() M.N = RangeSet(1,96) M.p_real = Param(M.N,within=NonNegativeReals,initialize=2.0) M.p_max = Param(M.N,within=NonNegativeReals,initialize=5.0) M.p_dynamic = Var(M.N,within=NonNegativeReals) d_base=[5, 8, 10, 9, 9, 5, 9, 4, 5, 4, 8, 3, 5, 2, 3, 3, 3, 1, 0, 19, 4, 0, 0, 0, 0, 1, 3, 5, 8, 14, 26, 28, 70, 84, 130, 145, 144, 71, 77, 76, 84, 60, 100, 55, 46, 42, 52, 50, 53, 44, 77, 55, 66, 39, 63, 67, 71, 41, 62, 62, 67, 47, 64, 62, 69, 50, 75, 47, 43, 26, 38, 36, 42, 36, 52, 24, 24, 22, 23, 14, 16, 7, 11, 5, 7, 7, 4, 4, 4, 0, 1, 0, 1, 0, 1, 0] # 把hd从Param改为整数Var M.hd = Var(M.N, within=Integers) def hd_rule(M,i): return M.hd[i] == floor(d_base[i-1] * (M.p_max[i] - M.p_dynamic[i]) / (M.p_max[i] - M.p_real[i] ) ) M.hd_rule = Constraint(M.N,rule=hd_rule)
注意:floor是非线性函数,需要使用支持整数非线性规划的求解器(如BARON、Couenne)求解。如果要适配线性求解器,可以把floor约束拆成两个线性不等式:
设
expr = d_base[i-1] * (M.p_max[i] - M.p_dynamic[i]) / (M.p_max[i] - M.p_real[i]),则floor等价于:M.hd[i] <= exprM.hd[i] >= expr - 1 + 1e-6(加小epsilon避免取等时的边界问题)
方案2:将hd定义为Expression(无需对hd加约束时推荐)
如果不需要给hd单独加上下限约束,用Expression更高效,不需要额外引入变量和约束,后续其他公式里可以直接调用M.hd[i]:
# 替换原来的Param和约束定义部分 def hd_expr_rule(M,i): return floor(d_base[i-1] * (M.p_max[i] - M.p_dynamic[i]) / (M.p_max[i] - M.p_real[i] ) ) M.hd = Expression(M.N, rule=hd_expr_rule)
求解完成后,调用value(M.hd[i])即可获取对应取值,和调用参数的用法基本一致。
后续依赖hd的参数处理
如果之前定义了依赖hd的其他参数,需要同步把这些参数也改为Var或者Expression,因为优化过程中hd的取值是随变量动态变化的,不能作为固定参数的输入。
内容的提问来源于stack exchange,提问作者zhangxinying
相关产品推荐
相关产品推荐

