谣言传播是社会学里研究比较热的点,利用netlogo对谣言传播过程模拟研究可以方便的实现。
原语学习:
1. all?
all? agentset [reporter] 如果主体集合(agentset)中的所有主体对给定的报告器(reporter)都返回true,则返回true。否则返回false。
给定的报告器必须对每个主体都返回布尔值(true或 false),否则发生错误。 2. scale-color
scale-color color number range1 range2 返回明暗与number成正比的color色。
number是一个主体变量,但是必须是数字型。
如果range1 < range2, number越大,颜色越亮。如果range > range2,则相反。 如果number < range1,则为最暗的color色。 如果number > range1,则为最亮的color色。
注意:对明暗无关的颜色,例如green and green + 2一样,使用同样的色谱
本模型概述:本模型对谣言传播弄你,一个人知道了谣言后会告诉和他相近的人(本模型中一个人就是用世界中的瓦片(patch)代替,邻居就是相邻瓦片),以此内推,谣言开始传播。 3. display
引起视图立刻更新。(例外:如果用户使用速度滑动条快进模型,更新可能被跳过)一般和鼠标点击事件一起使用。
模拟界面:
程序中先要有一个谣言发起者,就是瓦片中设立一个红色的瓦片,作为谣言的发起者,模型中有三种方式发起谣言( 三个按钮):设置一个(setup-one),随机设置几个(setup-random)和使用鼠标左键点击设置(spread-rumor-with-mouse)
globals [
color-mode ;; 0 = normal, 1 = when heard, 2 = times heard clique ;; how many patches have heard the rumor
previous-clique ;; value of clique from last tick, for use in the \"successive\" plots ]
设置三个全局变量(globals用来定义全局变量),color-mode 对应界面上三种着色类型:color:normal,color:when heard , color:times heard
clique :英文直译就是初级群体,用来记录多少人(这里用瓦片表示)听到谣言
previous-clique:记录上一次tick(netlogo内置计时器,和现实时间不同)的初级群体,用来画图
patches-own [
times-heard ;; tracks times the rumor has been heard first-heard ;; clock tick when first heard the rumor
just-heard? ;; tracks whether rumor was heard this round -- resets each round ]
patches-own 用来定义patch拥有的变量,times-heard 记录听到多少次了,first-heard用来记录第一次听到谣言的tick,just-heard?
;;; setup procedures
to setup [seed-one?] clear-all ;;清除所有局部变量,一般这个都要写在setup开始第一行 set color-mode 0 ;;设置默认着色方法 set clique 0 ;;全局变量clique 初始群体为0 ask patches ;;设置所有瓦片(这里就是模拟现实事件的人) [ set first-heard -1 set times-heard 0 set just-heard? false recolor ];;recolor是下面写的函数 ifelse seed-one? [ seed-one ] [ seed-random ] reset-ticks ;;一般计时器清除放最后 end
看一下这个setup初始化例程,我们可以注意到,这个和我们平常看到的不一样,一般情况下就直接是setup,这里使用了个参数 [seed-one?] ,例程里使用参数用中括号括起来,我们前面说到有三种方式发起谣言,带“?”结尾的参数取值一般就取true 和 false,说明还有一种方式没有使用这个setup例程。
到程序运行界面,右键选中setup-one 按钮,点编辑,可以看到它的指令是 setup true,说明传递了一个true 到seed-one?里。同理,在setup-random 按钮的指令是 setup false,说明传递了个false。
to seed-one ;;让中心瓦片[0 0]发起谣言 ;; tell the center patch the rumor ask patch 0 0
[ hear-rumor 0 ] end
to seed-random ;;随机选取一定瓦片
;; seed with random number of rumor sources governed by init-clique slider ask patches with [times-heard = 0] [ if (random-float 100.0) < init-clique [ hear-rumor 0 ] ] end
发起谣言两种方式,这里面又调用了下面的一个例程函数 hear-rumor [when] 听到谣言,如果第一次听到,记录first-heard 的when(tick),设置just-heard?为true
,然后听到次数times-heard 听到的次数加1,然后重新着色recolor, 如果不是第一次,那
就直接记录times-heard和着色就可以了。 to hear-rumor [when] ;; patch procedure if first-heard = -1
[ set first-heard when set just-heard? true ]
set times-heard times-heard + 1 recolor ; end
另外一种模式是根据鼠标单击产生谣言
这里要注意,用到鼠标单击,如果不使用display,视图不会马上更新
to spread-rumor-with-mouse if mouse-down?
[ ask patch mouse-xcor mouse-ycor [ hear-rumor ticks ] display ] end
下面看看go例程 to go
if all? patches [times-heard > 0] [ stop ] ;;如果所有的瓦片都听到了谣言,那就停止 ask patches
[ if times-heard > 0 ;;如果听到谣言次数大于1,那么就传播谣言 [ spread-rumor ] ] ;;下面 update tick end
传播就是传播给邻居,因为对应两种模式,先定义一个neighbor来暂时存储对应的方式邻居,然后请求邻居设置just-heard?为真就可以了。
to spread-rumor ;; patch procedure let neighbor nobody ifelse eight-mode?
[ set neighbor one-of neighbors ] [ set neighbor one-of neighbors4 ] ask neighbor [ set just-heard? true ] end
更新就是使得刚听到的变成不是刚听到,然后根据hear-rumor函数,更新times-heard,然后通过previous-clique存储下来先前听到谣言群体数量,再更新clique
to update
ask patches with [just-heard?] [ set just-heard? false hear-rumor ticks ] set previous-clique clique
set clique count patches with [times-heard > 0] end
下面是着色方案,比较简单,对应color-mode对应不同的按钮。 to recolor ;; patch procedure ifelse color-mode = 0 [ recolor-normal ] [ ifelse color-mode = 1
[ recolor-by-when-heard ] [ recolor-by-times-heard ] ] end
to recolor-normal ;; patch procedure ifelse first-heard >= 0 [ set pcolor red ] [ set pcolor blue ] end
to recolor-by-when-heard ;; patch procedure ifelse first-heard = -1 [ set pcolor black ]
[ set pcolor scale-color yellow first-heard world-width 0 ] end
to recolor-by-times-heard ;; patch procedure
set pcolor scale-color green times-heard 0 world-width end
本文档由netlogo爱好者编,如有不足,请见谅! 需要项目合作的可以加我企鹅:2763035721 或者有疑问加我企鹅群:530305942
如果你觉得对你有用,欢迎请分享者一杯咖啡!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务