复杂网络的任意子节点的网络最短距离

基于Dijkstra算法实现

复杂网络的任意m个子节点间的网络最短距离

大概思路

调用dijkstra函数算出m个子节点中全部任意两个节点的最短距离,然后互相组合相加,就变成了相当于经过m个子节点的路径长度。在所有情况中选择最短路径即可。

m = 2、3、5的情况数

e555ca04598c489582719e323315c14f.png

代码实现

第一步——问AI

1abca353639147f9a06a3ca043ad09a0.png

第二步——调试代码

import networkx as nx
import matplotlib.pyplot as plt
import itertools
from collections import defaultdict

# 创建空手道俱乐部图
G = nx.karate_club_graph()

# 计算所有节点对之间的最短路径
shortest_paths = dict(nx.all_pairs_dijkstra_path_length(G))

# 初始化子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()

# 定义子图的标题
titles = ["2个子节点", "3个子节点", "4个子节点", "5个子节点"]

# 对每个子图,分别计算2到5个节点组合的最短路径长度分布
for idx, m in enumerate(range(2, 6)):
    path_length_counts = defaultdict(int)
    
    # 计算指定节点数的所有节点组合的最短路径长度
    for nodes in itertools.combinations(G.nodes, m):
        min_length = float('inf')
        for perm in itertools.permutations(nodes):
            length = sum(shortest_paths[perm[i]][perm[i + 1]] for i in range(m - 1))
            if length < min_length:
                min_length = length
        path_length_counts[min_length] += 1

    # 准备绘制数据
    lengths = sorted(path_length_counts.keys())
    counts = [path_length_counts[length] for length in lengths]
    
    # 在对应子图绘制条形图
    ax = axes[idx]
    ax.bar(lengths, counts)
    ax.set_xlabel('路径长度')
    ax.set_ylabel('出现次数')
    ax.set_title(titles[idx])

# 调整布局并显示图像
plt.tight_layout()
plt.show()

结果展示:

338a84dd916c4bcca18816322ef9577b.png

有些编码问题,我们调整一下就可以了

改了一下编码,它报错的不支持非utf-8,搞成中文有点麻烦

写英文了

8fba490c297042819dbcfb9333ca0b3e.png

 

数据集

直接使用networkx库里面的空手套俱乐部

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值