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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:13:15