本案例使用Netlogo软件来编写代码模拟沉默的螺旋。需要指出的是,Netlogo编程仍然具有一定的学习门槛。建议初学者首先安装Netlogo软件 ,并阅读Uri Wilensky和William Rand所著书籍An introduction to Agent-based Modeling: Modeling natural, social, and engineered complex systems with Netlogo。此外,初学者还需要了解Netlogo的编程手册 ,尤其是其中的NetLogo Dictionary。其中,Netlogo官方网站还提供NetLogo 4.0.2用户手册(简体中文版) 。
安装Netlogo软件后,通过File—Models Library路径就可以找到内置的很多多主题模型。比如在Social Science子目录下,可以找到名为Segragation的模型,它模拟了经典的谢林居住隔离模型。打开之后可以看到Interface、Info、Code三个界面。Interface即用户使用界面,在这里可以看到setup, go once, go等按钮。Setup即模型初始化按钮,go once是模型仅仅演化一个时间步,go则是让模型一直演化,除非再次点击停止这一操作。Info界面是对模型信息的文字介绍。Code界面展示的是模型的Netlogo源码。
接下来,读者可以直接打开脚注中的链接并运行本案例的代码 。也可以在Github代码仓库 中下载后缀为.nlogo的代码到本地,安装Netlogo软件后运行。我们还需要对案例使用的Netlogo代码进行简要介绍。使用Netlogo编写代码可以概括为以下五步:1.定义全局变量;2.定义行动者(Netlogo称为Trutles)属性;3.定义行动者所在的空间;4. 模型初始化;5. 定义模型更新的规则;6.迭代运行;7.定义按钮和滑块。

第一步,定义全局变量。Netlogo使用英文格式的分号;来表示注释,;后面的代码或文字不会被执行。通常使用两个或多个分号来强调注释行为。案例中定义的变量包括三种:tutles-own、patches-own、globals。Globals即为全局变量,包括silent-people(沉默的人数)、marginal-change(边际变化),这两个变量主要用于Interface界面的绘图展示。
;; step 1. define globals
globals
[marginal-change
silent-people ;; The number of people kept silenct(i.e. being coloured red).
]
第二步,定义行动者变量。使用tutles-own为行动者定义新变量,分别是flockmates(行动者周围的人,也就是参考群体)、willingness-to-express(行动者的表达意愿,后面会具体定义)。
;; step 2. define tutles-own
turtles-own
[
flockmates ;; agentset of nearby turtles
willingness-to-express
]
第三步,定义方格变量。Netlogo默认的社会空间为方格宇宙,每一个行动者的位于一个方格当中。因此,一个行动者最多有8个邻居。而这些格子同样可以赋予其属性。使用Patches-own为方格定义新变量,分别是patchmates(毗邻的格子)、media(媒体属性,后面会具体定义)。
;; step 3. define patches-own
patches-own
[
patchmates ;; patchset of nearby patches
media
]
第四步,模型初始化。(1)使用Clear-all命令清楚所有的全局变量、时钟计数、行动者、方格、绘图、输出等。(2)使用crt(即create-turtles缩写)生成行动者并将其命名为population。Population后面的方括号是对其具体设定,包括:设置颜色为绿色、通过随机数设置行动者在二维坐标系当中的位置、设置行动者的形状(学生样式,人手一本书)、设置大小为1.2。(3)使用ask命令设置方格的属性,包括设置方格的颜色为0到1.5之间的随机浮点数值、设置媒体影响力为-5到0之间的随机数乘以一个名为media-amplifier的数值。其中,media-amplifier通过Interface界面当中的滑块手工设置,读者可以将鼠标移动到Interface界面的media-amplifier滑块,邮件点击Edit即可查看并修改其属性。(4)设置行动者的属性,设置表达意愿的取值来自均值为0、标准差为1的正态分布。
;; step 4. initialization
to setup
;; (for this model to work with NetLogo's new plotting features,
;; __clear-all-and-reset-ticks should be replaced with clear-all at
;; the beginning of your setup procedure and reset-ticks at the end
;; of the procedure.)
clear-all
crt population
[
set color green
setxy random-xcor random-ycor
set shape "person student"
set size 1.2
]
ask patches ;;
[ set pcolor random-float 1.5
set media (random -5 ) * media-amplifier ;; Control media-amplifier to make faciliate the operation.
]
ask turtles ;;to setup-turtles
[
set willingness-to-express random-normal 0 1 ;;make it a random distribution
]
end
第五步,定义模型更新的规则。在这里,我们需要更新行动者的变量。在正式迭代运行之前,我们还需要定义如何更新模型当中的变量,尤其是行动者本身的变量。(1)每一个行动者的视野范围不一样,我们需要找到行动者周围的参考群体,设置参考群体flockmates为行动者视野内的人。注意,此处的vision也是通过Interface界面的滑块人工定义的,不需要像flockmate那样提前通过turtles-own声明。(2)接下来,根据公式1来更新行动者的表达意愿。当然,前提条件是行动者本身有参考群体。大众媒体的影响(mass-media)定义为行动者所在方格周围的4个方格的媒体影响的总和;参考群体的影响(reference-group)定义为所有参考群体成员表达意愿的总和;对双重意见气候进行加权计算边际变化(marginal change);行动者本身更新后的表达意愿为原来的表达意愿加上边际变化。注意,因为媒介的影响为负值,边际变化可能为负值。最后,更新行动者颜色。如果表达意愿大于等于0,设置行动者颜色为绿色,否则颜色为红色且形状改为person。
;; step 5. define updating rules
to find-flockmates ;; turtle procedure
set flockmates other turtles in-radius vision
end
to surveillance ;; turtle procedure
find-flockmates
if any? flockmates
[
let mass-media sum [media] of patch-set [neighbors4] of patch-here
let reference-group sum [willingness-to-express] of flockmates
set marginal-change alpha-media * mass-media + beta-reference-group * reference-group
set willingness-to-express willingness-to-express + marginal-change]
end
to recolor ;; turtle procedure
ifelse willingness-to-express >= 0
[ set color green ] ;; if >=0, talk
[ set color red
set shape "person" ] ;; esle, falling silent
end
除此之外,还需要设置更新绘图。在Interface界面绘制两张随时间步更新的图。(1)第一个图名为Spiral of silence,包括两条线:一条是红色的沉默者人数,一条是绿色的发言者人数;(2)第二个图名为Marginal Change。
to do-plots
set-current-plot "Spiral of Silence"
set-current-plot-pen "silent people"
plot count turtles with [color = red]
set-current-plot-pen "talking people"
plot count turtles with [color = green]
set-current-plot "Marginal Change"
;;plot-pen-reset
set-current-plot-pen "marginal-change"
plot marginal-change * 10000
end
第六步,迭代运行。(1)让行动者监视周围的双重意见气候,并且使用reset-ticks让模型时钟归零;(2)使用show命令在Interface界面的命令中心窗口打印出表达意愿大于0的行动者数量;(3)设置沉默者人数silent-people为表达意愿小于0的人的数量;(4)更新每一个时间步的行动者颜色;(5)设置模型停止运行的条件:如果所有人都沉默或都发言时停止运行;(6)在每一个时间步绘图。
;; step 6. iterations
to go
ask turtles [ surveillance ]
reset-ticks
show count turtles with [willingness-to-express >= 0]
set silent-people count turtles with [willingness-to-express < 0]
ask turtles [ recolor ]
ask turtles [stop]
if (silent-people = population)
[ stop ]
if (silent-people = 0)
[ stop ]
do-plots
end
第七步,在Interface界面添加按钮和滑块等元素。在Interface界面上方有一个名为“添加”的按钮,可以选择添加的元素类型包括:按钮、滑块、开关、选择器、输入框、监视器、图、输出区、注释。
本案例使用Netlogo软件来编写代码模拟沉默的螺旋。需要指出的是,Netlogo编程仍然具有一定的学习门槛。建议初学者首先安装Netlogo软件 ,并阅读Uri Wilensky和William Rand所著书籍An introduction to Agent-based Modeling: Modeling natural, social, and engineered complex systems with Netlogo。此外,初学者还需要了解Netlogo的编程手册 ,尤其是其中的NetLogo Dictionary。其中,Netlogo官方网站还提供NetLogo 4.0.2用户手册(简体中文版) 。
安装Netlogo软件后,通过File—Models Library路径就可以找到内置的很多多主题模型。比如在Social Science子目录下,可以找到名为Segragation的模型,它模拟了经典的谢林居住隔离模型。打开之后可以看到Interface、Info、Code三个界面。Interface即用户使用界面,在这里可以看到setup, go once, go等按钮。Setup即模型初始化按钮,go once是模型仅仅演化一个时间步,go则是让模型一直演化,除非再次点击停止这一操作。Info界面是对模型信息的文字介绍。Code界面展示的是模型的Netlogo源码。
接下来,读者可以直接打开脚注中的链接并运行本案例的代码 。也可以在Github代码仓库 中下载后缀为.nlogo的代码到本地,安装Netlogo软件后运行。我们还需要对案例使用的Netlogo代码进行简要介绍。使用Netlogo编写代码可以概括为以下五步:1.定义全局变量;2.定义行动者(Netlogo称为Trutles)属性;3.定义行动者所在的空间;4. 模型初始化;5. 定义模型更新的规则;6.迭代运行;7.定义按钮和滑块。
第一步,定义全局变量。Netlogo使用英文格式的分号;来表示注释,;后面的代码或文字不会被执行。通常使用两个或多个分号来强调注释行为。案例中定义的变量包括三种:tutles-own、patches-own、globals。Globals即为全局变量,包括silent-people(沉默的人数)、marginal-change(边际变化),这两个变量主要用于Interface界面的绘图展示。
第二步,定义行动者变量。使用tutles-own为行动者定义新变量,分别是flockmates(行动者周围的人,也就是参考群体)、willingness-to-express(行动者的表达意愿,后面会具体定义)。
第三步,定义方格变量。Netlogo默认的社会空间为方格宇宙,每一个行动者的位于一个方格当中。因此,一个行动者最多有8个邻居。而这些格子同样可以赋予其属性。使用Patches-own为方格定义新变量,分别是patchmates(毗邻的格子)、media(媒体属性,后面会具体定义)。
第四步,模型初始化。(1)使用Clear-all命令清楚所有的全局变量、时钟计数、行动者、方格、绘图、输出等。(2)使用crt(即create-turtles缩写)生成行动者并将其命名为population。Population后面的方括号是对其具体设定,包括:设置颜色为绿色、通过随机数设置行动者在二维坐标系当中的位置、设置行动者的形状(学生样式,人手一本书)、设置大小为1.2。(3)使用ask命令设置方格的属性,包括设置方格的颜色为0到1.5之间的随机浮点数值、设置媒体影响力为-5到0之间的随机数乘以一个名为media-amplifier的数值。其中,media-amplifier通过Interface界面当中的滑块手工设置,读者可以将鼠标移动到Interface界面的media-amplifier滑块,邮件点击Edit即可查看并修改其属性。(4)设置行动者的属性,设置表达意愿的取值来自均值为0、标准差为1的正态分布。
第五步,定义模型更新的规则。在这里,我们需要更新行动者的变量。在正式迭代运行之前,我们还需要定义如何更新模型当中的变量,尤其是行动者本身的变量。(1)每一个行动者的视野范围不一样,我们需要找到行动者周围的参考群体,设置参考群体flockmates为行动者视野内的人。注意,此处的vision也是通过Interface界面的滑块人工定义的,不需要像flockmate那样提前通过turtles-own声明。(2)接下来,根据公式1来更新行动者的表达意愿。当然,前提条件是行动者本身有参考群体。大众媒体的影响(mass-media)定义为行动者所在方格周围的4个方格的媒体影响的总和;参考群体的影响(reference-group)定义为所有参考群体成员表达意愿的总和;对双重意见气候进行加权计算边际变化(marginal change);行动者本身更新后的表达意愿为原来的表达意愿加上边际变化。注意,因为媒介的影响为负值,边际变化可能为负值。最后,更新行动者颜色。如果表达意愿大于等于0,设置行动者颜色为绿色,否则颜色为红色且形状改为person。
除此之外,还需要设置更新绘图。在Interface界面绘制两张随时间步更新的图。(1)第一个图名为Spiral of silence,包括两条线:一条是红色的沉默者人数,一条是绿色的发言者人数;(2)第二个图名为Marginal Change。
第六步,迭代运行。(1)让行动者监视周围的双重意见气候,并且使用reset-ticks让模型时钟归零;(2)使用show命令在Interface界面的命令中心窗口打印出表达意愿大于0的行动者数量;(3)设置沉默者人数silent-people为表达意愿小于0的人的数量;(4)更新每一个时间步的行动者颜色;(5)设置模型停止运行的条件:如果所有人都沉默或都发言时停止运行;(6)在每一个时间步绘图。
第七步,在Interface界面添加按钮和滑块等元素。在Interface界面上方有一个名为“添加”的按钮,可以选择添加的元素类型包括:按钮、滑块、开关、选择器、输入框、监视器、图、输出区、注释。