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

如何修复不完全符号组织网络中平衡/非平衡三元组计算的代码错误

解决不完全符号网络的结构平衡分析问题

问题根源

你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 01:15:39