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

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

题目要求介绍

在这里插入图片描述

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

本文算法测试用的数据集为空手道俱乐部,其中空手道俱乐部的数据集可通过这个链接进行下载•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”。 点击场景界面右上角的绿色…

Spark SQL----GROUP BY子句

Spark SQL----GROUP BY子句 一、描述二、语法三、参数四、例子 一、描述 GROUP BY子句用于根据一组指定的分组表达式对行进行分组&#xff0c;并根据一个或多个指定的聚合函数计算行组上的聚合。Spark还支持高级聚合&#xff0c;通过GROUPING SETS、CUBE、ROLLUP子句对同一输入…

文字溢出隐藏及鼠标悬停显示效果

在本文中&#xff0c;我们将学习如何使用 CSS 和 JavaScript 实现一个简单的文字溢出隐藏效果&#xff0c;当鼠标悬停在文本上时显示完整内容。 创建 HTML 页面结构 首先&#xff0c;我们需要创建一个包含文本内容的 HTML 页面。 <!DOCTYPE html> <html lang"e…

前端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;有助于节省设备内…

掌控视界:WebKit与CSS视口单位的卓越支持

掌控视界&#xff1a;WebKit与CSS视口单位的卓越支持 在响应式网页设计中&#xff0c;CSS视口单位&#xff08;Viewport Units&#xff09;发挥着至关重要的作用。它们允许开发者根据视口&#xff08;Viewport&#xff09;的大小来设置元素的尺寸和位置&#xff0c;从而实现在…

激光打印机原理学习

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

《管理表格系统》开发心得

浅浅记录一下自己开发两个月的心得&#xff0c;毕竟初入职场 一、写一个自己的脚手架【仅后端】 1.springboot版 2.springcloud版 二、注意写WBS 1要件定义企划构想要求定义要件定义&#xff08;总结功能需求、前端样式需求、非功能性需求、开发环境、部署需求、可行性调查&…

云计算的三种服务模式

云计算的三种主要服务模式分别是基础设施即服务&#xff08;IaaS&#xff09;、平台即服务&#xff08;PaaS&#xff09;和软件即服务&#xff08;SaaS&#xff09;。每种服务模式都提供不同级别的抽象和管理&#xff0c;满足不同的需求和用例。以下是对这三种服务模式的详细介…

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

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

【Rust光年纪】Rust 中常用的数据库客户端库:核心功能与使用场景

探秘 Rust 语言下的多种数据库客户端库&#xff1a;从安装到实际应用 前言 在现代的软件开发中&#xff0c;数据库是不可或缺的一部分。为了与数据库进行交互&#xff0c;开发人员需要使用各种数据库客户端来执行操作、构建查询等。本文将介绍一些用于 Rust 语言的常见数据库…

【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…

AB测试介绍

AB测试是一种类似于对照实验的方法&#xff0c;广泛应用于产品开发、优化和营销等领域&#xff0c;特别是在游戏设计和发行过程中。以下是对AB测试的详细解释&#xff1a; 一、定义与原理 AB测试&#xff0c;又称A/B测试&#xff0c;是一种统计学上的假设检验方法。它将数据分…

R绘制Venn图及其变换

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