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

这篇博客介绍了一种在复杂网络中寻找最短路径的算法,使用Python的网络库networkx。首先,通过读取Karate俱乐部数据集的邻接矩阵,然后对每个子网节点进行宽度优先搜索(BFS),记录每个节点的父节点,形成路径数组。接下来,通过裁剪路径,找出以初始搜索节点为起点的最短路径。算法时间复杂度为O((n*m)^2),空间复杂度为O(n^2)。博客最后展示了具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文图的同构算法忘记说环境了。要执行成功算法需要进行以下设置。
工具是学习用的pycharm
步骤:
1.File->Setting
点击设置
2.找到如图所示的位置,点击+号
在这里插入图片描述
3.搜索对应的包下载即可。
在这里插入图片描述
这次是算法设计大作业的,复杂网络中m结点组成的子网的最短的一条路径。原题目是这样的。
在这里插入图片描述

思路
初始定义一个大小为结点数目的一维数组,这个一维数组下标即为对应的结点,即下标0对应结点1,同理也是如此。数据存的是该结点的父节点的下标,比如结点1的父节点是结点12,则数组对应的是arr[0]=11.一次类推,最后得到一条待裁剪的路径链。这次数组我定义为初始路径数组。
步骤:
对每个子网结点宽搜一遍。每宽搜到对应的结点则入队并且对初始路径数组进行更改,并且路径数++,每宽搜一层对应一条路径。对应的结束条件:子网结点都在宽搜队列。
最后能得到完整的初始路径数组。
对这一路径数组进行裁剪,即寻找m子网结点到初始宽搜的基点的各条路径,同二维数组存储,最终得到裁剪后的路径也就是以初始宽搜的基点为准的路径。
接着计算结点直接的路径距离,与最短路径比较,若小于最短路径则替代最短路径。
对m结点的每个结点都如此操作,最终得到最短路径。
理论知识:
从基点开始宽搜,这个基点到其它点的路径是最短的。
贪心,求局部最优解进而退出整体最优解。
所有我个人认为这个思路是没问题的
程序由python代码编写。当然我也不知道你们看不看得懂。

import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
import numpy as np
# 获取Karate俱乐部数据的邻接表,以csv文件存储
columns = ['Source', 'Target']
data = pd.read_csv('Karate_club.csv', names=columns, header=None)
# 调用networkx画图
graph = nx.Graph()
data_len = len(data)
# 给graph中添加边,即用户关系
for i in range(data_len):
    graph.add_edge(data.iloc[i]['Source'], data.iloc[i]['Target'])
# 输出每个节点的度
print("每个节点的度:",graph.degree())
# 调用nx.draw()方法绘制图片
nx.draw(graph, with_labels=True)
# 保存图片
# plt.savefig('./karate_club.png')
# 展示图片
plt.show()
n =len(graph.degree())
print("结点个数:",n)
graphic=[
   [0,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0],
   [1,0,1,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0],
   [1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0],
   [1,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
   [1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
   [1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
   [1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值