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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:15:47