基于Networkx定义Pyomo集合的问题及约束修正求助
问题:Networkx前驱节点结合Pyomo优化模型的集合定义与约束错误
我正在用Networkx处理一个包含12个节点的有向图,需要在Pyomo优化模型中利用Networkx的前驱节点方法。目前模型运行无报错,但求解结果完全不符合预期,推测问题出在PAIRS集合的定义以及约束c3的使用上。
我尝试了两种实现方式,均存在问题:
- 方式1:通过Networkx的前驱方法直接定义PAIRS集合,模型能正常运行但结果不符合预期
- 方式2:手动定义前驱关系集合S,使用
ConstraintList添加约束时触发错误:KeyError: "Index '(12, 0)' is not valid for indexed component 'x'"
相关代码片段
import networkx as nx from pyomo.environ import * # 构建有向图(替换为你的实际图结构) G = nx.DiGraph() G.add_nodes_from(range(12)) G.add_edges_from([(0,1), (1,2), (2,3), (3,4), (4,5), (5,6), (6,7), (7,8), (8,9), (9,10), (10,11), (11,0)]) # Pyomo模型初始化 model = ConcreteModel() # 定义边变量x(索引为图中的边) model.x = Var(G.edges(), domain=Binary) # 方式1:通过Networkx前驱方法定义PAIRS集合 model.PAIRS = Set(initialize=[(v, u) for v in G.nodes() for u in G.predecessors(v)]) # 约束c3(替换为你的实际约束逻辑) def c3_rule(model, v, u): return model.x[u, v] <= model.some_var[v] # 示例约束表达式 model.c3 = Constraint(model.PAIRS, rule=c3_rule) # 方式2:手动定义前驱集合S(此处可能存在错误节点对) S = [(12, 0), (0, 11), ...] # 示例手动集合 model.c3 = ConstraintList() for v, u in S: model.c3.add(model.x[u, v] <= model.some_var[v])
期望的正确求解结果
- 变量
x的取值需满足有向图的路径约束,所有节点的入度/出度符合预设规则 - 目标函数最优值应为XX(替换为你的具体预期值)
恳请帮忙定位并修正问题。
内容的提问来源于stack exchange,提问作者A.Omidi
相关产品推荐
相关产品推荐

