如何修复不完全符号组织网络中平衡/非平衡三元组计算的代码错误
解决不完全符号网络的结构平衡分析问题
问题根源
你用itertools.combinations生成了所有节点的三元组组合,但其中很多组合并不是完整的三角形(三个节点两两之间没有全部相连),比如包含Organization 5的某些三元组,当代码尝试访问不存在的边时就会触发KeyError。
修改方案
1. 只筛选网络中实际存在的完整三角形
NetworkX提供了直接获取图中所有三角形的方法,替换原来的三元组生成代码:
import itertools import networkx as nx import matplotlib.pyplot as plt # 保留原有的图构建代码 G = nx.Graph() G.add_edge('Organization 1','Organization 2',color='g', sign='+') G.add_edge('Organization 2','Organization 3',color='r', sign='-') G.add_edge('Organization 3','Organization 4',color='r', sign='-') G.add_edge('Organization 4','Organization 1',color='r', sign='-') G.add_edge('Organization 2','Organization 4',color='r', sign='-') G.add_edge('Organization 1','Organization 3',color='g', sign='+') G.add_edge('Organization 5','Organization 4',color='g', sign='+') G.add_edge('Organization 2','Organization 4',color='g', sign='+') G.add_edge('Organization 5','Organization 3',color='r', sign='-') # 替换三元组生成逻辑:仅获取实际存在的完整三角形(3-clique) triangular_relations2009 = [] for clique in nx.enumerate_all_cliques(G): if len(clique) == 3: # 对三角形节点排序,避免重复统计同一组节点的不同排列 sorted_clique = sorted(clique) if sorted_clique not in triangular_relations2009: triangular_relations2009.append(sorted_clique)
2. 优化符号获取函数(增加容错性)
即使已经筛选了完整三角形,也可以给函数增加边存在性检查,避免意外错误:
def get_signs_of_triangles_list(triangles_list, graph): all_signs = [] for tri in triangles_list: u, v, w = tri # 双重保障:确认三条边都存在 if graph.has_edge(u, v) and graph.has_edge(u, w) and graph.has_edge(v, w): signs = [ graph[u][v]['sign'], graph[u][w]['sign'], graph[v][w]['sign'] ] all_signs.append(signs) return all_signs
3. 运行计数函数
保留你原来的count_unstable_triangles函数,直接调用即可:
def count_unstable_triangles(all_signs): number_of_stable_triangles = 0 number_of_unstable_triangles = 0 for signs in all_signs: plus_count = signs.count('+') if plus_count == 3 or plus_count == 1: number_of_stable_triangles += 1 else: number_of_unstable_triangles += 1 total = number_of_stable_triangles + number_of_unstable_triangles print(f"在{total}个三元组中,稳定三元组数量:{number_of_stable_triangles}") print(f"在{total}个三元组中,非稳定三元组数量:{number_of_unstable_triangles}") return number_of_unstable_triangles, number_of_stable_triangles # 执行完整流程 all_signs_in_network = get_signs_of_triangles_list(triangular_relations2009, G) count_unstable_triangles(all_signs_in_network)
额外说明
如果需要统计所有存在至少两条边的三元组(而非仅完整三角形),需要重新定义平衡/非平衡规则(传统结构平衡理论仅针对完整三角形)。可在获取三元组后检查每条边的存在性,对缺失边做特殊标记,再调整计数逻辑。
内容的提问来源于stack exchange,提问作者Oscar Fernando CV
相关产品推荐
相关产品推荐

