Skip to content

编写Netlogo代码的基本步骤 #1

Description

@chengjun

本案例使用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.定义按钮和滑块。

image

第一步,定义全局变量。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界面上方有一个名为“添加”的按钮,可以选择添加的元素类型包括:按钮、滑块、开关、选择器、输入框、监视器、图、输出区、注释。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions