You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyomo中如何基于两个不同Set创建决策变量求和约束

问题解决:Pyomo全局总和约束的正确实现

错误原因

你传入model.HYDROGEN和model.BATTERY作为约束的索引集合时,Pyomo会生成两个集合笛卡尔积数量的约束实例,每个实例会向规则函数传入model+HYDROGEN元素+BATTERY元素三个参数,但你的规则函数仅定义了model和i两个参数,因此触发参数不匹配错误。同时这种写法完全偏离你的需求——你需要的是单个全局约束(限制所有决策变量的总和),而非按元素对生成多个约束。

解决方案

1. 修改约束规则函数

移除多余参数,只保留model,因为不需要索引遍历:

def LimitPshFlex_rule(model):
    total = sum(model.BatteryPsh[i] for i in model.BATTERY) + sum(model.HydrogenPsh[i] for i in model.HYDROGEN)
    return total <= FR

2. 创建无索引约束

创建约束时不传入任何集合参数,直接绑定规则函数,Pyomo会生成单个全局约束:

model.LimitPshFlex = Constraint(rule=LimitPshFlex_rule)

完整示例代码

from pyomo.environ import ConcreteModel, Set, Var, Constraint, Objective, minimize, NonNegativeReals

# 定义总和上限参数
FR = 150

# 构建模型
model = ConcreteModel()

# 定义两个独立集合
model.BATTERY = Set(initialize=['BAT_1', 'BAT_2', 'BAT_3'])
model.HYDROGEN = Set(initialize=['HYD_1', 'HYD_2'])

# 定义决策变量
model.BatteryPsh = Var(model.BATTERY, domain=NonNegativeReals, initialize=0)
model.HydrogenPsh = Var(model.HYDROGEN, domain=NonNegativeReals, initialize=0)

# 全局总和约束规则
def LimitPshFlex_rule(model):
    total_flex = sum(model.BatteryPsh[b] for b in model.BATTERY) + sum(model.HydrogenPsh[h] for h in model.HYDROGEN)
    return total_flex <= FR

# 创建约束
model.LimitPshFlex = Constraint(rule=LimitPshFlex_rule)

# 示例目标函数(最大化总输出)
def max_total_rule(model):
    return -(sum(model.BatteryPsh[b] for b in model.BATTERY) + sum(model.HydrogenPsh[h] for h in model.HYDROGEN))
model.MaxTotalOutput = Objective(rule=max_total_rule, sense=minimize)

内容的提问来源于stack exchange,提问作者Casentive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:47:55