NetLogo学习笔记4 —— 可变参数与谢林模型「建议收藏」

NetLogo学习笔记4 —— 可变参数与谢林模型「建议收藏」这回,我们学习如何在模型运行时改变参数,以及实现谢林模型_netlogo累加

NetLogo学习笔记4 —— 可变参数与谢林模型

在上一篇文章,我们学习了if语句设置属性添加新属性定义变量集合筛选等知识,还实现了康威生命游戏
这回,我们学习如何在模型运行时改变参数,以及实现谢林模型
在打开软件写代码之前,让我们先来了解一下 —— “谢林模型” 是什么?


什么是谢林模型?

谢林模型由美国经济学家托马斯·谢林发明的一个模型,描述趋同性对于空间隔离的影响,揭示了种族隔离背后的原理
谢林模型的描述如下:

  • 有限二维网格中居住着一群人,每个人可能是A型或B型,用于代表两类不同的人
  • 定义一个阈值T,若一个人周围的同类人占比小于T,那么这个人就会移动到新的空位

我们用红海龟代表A型绿海龟代表B型,没有海龟的瓦片即空位
我们用一个可变的参数numberT,来表示人数阈值


我们打开NetLogo软件,创建好setup按钮和go按钮及函数,先把基本要素搭建好,然后想想代码思路:

  • 我们需要声明可变参数numberT
  • 我们要随机生成两种人,即随机生成红绿两色的海龟
  • 我们要判断每个海龟所在位置是否符合居住条件
  • 不符合条件的海龟移动到另一个瓦片的中心上

在开始制作模型之前,让我们先把模型调到合适大小,因为默认大小实在太小了在这里插入图片描述

定义可变参数 —— 滑块的使用

让我们先来看看如何定义可变参数
在这里插入图片描述
现在我们可以使用numberT这两个变量了


列表与集合的随机选择 —— one-of语句

现在我们需要随机生成红绿两色的海龟,我们来看看setup函数的代码:

to setup
  clear-all
  create-turtles number ;生成number只海龟
  ask turtles [
    set color one-of [red green] ;随机设置海龟颜色为红色或绿色
    ;red和green都是内置颜色常量
  ]
end

我们重点看第5行代码:color是海龟的颜色属性,那么推理可知1one-of [red green] 是一个代表颜色的整数

[red green] 在这里是一个列表(而不再是代码块),里面存放着红绿两种颜色
one-of 表示从列表或集合里随机选一项。其语法如下:

one-of <集合或列表>

理解了上面的东西,第5行代码也就不难理解了

伪并发 —— ask-concurrent

让我们看看go函数的代码:(先别急着抄)

to go
  ask-concurrent turtles [ ;伪并发请求,防止因为一个海龟卡死而瘫痪整个模型
    move ;一个用来移动海龟的递归函数,下面会讲
  ]
end

第2行 ask-concurrent 的用法与ask相同,不同是它会把任务切片来模拟并发运行,就像单核CPU所做的任务切片那样
在这个例子里,是为了防止因为某个海龟找不到宜居地而不停的走动,使模型卡在那个海龟的任务里

递归函数 与 of语法

如果一个人对自己身处的地方不满意,他就会离开,直到找到合适的地方。所以,我们将move定义为如下递归函数

to move
  let m 0 ;用来存储相邻瓦片同类海龟数
  let n 0 ;用来存储相邻瓦片海龟总数
  let c color ;保存此海龟颜色,用于判断其他海龟是否为同类
  let A [neighbors] of patch-here ;与此海龟相邻的瓦片
  
  ask A [ ;请求周边瓦片执行代码
    set m m + count turtles-here with [color = c] ;统计出周边瓦片同类数
    set n n + count turtles-here ;统计周边瓦片海龟数
  ]
  ifelse n > 0 [set m m / n] [set m 0] ;计算同类比例,存入m。若分母为0则直接为0
  
  if count [turtles-here]of patch-here > 1 or m * 100 < T [
  ;如果此海龟所在瓦片海龟数大于1或周围同类比例小于T
    move-to one-of patches
    ;那么海龟随机移动到另一瓦片上
    move
    ;递归调用move,直至条件为假
  ]
end

别着急,我们一行一行解读。先看第5行:
patch-here 返回海龟下方瓦片

还记得调用主体嘛?有了它,NetLogo才知道要调用谁的函数或属性,以前我们使用ask隐式指定调用主体
of语句显示指定调用主体,用于获取属性或调用函数,语法如下:

[<属性或函数>] of <调用主体>

第5行意思就是:定义A为:与此海龟下方瓦片相邻2的瓦片的集合


两条分支 —— ifelse语句

因为我们要获取周围的同类数与海龟总数,以计算同类比例,所以我们要获取周边瓦片上的海龟
第7行:请求周围每块的瓦片执行代码

第8行:turtles-here 会返回该瓦片上所有海龟的集合,+加法的意思
意思就是:通过颜色比较筛选出每块瓦片上的同类,计数并累加到m

第9行意思明了:获取每块瓦片上的海龟,计数并累加到n

第11行计算同类比例,加上判断是为了防止,在此海龟周围没有海龟时,分母为0。
用了 ifelse语句,语法如下:

ifelse <布尔条件式>
[<条件为真时要执行的代码>]
[<条件为假时要执行的代码>]

第13行描述了海龟在什么条件下会搬走:

  • count [turtles-here]of patch-here > 1 表示所在瓦片海龟数大于1,也就是当前瓦片已经有人居住时
  • m * 100 < T 表示同类占比小于T时,由于T是1~100的整数,因此计算时要乘以100

第15行:move-to 参数是一个瓦片,会将海龟移动到该瓦片中心
整句话意思是:将海龟移动到随机选取的瓦片中心

第17行是递归调用,因为它在 if语句 里面,不难看出:只有条件为假,即找到合适位置才会停止移动


运行模型,会发现:随着阈值T的不断增大,隔离现象也就越严重
在这里插入图片描述
正如大家所见,模型直观、深刻地揭露了隔离现象的本质

可以试着修改代码,自己多多实践
这篇文章就这里了,喜欢记得关注哦!会更新的!


  1. 这要涉及到set指令颜色整数的概念,见上一篇文章 ↩︎

  2. 上一篇文章讲过 neighbors获取相邻瓦片 ↩︎

今天的文章NetLogo学习笔记4 —— 可变参数与谢林模型「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63768.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注