Pyomo中如何构造所有索引集合R[i]的并集
Pyomo 索引集合并集的正确实现方式
你收到警告大概率是手动for循环操作的时机不对,或者直接在Pyomo模型约束上下文内修改集合导致的,推荐以下两种实现方案:
- 方案1:使用Pyomo内置的
UnionSet(最推荐)
这是Pyomo专门为多集合求并集设计的工具,会自动关联所有源R[i]的内容,后续修改R[i]时并集也会自动同步,不需要手动维护内容一致性:
model.H = pym.RangeSet(1,model.h) model.R = pym.Set(model.H) # 完成所有R[i]赋值后添加下行 model.all_R_union = pym.UnionSet(model.R[i] for i in model.H)
- 方案2:显式计算并集初始化
如果使用的Pyomo版本较旧不支持UnionSet,或者你需要固定并集的内容(不随后续R[i]修改而变化),可以在所有R[i]完成赋值后,先计算所有元素再初始化集合:
# 完成所有R[i]赋值后执行 union_elems = set() for i in model.H: # 注意要取R[i]的value属性获取实际赋值的元素 union_elems.update(model.R[i].value) model.all_R_union = pym.Set(initialize=union_elems)
注意:两种方案都需要确保执行并集定义操作时,所有
R[i]已经完成赋值,否则会出现空集或者元素缺失的问题。
内容的提问来源于stack exchange,提问作者Renato De Leone
相关产品推荐
相关产品推荐

