使用NetworkX生成无自环无向图的代码问题及修正咨询
问题分析与修正方案
现有代码的核心错误
- 错误地将
new_node(当前节点数,整数)传入random.choice(),这是无效操作,应该从已存在的节点集合中选取目标节点 - 错误使用边的数量
new_edge作为连接目标,新增节点需要连接到已有节点而非边的计数 - 存在未定义变量
node,会导致代码运行报错 - 未实现“每次新增节点时连接2个随机已有节点”的逻辑,反而错误连接到边计数,导致边数增长不符合预期
修正后的代码
import random import networkx as nx def generateGraph(n): if n < 2: raise ValueError("节点数n不能小于2") G = nx.Graph() # 初始化2个节点和1条边 G.add_nodes_from([0, 1]) G.add_edge(0, 1) while G.number_of_nodes() < n: new_node = G.number_of_nodes() G.add_node(new_node) # 从已有节点中随机选取2个不同的节点 existing_nodes = list(G.nodes())[:-1] # 排除刚添加的新节点 target_nodes = random.sample(existing_nodes, 2) # 连接新节点到这两个目标节点 G.add_edge(new_node, target_nodes[0]) G.add_edge(new_node, target_nodes[1]) return G
修正说明
- 增加节点数合法性校验,避免n<2的非法输入
- 使用
add_nodes_from简化初始化节点的代码 - 每次迭代时,从**已存在的节点集合(排除刚添加的新节点)**中用
random.sample选取2个不同的节点,保证无自环且连接到不同节点 - 每次新增节点时添加2条边,符合预期的边数增长规律:n节点对应
2n-3条边(比如n=3时3条,n=4时5条,n=5时7条)
内容的提问来源于stack exchange,提问作者Keithx
相关产品推荐
相关产品推荐

