NetLogo学习笔记4 —— 可变参数与谢林模型
在上一篇文章,我们学习了if语句,设置属性,添加新属性,定义变量,集合筛选等知识,还实现了康威生命游戏。
这回,我们学习如何在模型运行时改变参数,以及实现谢林模型
在打开软件写代码之前,让我们先来了解一下 —— “谢林模型” 是什么?
什么是谢林模型?
谢林模型由美国经济学家托马斯·谢林发明的一个模型,描述趋同性对于空间隔离的影响,揭示了种族隔离背后的原理
谢林模型的描述如下:
- 在有限二维网格中居住着一群人,每个人可能是A型或B型,用于代表两类不同的人
- 定义一个阈值T,若一个人周围的同类人占比小于T,那么这个人就会移动到新的空位
我们用红海龟代表A型,绿海龟代表B型,没有海龟的瓦片即空位
我们用一个可变的参数number和T,来表示人数和阈值
我们打开NetLogo软件,创建好setup按钮和go按钮及函数,先把基本要素搭建好,然后想想代码思路:
- 我们需要声明可变参数number和T
- 我们要随机生成两种人,即随机生成红绿两色的海龟
- 我们要判断每个海龟所在位置是否符合居住条件
- 让不符合条件的海龟移动到另一个瓦片的中心上
在开始制作模型之前,让我们先把模型调到合适大小,因为默认大小实在太小了
定义可变参数 —— 滑块的使用
让我们先来看看如何定义可变参数:
现在我们可以使用number和T这两个变量了
列表与集合的随机选择 —— one-of语句
现在我们需要随机生成红绿两色的海龟,我们来看看setup函数的代码:
to setup
clear-all
create-turtles number ;生成number只海龟
ask turtles [
set color one-of [red green] ;随机设置海龟颜色为红色或绿色
;red和green都是内置颜色常量
]
end
我们重点看第5行代码:color是海龟的颜色属性,那么推理可知1,one-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的不断增大,隔离现象也就越严重
正如大家所见,模型直观、深刻地揭露了隔离现象的本质
可以试着修改代码,自己多多实践
这篇文章就这里了,喜欢记得关注哦!会更新的!
今天的文章NetLogo学习笔记4 —— 可变参数与谢林模型「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63768.html