如何用NetworkX创建2n节点环形图,排除对侧及k个邻接节点(k为n的函数)
解决方案:动态排除节点构建单位圆图
核心是把手动枚举的排除条件改成基于n的函数k的动态判断,避免重复代码,同时实现需求:每个节点排除对侧节点及对侧节点两侧各k个节点(k由n决定)。
修改后的代码
import networkx as nx import numpy as np import matplotlib.pyplot as plt def create_circle_graph(n): G = nx.Graph() total_nodes = 2 * n theta = np.linspace(0, 2*np.pi, total_nodes, endpoint=False) # 定义k为n的函数,示例用k = n//3,可按需修改 k = n // 3 for i in range(total_nodes): G.add_node(i, pos=np.array([np.cos(theta[i]), np.sin(theta[i])])) opposite_node = (i + n) % total_nodes for j in range(i+1, total_nodes): # 计算j相对对侧节点的环形偏移量 offset = (j - opposite_node) % total_nodes # 判断j是否属于需排除的节点范围 if not (0 <= offset <= k or (total_nodes - k) <= offset <= total_nodes - 1): G.add_edge(i, j) return G n = 10 G = create_circle_graph(n) pos = nx.get_node_attributes(G, 'pos') nx.draw(G, pos, with_labels=True) plt.show()
关键说明
- k的自定义:你可以根据需求调整k与n的映射关系,比如
k = n//2、k = int(np.sqrt(n))等,只要是n的合法函数即可。 - 环形范围判断:通过模运算处理节点的环形结构,用偏移量范围替代手动枚举,代码更简洁且易于维护。如果j的偏移量落在对侧节点的左右k个区间内(含对侧节点本身),则跳过该边;否则添加边。
- 效率优化:通过
j从i+1开始循环,确保每条边只被添加一次,避免重复操作。
内容的提问来源于stack exchange,提问作者pyridoxal_trigeminus
相关产品推荐
相关产品推荐

