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

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

题目要求介绍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文算法测试用的数据集为空手道俱乐部,其中空手道俱乐部的数据集可通过这个链接进行下载•http://vlado.fmf.uni-lj.si/pub/networks/data/Ucinet/UciData.htm#zachary

摘要

本文旨在解决复杂网络中任意子节点之间的网络最短距离问题。首先介绍了复杂网络的概念和特点,包括小世界特性、无标度特性等。然后以空手道俱乐部网络为例,展示了如何将邻接矩阵转换为邻接表,并绘制网络图。接着设计了模块化的程序框架,采用状态压缩动态规划 + Dijkstra算法来计算任意m个节点之间的最短距离。最后给出了m=2,3,4,5,>5时的计算结果,并以直方图形式可视化。结果表明,在空手道俱乐部网络中,大多数节点之间的最短距离分布在一个中等范围内,说明大多数成员之间的社交关系维持在一个不亲不疏的状态。总体来说,本文提出了一种有效的方法来分析复杂网络中节点之间的最短距离分布,为研究复杂网络的拓扑结构提供了参考。

背景介绍

复杂网络(Complex Networks)是一种描述系统中元素间复杂连接关系的网络结构,其特点在于节点数量庞大、连接关系复杂。复杂网络的研究涉及多个学科领域,包括物理、数学、统计、计算机科学、社会学、生态学等。

复杂网络可概括为以下的部分:

  • 网络结构与演化机制:复杂网络的结构具有小世界特性和无标度特性,其演化机制包括随机连接、偏好连接、自组织临界等。
  • 网络拓扑性质与统计特性:复杂网络具有高聚类系数、短平均路径长度等拓扑性质,节点度分布呈现幂律分布等统计特性。
  • 网络动力学行为:复杂网络中的节点和连接关系会影响网络的动力学行为,如传染病传播、信息传播、社会动态等。
  • 网络中心性与节点重要性:复杂网络中的节点重要性可以用网络中心性指标来描述,如度中心性、介数中心性等。

在本例中,我们着重于利用程序设计的图搜索算法,来实现对空手道俱乐部的34个人构成的复杂人际关系网络进行处理,通过用计算机进行模拟,在此基础上,可以分析出空手道俱乐部的人际关系

实验数据

初步给定的空手道俱乐部数据集中,是一个邻接矩阵的形式

有权网络

在这里插入图片描述

无权网络

在这里插入图片描述

可以看到,数据集中有非常多的0(黄色部分),这说明这个邻接矩阵是一个稀疏矩阵,因此,如果要提高程序运行的性能,需要把这个矩阵转换成邻接表进行处理

首先将txt文件中的数字转换成python程序的二维list
在这里插入图片描述

然后将处理好的二维list,转换成邻接表并写入到csv文件中

在这里插入图片描述

最终得到目标的数据集(部分),这个数据集就是后面程序直接进行处理的数据集

在这里插入图片描述

在这里插入图片描述

最后将这个csv文件的数据,变成一个网络图片,就能得到空手道俱乐部的人际网络

程序流程及系统设计

程序模块化构建

class Solution(object):#初始化参数def __init__(self,m=0,NumberOfNode=34,NumberOfEdge=156) -> None:pass#邻接矩阵转换def AdjMatrix_to_AdjList(matrix,Csv_filename):pass#图搜索算法def dijkstra(self, s) -> None:pass#核心算法def solution(self):pass#保存结果def save(self):pass#画出网状图def draw_network(self):pass#画出直方图def draw_bar(self):pass
#测试部分
if __name__=='__main__':pass

程序设计的具体细节

参数初始化

在这里插入图片描述

堆优化的dijstra算法

在这里插入图片描述

核心函数

函数的核心思想是状态压缩动态规划,通过枚举所有可能的m个节点的组合,计算每个组合的最短路径长度。Dijkstra算法用于辅助计算连接每个状态的最小距离。

在这里插入图片描述

初始化
  • 使用numpy库生成一个包含所有节点的数组vertex。
  • 使用combinations函数枚举所有可能的m个节点的组合。
  • 初始化状态压缩DP数组self.dp,用于记录从每个节点出发,连接m个节点的最小距离。
状态压缩动态规划
  • 对每个节点组合,初始化DP数组,将所有状态设为无穷大。
  • 对于每个节点,将其连接到自身的状态设为0。
  • 使用状态压缩动态规划,更新DP数组,计算从每个节点出发,连接m个节点的最小距离。
Dijkstra算法
  • 对于每个状态,使用Dijkstra算法计算连接该状态下的m个节点的最小距离,并更新DP数组。
  • Dijkstra算法通过优先队列实现,每次选择距离最小的节点进行扩展。
结果统计
  • 统计所有节点组合的最短路径长度,并保存到results列表中。
  • 对每个节点组合,找到最小路径长度和耗时。
输出结果
  • results 列表包含了所有节点组合的最短路径长度
计算流程图

在这里插入图片描述

程序计算结果

X轴表示任意m的节点的最短路径的长度,Y轴表示任意m的节点的最短路径的长度出现的频数

4.1 m取值为2时,程序运行结果

有权网络

在这里插入图片描述

无权网络

在这里插入图片描述

4.2 m取值为3时,程序运行结果

有权网络

在这里插入图片描述

无权网络:

在这里插入图片描述

4.3 m取值为4时,程序运行结果

有权网络:

在这里插入图片描述

无权网络:

在这里插入图片描述

4.4 m取值为5时,程序运行结果

有权网络:

在这里插入图片描述

无权网络:

在这里插入图片描述

4.5 m >=5时,程序运行结果

有权网络:

在这里插入图片描述

无权网络

在这里插入图片描述

实验结论与分析

无权网络的权重分布只有0和1,很难看出分布规律。

有权网络的数据呈现出接近正态分布的形态,峰值集中在中间部分,然后向两侧逐渐减少,将最短路径长度映射到空手道俱乐部成员的人际网络关系中,我们可以得出结论:在空手道俱乐部中,社交关系非常亲密与非常疏远的成员是占少数的,大多数成员的社交关系都是维持在一个不亲不疏的状态中

附录

太长了不想看?👿,那就算了,下面是全部的代码,自己参悟吧😊😊

import numpy
import heapq
from collections import *
import csv
from itertools import combinations
import time
import matplotlib.pyplot as plt
import networkx as nx
class Solution(object):def __init__(self,m=0,NumberOfNode=34,NumberOfEdge=156) -> None:self.NumberOfNode = NumberOfNode  self.NumberOfEdge = NumberOfEdge  self.m = m  self.MaxNumberOfNode = self.NumberOfNode + 1  self.MaxNumberOfEdge = (self.NumberOfEdge + 1) * 2  self.dp = numpy.zeros((self.MaxNumberOfNode, 2**10+1), dtype=int)  self.infinity = 2 ** 24  self.p = numpy.zeros(self.MaxNumberOfNode, dtype=int)  self.AdjacencyList = {}  self.PriorityQueue = []  self.results=[]for i in range(1, self.MaxNumberOfNode):self.AdjacencyList[i] = {}Data = namedtuple('Data', 'source, target, weight')for edge in map(Data._make, csv.reader(open("无权网络.csv", encoding='utf-8'))):self.AdjacencyList[int(edge.source)][int(edge.target)] = int(edge.weight)self.AdjacencyList[int(edge.target)][int(edge.source)] = int(edge.weight)def txt_to_list(file_path):with open(file_path, 'r',encoding='utf-8') as file:lines=file.readlines()result=[list(map(int, line.split())) for line in lines]return resultdef AdjMatrix_to_AdjList(matrix,Csv_filename="空手道俱乐部.csv"):with open(Csv_filename, 'w', newline='',encoding='utf-8') as file:writer=csv.writer(file)writer.writerow(['source','target','weight'])for u in range(len(matrix)):for v in range(len(matrix)):if matrix[u][v]!=0:writer.writerow([u+1,v+1,matrix[u][v]])print(f"邻接矩阵已保存为CSV文件:{Csv_filename}")def dijkstra(self, s) -> None:vis = dict((key, False) for key in self.AdjacencyList)  while len(self.PriorityQueue) > 0:u, _ = heapq.heappop(self.PriorityQueue)  if vis[u] == True:continuevis[u] = Truefor v in self.AdjacencyList[u]:new_dis = self.dp[u][s] + self.AdjacencyList[u][v]if self.dp[v][s] > new_dis:self.dp[v][s] = new_disheapq.heappush(self.PriorityQueue, [v, new_dis])def solution(self):vertex = numpy.arange(1, self.MaxNumberOfNode, 1)for tp in combinations(vertex, self.m):for i in range(1, self.m + 1):self.p[i] = tp[i - 1]for i in range(0, self.MaxNumberOfNode):for j in range(0, 2**10+1):self.dp[i][j] = self.infinityfor i in range(1, self.m + 1):self.dp[self.p[i]][1 << (i - 1)] = 0start = time.time()for s in range(1, 1 << self.m):for i in range(1, self.NumberOfNode + 1):subs = s & (s - 1)while subs != 0:self.dp[i][s] = min(self.dp[i][s], self.dp[i][subs] + self.dp[i][s ^ subs])subs = s & (subs - 1)if self.dp[i][s] != self.infinity:heapq.heappush(self.PriorityQueue, [i, self.dp[i][s]])self.dijkstra(s)end = time.time()result = self.infinityfor i in range(1, self.m + 1):result = min(result, self.dp[self.p[i]][(1 << self.m) - 1])temp = ''for i in range(1, self.m + 1):if self.p[i]!=0:temp += str(self.p[i])+' , 'temp=temp[:-2]self.results.append((temp, result, end - start))def save(self):csvfilepath = 'csv结果/任意节点'+str(self.m)+'.csv'headers = ['节点组合', '最短路径距离', '耗时']with open(csvfilepath, 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow(headers)writer.writerows(self.results)def draw_network(self):list1=[]with open("有权网络.csv",'r',encoding='utf-8') as file:reader=csv.reader(file)list1=[list(map(int,row)) for row in reader]graph=nx.Graph()for i in range(len(list1)):graph.add_edge(list1[i][0],list1[i][1],weight=list1[i][2])pos = nx.spring_layout(graph)nx.draw_networkx_nodes(graph, pos)nx.draw_networkx_labels(graph, pos)nx.draw_networkx_edges(graph, pos, edge_color="black", width=1)edge_labels = nx.get_edge_attributes(graph, "weight")nx.draw_networkx_edge_labels(graph, pos, edge_labels=edge_labels)nx.draw(graph, with_labels=True)plt.savefig('图片结果/'+'空手道俱乐部.png',dpi=720)plt.show()def draw_bar(self):file_path = '有权网络csv结果/任意节点'+str(self.m)+'.csv'shortest_path=[]shortest_path_count={}with open(file_path,'r',encoding='utf-8') as file:reader=csv.reader(file)shortest_path=[row[1] for row in reader]shortest_path=list(map(int,shortest_path[1:]))for length in shortest_path:shortest_path_count[length]=shortest_path_count.get(length,0)+1plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False  plt.figure(figsize=(10, 6))  plt.title('有权网络任意节点的最短路径长度')  plt.xlabel('最短路径长度')  plt.ylabel('频数')  plt.grid(axis='y', linestyle='--', alpha=0.7)  plt.tight_layout()  plt.bar(list(shortest_path_count.keys()), list(shortest_path_count.values()), alpha=0.7, color='blue')bar_file_path = '有权网络图片结果/任意节点'+str(self.m)+'直方图.png'plt.savefig(bar_file_path,dpi=1080)
if __name__=='__main__':for i in range(2,7):s=Solution(m=i)   s.draw_bar()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Godot学习笔记2——GDScript变量与函数

目录 一、代码编写界面 二、变量 三、函数 四、变量的类型 Godot使用的编程语言是GDS&#xff0c;语法上与python有些类似。 一、代码编写界面 在新建的Godot项目中&#xff0c;点击“创建根节点”中的“其他节点”&#xff0c;选择“Node”。 点击场景界面右上角的绿色…

前端Vue组件化实践:自定义发送短信验证码弹框组件

在前端开发中&#xff0c;随着业务逻辑的日益复杂和交互需求的不断增长&#xff0c;传统的整体式开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些问题&#xff0c;组件化开发成为了一种流行的解决方案。通过组件化&#xff0c;我们可以将复杂的系统拆分成多个独立的…

LeetCode 860柠檬水找零(贪心算法)/406根据身高重建队列(贪心算法)

1. 柠檬水找零 思路分析 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账单是20&am…

使用Java -jar运行就jar包时报异常:org.yaml.snakeyaml.error.YAMLException异常

Java运行就 .jar包时出现的 YAMLException 异常 我在本地环境测试时&#xff0c;使用 java -jar 命令运行 Java 可执行 .jar 包时&#xff0c;遇到了 org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 异常&#xff1b;这…

关于集成网络变压器的RJ45网口

集成网络变压器的RJ45网口是一种将网络变压器与RJ45接口集成在一起的网络连接解决方案。这种集成设计具有多项优势&#xff0c;使其在现代网络设备中得到广泛应用。 优势与特点 1. **空间节省**&#xff1a;集成设计减少了组件数量和连接线缆长度&#xff0c;有助于节省设备内…

激光打印机原理学习

文章目录 参考资料印刷四分色模式激光打印机的工作原理 参考资料 全网最清晰的打印机工作原理 印刷四分色模式 四分色&#xff08;Quadtone&#xff09;印刷是一种特殊的印刷技术&#xff0c;它使用四种不同的颜色通道来再现彩色图像。这四种标准颜色是&#xff1a;C青色&am…

Linux云计算 |【第一阶段】ENGINEER-DAY5

主要内容&#xff1a; SELinux、系统故障修复、HTTPD/FTP服务搭建、防火墙策略管理、服务管理 一、SELinux安全制度 SELinux&#xff08;Security-Enhanced Linux&#xff09;&#xff0c;美国NSA国家安全局主导开发&#xff0c;一套增强Linux系统安全的强制访问控制体系&…

【Android】 dp与sp,加冕为王

目录 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 基础知识&#xff1a; ppi pt DPI 的定义和重要性 Android 中的 DPI 级别 px dp&#xff08;Density Independent Pixels&#xff09; sp&#xff08;Scale-independent Pixels&#xff09; 安卓的dp/dip、sp 虚拟…

在 PostgreSQL 中怎样进行数据库的容量规划?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中怎样进行数据库的容量规划&#xff1f;一、为什么容量规划如此重要&#xff1f;二、影…

JDBC技术

JDBC提供了在Java程序中直接访问数据库的功能 JDBC连接数据库之前必须先装载特定厂商提供的数据库驱动程序&#xff08;Driver&#xff09;&#xff0c;通过JDBC的API访问数据库。有了JDBC技术&#xff0c;就不必为访问Mysql数据库专门写一个程序&#xff0c;为访问Oracle又专门…

Vue项目实现单点登录(SSO)的逻辑和基本流程

项目集群如果一个一个登录会非常麻烦&#xff0c;尤其是一些大企业或者多项目使用一套体系数据的环境中&#xff0c;这时候登录中心也就应用而生&#xff0c; 今天简单说一下vue sso的实现思路&#xff0c;vue项目实现单点登录&#xff08;SSO&#xff09;通常涉及以下几个步骤…

LabVIEW和Alicat Scientific质量流量计实现精确流量控制

在现代工业自动化和科研实验中&#xff0c;精确的气体流量控制至关重要。这里将介绍一个使用LabVIEW与Alicat Scientific公司的质量流量计实现流量控制的项目。项目采用Alicat Scientific的质量流量计&#xff08;型号&#xff1a;M-200SCCM-D&#xff09;&#xff0c;通过LabV…

R绘制Venn图及其变换

我自己在用R做各种分析时有不少需要反复用到的基础功能&#xff0c;比如一些简单的统计呀&#xff0c;画一些简单的图等等&#xff0c;虽说具体实现的代码也不麻烦&#xff0c;但还是不太想每次用的时候去找之前的代码。 索性将常用的各种函数整成了一个包&#xff1a;pcutils…

[CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍

目录 1、协议数据单元(PDU)传输2、通信模块的案例2.1、SDU、 PCI & PDU2.2、通信模块构成2.3、从数据传输的角度看Communication2.4、Communication中的接口 在前面 《关于接口的一些说明》 以及  《Memory软件模块接口说明》 中&#xff0c;简要介绍了CP_AUTOSAR分层…

ByteBuf释放注意的问题

Bytebuf需要释放&#xff0c;否则可能导致OOM。 如果bytebbuf传递到了head或tail&#xff0c;不需要我们关心。 在head和tail里&#xff08;head实现了outhandler、inhander。tail实现了inhander&#xff09;&#xff0c;底层自动调用了bytebuf.release。 其他情况需要我们手动…

MySQL(终章)视图, 用户管理, C连接MySQL.

目录 1.视图; 2.用户管理; 1.视图: 1.1 概念和基本操作: 视图本质就是表结构, 虚拟表. 视图和基表数据的改变都会相互影响. 创建视图语法: create view 视图名 as select语句&#xff1b; 修改视图: update set ; 删除视图: drop view 视图名&#xff1b; 1. 2 视图使用规则: …

减分兔搜题-12123学法减分20题目及答案 #媒体#职场发展

对于即将参加驾驶考试的朋友来说&#xff0c;掌握一些经典题目和答案至关重要。今天&#xff0c;我就为大家带来了这样一份干货——20道驾驶考试题目和答案&#xff0c;助你轻松应对考试&#xff01;这些题目不仅包括了考试中常考的内容&#xff0c;还有针对难点和重点的详细解…

ETL数据同步之DataX,附赠一套DataX通用模板

今天跟大家分享数据同步datax的模板&#xff0c;小伙伴们简单直接借鉴使用。 还记得上一篇关于大数据DS调度工具的分享嘛&#xff1f; 主流大数据调度工具DolphinScheduler之数据ETL流程-CSDN博客 里面的核心就是采用了DATAX的数据同步原理。 一&#xff0c;什么是DataX D…

基于luckysheet实现在线电子表格和Excel在线预览

概述 本文基于luckysheet实现在线的电子表格&#xff0c;并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …

华为云.VPC关联概念与对等连接实践

云计算.华为云 VPC关联概念与对等连接实践 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/q…