如何在Pyomo中实现不同集合的索引映射(类似GAMS map)
Pyomo中实现集合映射的方法
Pyomo完全支持这种集合间的手动映射,你可以通过定义二元派生集合来实现类似GAMS中map(G,N)的功能,具体操作如下:
1. 定义基础集合G和N
先在Pyomo模型中创建两个基础集合:
from pyomo.environ import ConcreteModel, Set model = ConcreteModel() # 定义集合G model.G = Set(initialize=['GD1', 'GD2', 'GD3']) # 定义集合N model.N = Set(initialize=[f'N{i}' for i in range(1, 34)])
2. 创建映射集合(对应GAMS的map(G,N))
直接创建包含指定元素对的二元集合,用来表示G到N的对应关系:
# 定义映射集合map_G_N,元素为(G成员, N成员)的元组 model.map_G_N = Set(within=model.G * model.N, initialize=[ ('GD1', 'N2'), ('GD2', 'N4'), ('GD3', 'N20') ])
这里within=model.G * model.N用来约束集合元素必须是G和N的笛卡尔积成员,保证映射的合法性。
3. 映射的使用方式
你可以遍历映射集合获取对应关系,也能在约束、目标函数中直接引用:
# 遍历映射示例 for g, n in model.map_G_N: print(f"{g} 对应 {n}") # 在变量定义中使用示例(仅为映射对创建变量) model.x = Var(model.map_G_N, domain=NonNegativeReals)
简化替代方案:用字典存储映射
如果只是简单的一对一映射,也可以直接用Python字典实现,操作更直观:
g_to_n_map = { 'GD1': 'N2', 'GD2': 'N4', 'GD3': 'N20' }
后续需要对应关系时,直接通过键值对获取即可,比如g_to_n_map['GD1']就能得到N2。
内容的提问来源于stack exchange,提问作者Simón Sepúlveda García
相关产品推荐
相关产品推荐

