Pyomo两阶段随机规划中风场景参数的正确索引方法
问题解决:Pyomo随机规划中风场景参数的正确定义与索引
核心问题
如何定义风场景参数,为场景集S(10个场景,每个概率0.1)和时间步t(48个时间步)构建(s*t)矩阵,解决报错ERROR: index '0' not valid for indeed component 'wind',并正确索引风场景参数?
错误原因分析
- 参数初始化格式错误:你构建的
park_data_dict_2是嵌套字典(场景对应时间步字典),但Pyomo的二维Param需要以(场景ID, 时间步ID)为键的扁平字典,嵌套结构会导致索引匹配失败。 - 索引顺序颠倒:在
GridBalance约束中,你用了m.wind[t, s],但m.wind的定义是(m.SCENARIO, m.HORIZON),正确索引顺序应为m.wind[s, t]。 - 概率参数初始化问题:
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
相关产品推荐
相关产品推荐

