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

Pyomo两阶段随机规划中风场景参数的正确索引方法

问题解决:Pyomo随机规划中风场景参数的正确定义与索引

核心问题

如何定义风场景参数,为场景集S(10个场景,每个概率0.1)和时间步t(48个时间步)构建(s*t)矩阵,解决报错ERROR: index '0' not valid for indeed component 'wind',并正确索引风场景参数?

错误原因分析

  1. 参数初始化格式错误:你构建的park_data_dict_2是嵌套字典(场景对应时间步字典),但Pyomo的二维Param需要以(场景ID, 时间步ID)为键的扁平字典,嵌套结构会导致索引匹配失败。
  2. 索引顺序颠倒:在GridBalance约束中,你用了m.wind[t, s],但m.wind的定义是(m.SCENARIO, m.HORIZON),正确索引顺序应为m.wind[s, t]。
  3. 概率参数初始化问题:m.prob直接用numpy数组初始化,Pyomo无法正确匹配集合索引,应使用提前构建好的prob_dict。

正确解决方案

步骤1:构建扁平的风场景参数字典

将wind_matrix转换为Pyomo二维Param支持的扁平字典,键为(场景ID, 时间步ID),值为对应风速:

# 构建扁平的风场景字典
wind_data_dict = {}
for s in range(1, m.S + 1):
    for t in range(1, m.N + 1):
        # numpy数组索引从0开始,集合索引从1开始,需做下标转换
        wind_data_dict[(s, t)] = wind_matrix[s-1, t-1]

步骤2:修正风参数定义

用扁平字典初始化m.wind:

# Wind park data
m.wind = pyo.Param(m.SCENARIO, m.HORIZON, initialize=wind_data_dict, domain=pyo.Reals, mutable=True)

步骤3:修正概率参数初始化

使用提前构建的prob_dict替代numpy数组:

# Scenario probability
m.prob = pyo.Param(m.SCENARIO, initialize=prob_dict, domain=pyo.Reals)

步骤4:修正约束中的索引顺序

修改GridBalance约束里的风参数索引:

def GridBalance(m, t, s):
    return m.grid[t] == m.wind[s, t] + m.G_im[t] - m.G_ex[t]

完整修正后的关键代码片段

# 省略其他不变代码...

# Repeat the wind data to a matrix for 10 similar scenario's
wind_matrix = np.tile(park_calc, (10, 1))

# 构建扁平的风场景字典
wind_data_dict = {}
for s in range(1, m.S + 1):
    for t in range(1, m.N + 1):
        wind_data_dict[(s, t)] = wind_matrix[s-1, t-1]

# Price data
m.price = pyo.Param(m.HORIZON, initialize=price_data_dict, domain=pyo.Reals, mutable=True)

# Load data
m.Load = pyo.Param(m.HORIZON, initialize=load_data_dict, domain=pyo.Reals, mutable=True)

# Wind park data
m.wind = pyo.Param(m.SCENARIO, m.HORIZON, initialize=wind_data_dict, domain=pyo.Reals, mutable=True)

# Scenario probability
m.prob = pyo.Param(m.SCENARIO, initialize=prob_dict, domain=pyo.Reals)

# 省略其他不变代码...

def GridBalance(m, t, s):
    return m.grid[t] == m.wind[s, t] + m.G_im[t] - m.G_ex[t]

# 省略其他约束定义...

额外说明

  • Pyomo的多维参数(如二维Param)必须使用扁平的元组键字典初始化,嵌套字典会导致索引解析错误。
  • 集合SCENARIO和HORIZON的索引从1开始,而numpy数组索引从0开始,构建字典时需做s-1和t-1的下标转换。
  • 目标函数中的m.wind[s, t]索引顺序正确,无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:15:35