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

news2024/11/23 13:41:56

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

题目要求介绍

在这里插入图片描述

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

本文算法测试用的数据集为空手道俱乐部,其中空手道俱乐部的数据集可通过这个链接进行下载•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 result
    def 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:
                continue
            vis[u] = True
            for 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_dis
                    heapq.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.infinity
            for i in range(1, self.m + 1):
                self.dp[self.p[i]][1 << (i - 1)] = 0
            start = 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.infinity
            for 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)+1
        plt.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.coloradmin.cn/o/1936450.html

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

相关文章

最新缺失msvcp140.dll的多种解决方法,有效解决电脑dll问题

msvcp140.dll 是一个关键的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft Visual C 2015 Redistributable 的一部分。它为使用 Microsoft Visual C 编译的应用程序提供了运行时支持&#xff0c;确保这些应用程序能够正常运行。以下是对 msvcp140.dll 的…

SpringMVC源码深度解析(下)

接着上一遍博客《SpringMVC源码深度解析(中)》继续聊。上一篇博客中&#xff0c;返回的是对象的情况下SpringMVC框架会怎么处理&#xff0c;这种情况也是现在用得最多的&#xff0c;因为都是前后端分离。如果返回的是ModelAndView&#xff0c;则是另外的处理逻辑了&#xff0c;…

多显示器,如何快速切换电脑显示模式!

​一般在使用多显示器的情况下,可能我们要根据不同的工作需求来动态调整相适应的Windows显示模式,像扩展模式、复制模式、单显示器等模式。调整相应的模式方法也不止一种,下面一起了解下不同的方法如何快速操作实现! 快捷键法(WIN+P) 同时按下键盘徽标键WIN+P,会弹出个选…

【iOS】内存五大分区

目录 堆&#xff08;Heap&#xff09;是什么五大分区栈区堆区全局/静态区常量区&#xff08;即.rodata&#xff09;代码区&#xff08;.text&#xff09; 函数栈堆和栈的区别和联系 OC语言是C语言的超集&#xff0c;所以先了解C语言的内存模型的内存管理会有很大帮助。C语言的内…

百日筑基第二十四天-23种设计模式-结构型总汇

百日筑基第二十四天-23种设计模式-结构型总汇 前言 设计模式可以说是对于七大设计原则的实现。 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff0c;共…

OpenAI 推出 GPT-4o mini,一种更小、更便宜的人工智能模型

OpenAI 最近推出了新型人工智能模型 GPT-4o mini&#xff0c;以其较小体积和低成本受到关注。这款模型在文本和视觉推理任务上性能优越&#xff0c;且比现有小型模型更快、更经济。GPT-4o mini 已向开发者和消费者发布&#xff0c;企业用户将在下周获得访问权限。 喜好儿网 在…

文章八:并发性能优化技巧

目录 8.1 引言 并发性能优化的重要性 本文的内容结构 8.2 减少锁争用 减少锁争用的方法 使用局部变量和无锁算法的示例 使用局部变量 无锁算法 8.3 无锁算法 无锁算法的基本概念 常用的无锁数据结构和算法示例 无锁队列 无锁栈 8.4 并发性能测试 性能测试工具和…

51.2T 800G 以太网交换机,赋能AI开放生态

IB与以太之争 以太网替代IB趋势明显。据相关报告&#xff1a;2024年TOP500的超算中&#xff0c;采用以太网方案占比48.5%&#xff0c;InfiniBand占比为39.2%&#xff0c;其中排名前6的超算中已有5个使用以太网互联。 开放系统战胜封闭系统仅是时间问题。我们已经看到&#xf…

发现FionaAI:免费体验最新的GPT-4o Mini模型!

你现在可以在FionaAI上免费体验OpenAI刚刚发布的GPT-4o Mini模型&#xff01;作为您在Google Chrome中的ChatGPT驱动助手&#xff0c;FionaAI可以随时随地与您对话&#xff0c;帮助您轻松创作和处理文本。 为什么选择GPT-4o Mini&#xff1f; 最新技术&#xff1a;GPT-4o Mini是…

C++模板进阶和模板链接错误的解决

小编在学习模板进阶之后&#xff0c;觉得模板的内容很有用&#xff0c;所以今天带给大家的内容是模板进阶的所有内容&#xff0c;内容包括模板的使用&#xff0c;模板的特化&#xff0c;模板的全特化&#xff0c;模板的偏特化&#xff0c;模板链接时候会出现的链接错误及解决方…

守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理

一、背景分析 近日&#xff0c;某大熊猫参观基地通报了4位游客在参观时&#xff0c;向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害&#xff0c;已经被该熊猫基地终身禁止再次进入参观。而在此前&#xff0c;另一熊猫…

安全防御:双机热备

目录 一、防火墙的可靠性 1.1 VRRP --- 虚拟路由器冗余技术 1.2 主备的形成场景 1.3 FW1接口故障的切换场景 1.4 HRP --- 华为冗余协议 HRP三种备份方式 1.4 各场景过程分析 1&#xff0c;主备形成场景 2&#xff0c;主备故障切换场景 --- 接口故障 3&#xff0c;主…

深入浅出WebRTC—ALR

ALR&#xff08;Application Limited Region&#xff09;指的是网络传输过程中&#xff0c;由于应用层的限制&#xff08;而非网络拥塞&#xff09;导致带宽未被充分利用的情况。在这种情况下&#xff0c;应用层可能因为处理能力、手动配置或其他因素无法充分利用可用带宽&…

RICHTEK立锜科技 WIFI 7电源参考设计

什么是WIFI 7? WiFi 7&#xff08;Wi-Fi 7&#xff09;是下一代Wi-Fi标准&#xff0c;对应的是IEEE 802.11将发布新的修订标准IEEE 802.11be –极高吞吐量EHT&#xff08;Extremely High Throughput &#xff09;。Wi-Fi 7是在Wi-Fi 6的基础上引入了320MHz带宽、4096-QAM、Mu…

【黑马java基础】Lamda, 方法引用,集合{Collection(List, Set), Map},Stream流

文章目录 JDK8新特性&#xff1a;Lambda表达式认识Lambda表达式Lambda表达式的省略规则 JDK8新特性&#xff1a;方法引用静态方法的引用实例方法的引用特定类型方法的引用构造器的应用 集合➡️Collection单列集合体系Collection的常用方法Collection的遍历方法迭代器增强for循…

Spring框架、02SpringAOP

SpringAOP 日志功能 基本方法 分析代码问题 目前代码存在两个问题 代码耦合性高&#xff1a;业务代码和日志代码耦合在了一起 代码复用性低&#xff1a;日志代码在每个方法都要书写一遍 问题解决方案 使用动态代理&#xff0c;将公共代码抽取出来 JDK动态代理 使用JDK动…

Ubuntu系统SSH免密连接Github配置方法

Ubuntu系统SSH免密连接Github配置方法 一、相关介绍1.1 Ubuntu简介1.2 Git简介1.3 Github简介 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、Git本地环境配置工作4.1 安装Git工具4.2 创建项目目录4.3 …

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件&#xff1a;id_rsa 和 id_rsa.pub 1.2 拷…

网络爬虫入门(学习笔记)

爬取网页源代码 抓取百度首页的HTML源代码&#xff0c;并将其保存到一个名为baidu.html的文件中。打开这个文件&#xff0c;可以看到一个和百度首页一模一样的页面。 from urllib.request import urlopen# 发送请求并获取响应 response urlopen("http://www.baidu.com&q…

windows中使用Jenkins打包,部署vue项目完整操作流程

文章目录 1. 下载和安装2. 使用1. 准备一个 新创建 或者 已有的 Vue项目2. git仓库3. 添加Jenkinsfile文件4. 成功示例 1. 下载和安装 网上有许多安装教程,简单罗列几个 Windows系统下Jenkins安装、配置和使用windows安装jenkins 2. 使用 在Jenkins已经安装的基础上,可以开始下…