当前位置: 代码迷 >> 综合 >> 超全NetLogo多主体仿真建模(小世界WWW+无标度网络+随机网)内含源码+界面设计+程序分析
  详细解决方案

超全NetLogo多主体仿真建模(小世界WWW+无标度网络+随机网)内含源码+界面设计+程序分析

热度:70   发布时间:2023-11-21 21:41:56.0

一、小世界网络www

 

分布满足幂律的无标度网络有一个奇特的性质——“小世界”特性,虽然WWW中的页面数已超过80亿,但平均来说,在WWW上只需点击19次超链接,就可从一个网页到达任一其它页面。“小世界”现象在社会学上也称为“六度分离”。所以小世界是一种现象,其主要描述了同等规模节点的随机网络,具有较短的平均路径长度和较大的聚类系数特征的网络模型。

考虑到现实中单独使用小世界网络上的疾病传播模型极少,大多为无标度网络模型。在此展示的小世界网络基本模型,主要来源于NetLogo模型库中的Small Worlds

其主要界面如下:

  

调整总节点个数后可以对模型进行运行:

 

在上述模型基础上进行改进(SEIR模型)

假设人与人间构成了 BA 网络,人类社会组织存在小世界性、无标度性;而个体间存在差异,结点的度服从幂律分布。由此将小世界和无标度网络模型相结合构建的模型。

基本界面及运行结果如下:

模型假设感染者不会死亡,只会传染其他易感染者或者被隔离并治愈。模型假设康复者体内含有抗体,不会再感染病毒;模型假设潜伏者没有被收治,感染者会被收治,被收治的感染者会一直占用医院隔离区域;模型假设被隔离的感染者无法再感染其他人;模型假设患者只能通过医院收治再被治愈。通过对比仿真绘图我们可以发现,人们如果不进行隔离而去接触许多人的话,被感染的人数峰值会大很多而且会提前,如果大家都减少活动范围,自己宅在家中,潜伏者和感染者那两条线就几乎消失了,这就是为什么说,在病毒蔓延之际,采用自我隔离的方法是控制疫情最有效的措施之一。

话不多说,上源码(在NetLogo运行中务必完整设计页面布局,滑块与按钮不能少,不然会提示)

turtles-own[stateinitial-xcorinitial-ycorexposed-startreceived?cured?
]globals[remain-hospital-segregation-area]to setupclear-allreset-tickscreate-turtles population[set shape "circle"set initial-xcor (random-xcor * 0.95)set initial-ycor (random-ycor * 0.95)setxy initial-xcor initial-ycorset received? 0become-susceptible]ask n-of initial-infectious-num turtles[become-exposed]set remain-hospital-segregation-area hospital-patient-segregation-area
endto goask turtles [move-turltesspreadtransform]received-and-curedtick
endto received-and-curedlet current-time ticksif current-time >= (receive-cure-response-time + latent-time)[ask n-of remain-hospital-segregation-area patches [if receive-rate >= random-float 1[ ;;receive-rate影响收治效率let agents turtles-hereif count agents > 0[ask one-of agents[if state = 2 and received? = 0 [if remain-hospital-segregation-area > 0 [set remain-hospital-segregation-area (remain-hospital-segregation-area - 1)set received? 1recovery]]]]]]let has-infected-not-cure turtles with [state = 2 and received? = 1 and cured? = 0]let num count has-infected-not-cureif num > 0 [ask has-infected-not-cure [recovery]]]
endto move-turltesifelse human-flow-range = 0[fd 0][if random-float 1 < 0.2[set heading random 360]ifelse (distancexy initial-xcor initial-ycor) < human-flow-range[fd 1][facexy initial-xcor initial-ycorfd 1]]
endto spreadlet touch-agents other turtles-hereif count touch-agents >= 1[if (state = 1 or state = 2) and received? = 0 [ask touch-agents with [state = 0][infect-turtles]]]
endto transformif state = 1[let current-ticks ticksif current-ticks - exposed-start >= latent-time[if transform-rate >= random-float 1 [become-infected]]]
endto recoveryif state = 2 and recovery-rate >= random-float 1 [become-recovered]
endto infect-turtlesif infection-rate >= random-float 1[become-exposed]
endto become-susceptibleset state 0set color green
endto become-exposedset state 1set color yellowset exposed-start ticks
endto become-infectedset state 2set color redset cured? 0
endto become-recoveredset state 3set color blueset cured? 1
end

 二、无标度网络模型

无标度网络具有严重的异质性,其各节点之间的连接状况(度数)具有严重的不均匀分布性:大多数“普通”节点拥有很少的连接,而少数“热门”节点拥有极其多的连接,网络中的“热门”节点称作枢纽节点(Hub)。少数Hub点对无标度网络的运行起着主导的作用。从广义上说,无标度网络的无标度性是描述大量复杂系统整体上严重不均匀分布的一种内在性质。无标度网络的重要特征为:其节点度分布服从幂律分布。

传统的SIR模型与无标度网络模型进行结合,未加改进

将感染者、疑似感染者和康复者三者的关系进行了仿真与可视化。

由运行结果我们可以明显的看出,类似于我们的新冠肺炎疫情:随着时间的增长,感染者在逐步增多,但是从出现感染者时我们便会人为干预疾病的传播,这时会有少数的康复者,那么当感染者到峰值以后康复者的数量也在逐步增加,最终感染者数量趋近于0,而康复者数量在逐渐增多:而当出现第一例感染者时,与之相关的就会有大多数疑似感染者,而当我们人为干预后,患病率逐步下降,所以疑似感染者也在逐步下降

源码如下:

turtles-own
[infected?resistant?virus-check-timer
]to setupclear-allset-default-shape turtles "circle"make-node nobodymake-node turtle 0reset-ticks
endto goask links [ set color gray ]make-node find-partnertickif layout? [ layout ]
endto setup2ask turtles [set infected? falseset resistant? false]ask n-of initial-outbreak-size turtles[ become-infected ]reset-ticks
endto set-all-susceptibleask turtles [set color blue]
endto remove-infectedask turtles with [color = red][set color blue]
endto spreadif all? turtles [not infected?][ stop ]ask turtles[set virus-check-timer virus-check-timer + 1if virus-check-timer >= virus-check-frequency[ set virus-check-timer 0 ]]spread-virusdo-virus-checkstick
endto make-node [old-node]create-turtles 1[set color blueif old-node != nobody[ create-link-with old-node [ set color green ]move-to old-nodefd 8]]
endto-report find-partnerreport [one-of both-ends] of one-of links
endto resize-nodesifelse all? turtles [size <= 1][ask turtles [ set size sqrt count link-neighbors ]][ask turtles [ set size 1 ]]
endto layoutrepeat 3 [let factor sqrt count turtleslayout-spring turtles links (1 / factor) (7 / factor) (1 / factor)display]let x-offset max [xcor] of turtles + min [xcor] of turtleslet y-offset max [ycor] of turtles + min [ycor] of turtlesset x-offset limit-magnitude x-offset 0.1set y-offset limit-magnitude y-offset 0.1ask turtles [ setxy (xcor - x-offset / 2) (ycor - y-offset / 2) ]
endto-report limit-magnitude [number limit]if number > limit [ report limit ]if number < (- limit) [ report (- limit) ]report number
endto become-infectedset infected? trueset resistant? falseset color red
endto become-susceptibleset infected? falseset resistant? falseset color blue
endto become-resistantset infected? falseset resistant? trueset color grayask my-links [ set color gray - 2 ]
endto spread-virusask turtles with [ infected? ][ ask link-neighbors with [not resistant?][ if random-float 100 < virus-spread-chance[ become-infected ] ] ]
endto do-virus-checksask turtles with [infected? and virus-check-timer = 0][if random 100 < recovery-chance[ifelse random 100 < gain-resistance-chance[ become-resistant ][ become-susceptible ]]]
end

三、随机网模型

与普通网络图比较,随机网络具有以下几个特点:

  1. 随机网络的箭线和节点不一定都能实现,实现的可能性取决于节点的类型和箭线的概率系数;

  2. 随机网络中各项活动的时间可以是常数,也可以是服从某种概率分布的密度函数,更具有不确定性;

  3. 随机网络中可以有循环回路,表示节点或活动可以重复出现;

  4. 随机网络中的两个中间节点之间可以有一条以上箭线;

  5. 随机网络中可以有多个目标,每个目标反映一个具体的结果,即可以有多个起点或终点

传统的随机网络(如ER模型),尽管连接是随机设置的,但大部分节点的连接数目会大致相同,即节点的分布方式遵循钟形的泊松分布,有一个特征性的“平均数”。连接数目比平均数高许多或低许多的节点都极少,随着连接数的增大,其概率呈指数式迅速递减。故随机网络亦称指数网络。随机图中一个有趣的性质是,当节点的平均度数达到1的时候,网络中就会出现一个明显的巨大部分(giant component)本模型主要来源于NetLogo模型库中的Giant Component

假设一个团体中有很多的个体,之后两个人随机的认识并且成为朋友,那么随着时间的推移,这个团体会变成什么样子呢?该模型将此情景很好的模拟了出来。 

左下角表示度中心性,也就是每个节点和其他多少个节点直接相连,可以理解为一个人交到了多少个好朋友。统计结果显示,当度中心度到达1左右的时候,也就是每个人都有一个好朋友之后,网络中最大的成分会爆炸性增长,也就是说认识朋友的圈子会快速的增加。如果在中途统计网络中所有人员交朋友的数量,我们会发现这个数量实际上是符合正态分布的。

而基于随机网模型的疾病扩散是以随机分布的方式,随机结合,但是同样也是以一个人为基准,其余随机连接的仿真模型。 

随着周数的增加,感染者的人数在不断增加,但是随着人为干预的效果逐渐增加,治愈的和有免疫力的人数也在不断增加,类似于生物学中的拮抗作用,此时感染者的人数就开始下降了,最终趋近于0,健康的人和有免疫力的人都在不断增加,疾病传播得到有效的抑制。与其他网络模型不同的是,我们可以看到随机网的是基于一个人,以此为基准随机产生的关系进行传播 。

源码源码!在这里!

turtles-own[ sick?remaining-immunitysick-timeage ]globals[ %infected%immunelifespanchance-reproducecarrying-capacityimmunity-duration ]to setupclear-allsetup-constantssetup-turtlesupdate-global-variablesupdate-displayreset-ticks
endto setup-turtlescreate-turtles number-people[ setxy random-xcor random-ycorset age random lifespanset sick-time 0set remaining-immunity 0set size 1.5get-healthy ]ask n-of 10 turtles[ get-sick ]
endto get-sickset sick? trueset remaining-immunity 0
endto get-healthyset sick? falseset remaining-immunity 0set sick-time 0
endto become-immuneset sick? falseset sick-time 0set remaining-immunity immunity-durationask my-links [ die ]
endto setup-constantsset lifespan 50 * 52set carrying-capacity 300set chance-reproduce 1set immunity-duration 52
endto goask turtles [get-oldermoveif sick? [ recover-or-die ]ifelse sick? [ infect ] [ reproduce ]]update-global-variablesupdate-displaytick
endto update-global-variablesif count turtles > 0[ set %infected (count turtles with [ sick? ] / count turtles) * 100set %immune (count turtles with [ immune? ] / count turtles) * 100 ]
endto update-displayask turtles[ if shape != turtle-shape [ set shape turtle-shape ]set label ifelse-value show-age? [ floor (age / 52) ] [ "" ]set color ifelse-value sick? [ red ] [ ifelse-value immune? [ grey ] [ green ] ] ]stop-inspecting-dead-agentsif watch-a-person? and subject = nobody[ watch one-of turtles with [ not hidden? ]clear-drawingask subject [ pen-down ]inspect subject ]if not watch-a-person? and subject != nobody[ stop-inspecting subjectask subject[ pen-upask my-links [ die ] ]clear-drawingreset-perspective ]
endto get-olderset age age + 1if age > lifespan [ die ]if immune? [ set remaining-immunity remaining-immunity - 1 ]if sick? [ set sick-time sick-time + 1 ]
endto movert random 100lt random 100fd 1
endto infectask other turtles-here with [ not sick? and not immune? ][ if random-float 100 < infectiousness[ get-sickif self = subject[ create-link-with myself[ set color redset thickness .3 ] ] ] ]
endto recover-or-dieif sick-time > duration[ ifelse random-float 100 < chance-recover[ become-immune ][ die ] ]
endto reproduceif count turtles < carrying-capacity and random-float 100 < chance-reproduce[ hatch 1[ set age 1lt 45 fd 1pen-upget-healthy ] ]
endto-report immune?report remaining-immunity > 0
endto startupsetup-constants
end

写在最后

本程序使用NetLogo6.2.0版本,可以从 NetLogo 6.2.0下载地址 下载