【Python】基于Python的复杂网络传播动力学及其可视化
目录
- 0 简介
- 1 效果展示——树状网络
- 2 效果展示——小世界网络
- 3 代码
- 3.1 创建网络:树状网络
- 3.2 创建网络:小世界网络
- 3.3 创建网络:随机网络
- 3.4 创建网络:补充说明
- 3.5 在随机位置生成初始感染节点
- 3.6 传染
- 3.7 可视化
- 4 执行
- 4.1 创建小世界网络
- 4.2 创建树状网络
- 4.3 传播模拟可视化
- 5 后记
0 简介
本博文代码的思路是:
1、假设某个(某些)在网络中的节点有某种传染病
2、传染病会根据一定的传播概率传播给与被感染的节点直接相邻(连接)的其他节点
然后,要把这个传播的过程用图片的形式呈现出来,并且记录下每次迭代的感染数据。
顺便一提,本文基于SI模型,如果需要SIR模型还是SIS还是SIER模型的可以自己改进。
1 效果展示——树状网络
照例,先来一波效果展示。
在可视化中红色是已被感染的节点,绿色是健康节点。
这里我先展示一下3个分支5层的树状网络的效果,为了快点模拟完成,设置传染率0.5,初始感染节点为3个。
初始状态(第0次迭代):
第1次迭代:
第2次迭代:
……
第12次迭代:
……
第16次迭代:
……
第22次迭代(最后一个节点还蛮顽强的):
在出图片的同时,终端还输出了每次的感染情况:
2 效果展示——小世界网络
可能一个类型的网络看得还不太清楚,所以我再展示一下小世界网络的传播情况。
这是一个有80个节点的小世界网络,初始邻居数是4,断线重连概率是0.2。设置传染率0.5,初始感染节点为3个。
初始状态(第0次迭代):
第1次迭代:
第2次迭代:
……
第5次迭代:
第6次迭代:
第7次迭代:
第8次迭代:
第9次迭代:
终端输出的每次迭代的感染情况:
3 代码
好的,现在步入正题。
首先调用需要的包。
import numpy as np
import random
import copy
import matplotlib.pyplot as plt
import networkx as nx
然后再写几个生成不同形态的网络的函数。本博文提供了树状网络,小世界网络和随机网络。
3.1 创建网络:树状网络
def tree(Branch,Grade): #树状网络 #Branch为节点向下分支,Grade为层数 #树状网络无需预先创建网络模型(网络关系矩阵)####创建树状网络初始网络模型(网络关系矩阵)(创捷节点)####Nodes = 0for power in range(Grade):Add_Nodes = Branch**powerNodes = Nodes + Add_NodesZero = []a = np.zeros(Nodes,int)for i in range(Nodes):Zero.append(a)Zero = np.array(Zero)###########构建树状网络关系(连结各节点)##############C = copy.deepcopy(Zero)Nodes = len(C)Search = 0Start = 0End = 1for g in range(1,Grade): #因为一层树无意义LastCount = Branch**(g-1) #上一层树有LastCount个节点一这层连结Count = Branch**g #这层树有Count个节点与上一层连结LastNode = range(Start,End) #上一层树在网络关系矩阵的位置Start = End #这层树的起始与终止位置End = Start + CountThisNode = range(Start,End) #这层数在网络关系矩阵的位置Cursor = Startfor n in LastNode:for t in range(Cursor,(Cursor+Branch)): #该层树与上一层树创建双向连结关系,游标Cursor指向该层树C[t][n] = 1C[n][t] = 1Cursor = Cursor + Branch #游标Cursor切换return C
3.2 创建网络:小世界网络
def small_world(Nodes,Neighour,Alpha): #小世界网络 #Nodes为节点数,neighour为初始邻居数,Alhpa为按照watts-strogatz法断线重连概率####创建树状网络初始网络模型(网络关系矩阵)(创捷节点)####Zero = []a = np.zeros(Nodes,int)for i in range(Nodes):Zero.append(a)Zero = np.array(Zero)###########构建网络关系(连结各节点)##############C = copy.deepcopy(Zero)Nodes = len(C) #节点数for a in range(Nodes): #先按正常连接Add_time = 0while Add_time < (Neighour/2):C[a][a-(Add_time+1)] = 1C[a-(Add_time+1)][a] = 1Add_time += 1##################断线重连部分###################for r in range(Nodes): #读取各节点Add_time = 0while Add_time < (Neighour/2):if C[r][r-(Add_time+1)] == 1: #若存在连线,根据所填概率询问是否重连if random.random() < Alpha: #若生成的随机数小于Alpha则重连C[r][r-(Add_time+1)] = 0 #清除现有连线C[r-(Add_time+1)][r] = 0Ob = random.randint(0,(Nodes-1))#新建连结对象while C[r][Ob] == 1 or Ob == r: #两点之间不能存在多个连结,并且新建的连结对象不能是自身Ob = random.randint(0,(Nodes-1))C[r][Ob] = 1 #连结C[Ob][r] = 1Add_time += 1return C #返回一个连结属性矩阵,1为连结,0为无连结
3.3 创建网络:随机网络
def random_network(Nodes,Linker): #随机网络####创建树状网络初始网络模型(网络关系矩阵)(创捷节点)####Zero = []a = np.zeros(Nodes,int)for i in range(Nodes):Zero.append(a)Zero = np.array(Zero)###########构建网络关系(连结各节点)##############C = copy.deepcopy(Zero)Nodes = len(C) #节点数for a in range(Linker):target1 = random.randint(0,Nodes-1) #随机抓取两个节点target2 = random.randint(0,Nodes-1)while C[target1][target2] == 1 or target1 == target2:target1 = random.randint(0,Nodes-1)target2 = random.randint(0,Nodes-1)C[target1][target2] = 1C[target2][target1] = 1return C #返回一个连结属性矩阵,1为连结,0为无连结
3.4 创建网络:补充说明
补充一下,本博文的网络构建采用矩阵的方式构建,我随手print一个10节点邻居为2重连率为0.2的小世界网络:
接下来还有3个关于传播和可视化的函数。
3.5 在随机位置生成初始感染节点
def catastrophe(Nodes,Amount): #设置初始感染者数量,在随机位置生成a = range(Nodes)Infecters = random.sample(a,Amount)InfectStatus = np.zeros(Nodes,int) #感染状态表for i in Infecters:InfectStatus[i] = 1 #感染者登记为1return InfectStatus #返回一个感染者编号列表
3.6 传染
def infect(Connections,InfectStatus,Beta): #传染模型 Connections为节点连结关系属性矩阵,Infecters为初始感染者,Beta为感染率Status1 = copy.deepcopy(InfectStatus) #前一状态感染者列表Status2 = copy.deepcopy(InfectStatus) #当前状态待更新感染者列表C = copy.deepcopy(Connections)Nodes = len(C)if sum(InfectStatus) < Nodes/2: #当感染节点数小于总数的一半时for i in range(len(Status1)): #遍历所有节点,发现感染者if Status1[i] == 1: #若状态为1,即为感染for j in range(len(C[i])):if Status1[j] == 0 and C[i][j] == 1: #若连结关系为1,即为连结if random.random() <= Beta: #若生成的随机数小于Beta则登记为感染Status2[j] = 1 #i感染jelse:for a in range(len(Status1)):if Status1[a] == 0:for b in range(len(C[a])):if Status1[b] == 1 and C[a][b] == 1:if random.random() <= Beta:Status2[a] = 1return Status2 #返回新的感染者列表
3.7 可视化
def show_iteration(Connections,Amount,Beta): #传染病迭代输出模型 #Connections为网络关系矩阵,Amount为初始(0时期)感染者数量C = copy.deepcopy(Connections)Nodes = len(C)InfecterStatus = catastrophe(Nodes,Amount) #根据设定的初始感染数,在随机位置生成感染者g = nx.Graph() #新建画布for n in range(Nodes): #在画布上设置节点g.add_node(n)for ed in range(Nodes): #在画布上设置边(连结关系)for lin in range(ed+1,Nodes):if C[ed][lin] == 1:g.add_edge(ed,lin)pos =nx.kamada_kawai_layout(g) #kamada-kawai路径长度成本函数计算Status = {}times = 0while sum(InfecterStatus) <= Nodes: #当感染数大于等于节点数时停止迭代# plt.imshow(InfecterStatus)# plt.pause(3)#帧数for s in range(len(InfecterStatus)): #把感染状态写入字典SI = InfecterStatus[s]Status[s] = SIcolors = []for c in g: #分配各节点颜色表示感染状态sta = Status[c]if sta == 1:clr = 'r'if sta == 0 :clr = 'g'colors.append(clr)nodesize = []for ns in g:de = ((sum(C[ns])*10)+50) #节点大小(节点度数越大,节点越大)nodesize.append(de)plt.figure(figsize=(12, 8))nx.draw_networkx_nodes(g , pos=pos , with_labels=True , node_color=colors , node_size=nodesize , alpha=0.6)nx.draw_networkx_edges(g , pos=pos , with_labels=True , width=0.3 , alpha=0.3)print(f'迭代第 {times} 次 ---- 感染者数量:{sum(InfecterStatus)} ---- 占比:{(sum(InfecterStatus)/Nodes)}')plt.show()if sum(InfecterStatus) == Nodes:Nodes = Nodes - 1InfecterStatus = infect(C,InfecterStatus,Beta) #传染模型times += 1print('---------- 迭代完成 ----------')
4 执行
怕有的小伙伴光看上面了不会执行,所以在这边特地说明一下执行部分。
随缘说明,我想到啥说啥,其实也不是很难,根据我以下的说明举一反三很容易。
4.1 创建小世界网络
生成节点数为20,初始邻居数为4,重连率为0.2的小世界网络并打印出来
代码如下:
C = small_world(20,4,0.2)
print(C)
结果如下:
4.2 创建树状网络
生成4个分支,3层的树状网络并打印出来
代码如下:
C = tree(4,3)
print(C)
结果如下:
4.3 传播模拟可视化
以节点数100邻居数4重连率0.2的小世界网络为例进行传染病传播模拟。设置初始感染节点10,传染率0.5。
代码如下:
C = small_world(100,4,0.2) #生成网络矩阵
show_iteration(C,10,0.5) #传播模拟
开始运行会跳出一幅图,这是初始状态(第0次迭代)网络的展示。
把上面这幅图关掉,会出现第二幅图,这是第1次迭代网络的展示。同时在终端还会打印出当前以前的传染情况。
依次类推。当全部节点感染的时候,就停止运行。
后话:如果需要连贯地显示可以用imshow动态显示(无需手动关闭上一张图片),具体的调用方法可以自行百度。
5 后记
动态视频可以参考这篇文献中的附录A(建议用网页打开):
Looking into mobility in the Covid-19 ‘eye of the storm’: Simulating virus spread and urban resilience in the Wuhan city region travel flow network
如果可以,也希望大家多多引用。
-----------------------分割线(以下是乞讨内容)-----------------------
【Python】基于Python的复杂网络传播动力学及其可视化相关推荐
- 网络传播动力学_通过简单的规则传播动力
网络传播动力学 When a single drop of paint is dropped on a surface the amount of space that the drop will c ...
- python基于模型的预测概率和标签信息可视化ROC曲线、编写自定义函数计算约登值、寻找最佳阈值(threshold、cutoff)、可视化ROC曲线并在曲线中标记最佳阈值及其数值标签
python基于模型的预测概率和标签信息可视化ROC曲线.编写自定义函数计算约登值.寻找最佳阈值(threshold.cutoff).可视化ROC曲线并在曲线中标记最佳阈值及其数值标签 目录
- 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!
摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...
- python基于Python的资产管理系统毕业设计-附源码201117
摘 要 现代企业管理越来越强调利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用.安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本.资产管理系统为企业提供 ...
- Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- Python基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
转载地址:https://www.cnblogs.com/clarke/p/5752527.html 1.写在前面 抛转引玉,仅供参考 2.开发环境 win7 64位 JetBrains PyChar ...
- Python 基于python实现ADSL宽带帐号,密码的获取及宽带拨号
基于python实现ADSL宽带帐号的获取及宽带拨号 基本思想: 1.研究上网方式(实验环境为电信网线接入式ADSL,拨号方式PPPOE) 2.研究宽带帐号和密码生成规律(实验环境,宽带帐号为 ...
- python基于php+MySQL的网络精品课程教学平台
随着我国教育模式的改革和网络技术发展,人们希望通过多元化的方式来进行精品课程的教学.通过网络和现实两种模式相结合的教学方式是当前的一种主体教学方式,它可以让学生在课上学习完之后通过网络还可以进行多次复 ...
最新文章
- 实心和空心哪个抗弯能力强_空心楼板技术优势及施工工艺
- linux sed 批量替换多个文件中的字符串
- 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
- (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6
- 需求分析阶段各种图的功能
- 查看硬件配置的Linux命令,LINUX 查看硬件配置命令的教程
- swift - 关于title问题
- 简单使用jave获取上传视频时长--java后端
- VB2010实例(1)_字符大小写转换
- MATLAB线性卷积圆周卷积FFT程序
- 2017马哥python高级实战班培训推荐
- linux中安装搜狗拼音输入法
- Linux清理磁盘空间常用命令
- 主键外键超键候选键的联系和区别_主键、外键、超键、候选键
- 软件版本GA、RC、beta等含义
- (上)苹果有开源,但又怎样呢?
- 5分钟学废携程出品配置中心阿波罗的原理与搭建
- Cronlog日志分割器
- qlv视频转换器免费版_腾讯视频素材下载和转换教程
- 如何使用固定资产管理系统进行固定资产盘点?
热门文章
- 如何学习一个新的计算机概念(协议等),如snmp? 上官网学习【官网集合】
- 电脑桌面图标变成蓝色的怎么办
- 表格求积和计算机有出入,Word表格 求和,求积
- [游戏报错问题解决方案] 关于GTA5 unrecoverable fault报错问题的解决方案
- ERROR send and transfer are only available for objects of type address payable , not address
- Matlab之魔方阵magic
- 甲方安全之仿真钓鱼演练(邮件+网站钓鱼)
- 使用爬虫时,怎么分析网页结构
- Print Spooler 服务自动停止
- 多线程(3)--线程安全