Netlogo建模基础知识讲解 14302010008 秦奕深
NetLogo简介 1.基本情况 NetLogo是一个用来对自然和社会现象进行仿真的可编程建模环境建模仿真集成环境 由美国西北大学连接学习与计算机建模中心(Center for Connected Learning and Computer-Based Modeling,CCL)开发。 2002年发布了1.0版本,用户手册为4.0.2版本,最新为4.1.1版本
2. 主要功能 多主体建模(重点) 运行控制 仿真输出 实验管理 系统动力学仿真 参与式仿真 模型库 多个移动Agent分布在二维空间中,每个Agent自主行动,所有主体并行异步更新,整个系统随着时间推进而动态变化。 运行控制 仿真输出 提供了多种手段实现仿真运行监视和结果输出 实验管理 BahaviorSpace,自动管理仿真运行,并记录结果。 系统动力学仿真 参与式仿真 HubNet 模型库
3.软件特色 完全可编程 简单语言结构 是LOGO语言的扩展,支持智能体和网络结构 可以定义无限个智能体和变量 多种内置命令帮助使用 支持整型和双精度型浮点数计算 跨平台、可复用的应用。
二、NetLogo仿真框架 1. NetLogo软件
2.模型的抽象 总体: 大量的可移动主体在二维空间中交互作用,随着时间推进,微观个体的属性不断发生变化,系统的宏观特征也因此而变化。 从三个方面理解: 主体 空间表达 仿真推进
(1)主体(Agents) 虚拟世界由主体构成,主体能够接受命令,进行活动,所有主体的行为并行发生。 NetLogo中共有三类主体, turtles(海龟) patches(瓦片) observer(观察者)
主体类型 turtles指能够在世界中移动的主体。 世界是二维的,划分为由patches组成的网格,每个patch占据一个矩形小块。 patch和turtle一样可以有自己的属性和行为 observer是一个全局主体,它观察着由turtles和patches构成的世界,能够执行指令获取世界全部或部分的状态,或实现对世界的控制。
虚拟世界
(2)空间表达 每个patch有二维坐标(pxcor,pycor)坐标值为整数。 默认情况下,二维世界的水平、垂直坐标范围为(-17,17) 每个turtle也有坐标(xcor,ycor) turtle坐标不必是整数,因此turtle不一定正好位于某个patch的中心。 一个patch上也可以同时有多个turtles。 实际上对turtle而言,NetLogo的空间是连续的。
(3)仿真推进 没有明确的仿真时钟变量,也没有提供特定的事件处理机制 仿真推进是通过不断重复执行某个例程实现的 模型中至少要有初始化例程和仿真执行例程 初始化例程实现对模型初始状态的设置,生成所需的turtles,设置其状态,以及其它工作。 仿真的执行通过例程go实现,在go例程中编写所需执行的各种指令,完成一个仿真步的工作。 需要在Interface页中建立一个按钮与go例程相联系,该按钮是一个永久(forever)按钮,点击后将不断重复执行go例程,直到遇到stop指令或用户再次点击该按钮则仿真终止。
2.建模基本过程 NetLogo模型包括可视化部件和例程两部分,二者具有紧密联系。 先在Interface中创建可视化控件,然后在Procedures中实现相应的代码,通过设置控件的属性将二者联系起来。
Interface中主要有三类部件 Procedure中的例程分为两类: 运行控制 参数控制 仿真显示 命令(command)例程 报告(reporter)例程
仿真的基本框架 初始化to setup 对所有Turtle循环 ask turtles 每一个仿真周期to go 每个Turtle做出决策forward 1 是否结束? 否 是 结束
三、编程指南
breed [ ] turtles-own [ ] globals [ ] to setup [ ] end to go [ ] end ask turtles [ set pcolor white ] set-default-shape turtles "person" setxy random-xcor random-ycor set turtles-own random set age ( 22 + random 53 ) set age ( age + 1 ) set house 0 clear-all(ca) forward(fd) 1 create-turles 100 sprout-breeds number [ ] sprout number [ ] hatch number [ ] hatch-breeds number [ ] ask one-of men [set breed ] if ifelse
四、生态系统建模示例 假设要模拟一个简单的生态系统, 该系统中有一种生物以青草为食,通过吃草获取能量、 该类生物经历成长、繁殖、死亡过程。
1. 初始化 创建生物群体,并将它们随机分布在空间中。 例程(demo1) to setup ;;定义例程setup clear-all ;;设置整个世界为初始状态 ;;创建100个turtles,创建后各turtle默认坐标是(0,0) create-turtles 100 ;;命令所有turtle执行语句setxy random-xcor random-ycor ;;各turtle 坐标随机产生,实现turtles在空间中的随机分布 ask turtles [setxy random-xcor random-ycor] end
2.仿真执行例程 实现turtle随机移动 实现go例程,与forever按钮联系 go 调用move-turtles例程
增加代码: (demo2) to go ;;定义仿真执行例程go move-turtles ;;调用例程move-turtles end to move-turtles ;;定义例程move-turtles ;;所有turtle执行[ ]中的命令序列 ask turtles[ right random 360 ;;右转一个角度,度数随机产生 forward 1 ;;前进距离1 ]
3.青草的模拟 为模拟青草的存在设置patches为绿色 改写setup 例程,其中调用了两个新的例程setup-turtles和setup-patches,分别设置turtle和patch的初始状态
demo3 to setup clear-all setup-patches ;;调用例程setup-patches setup-turtles ;;调用例程setup-turtles end to setup-patches ;;命令所有patches执行指令set pcolor green ;;该指令将patch颜色设置为绿色 ask patches[set pcolor green] to setup-turtles create-turtles 100 ask turtles[setxy random-xcor random-ycor]
4.主体行为 现在增加一些行为,假设turtle以青草为食,通过吃草获得能量,移动时要消耗能量。 patch代表青草,绿色表示有,黑色表示无。 为实现这样的模型,需要重新定义turtles的属性和行为,然后重写go例程。 首先给turtle增加变量energy以存储当前能量值, 另外添加吃草获取能量的例程, 还要修改移动例程以反映能量消耗。
自定义turtle变量,修改go turtles-own[energy] ;;声明turtle变量energy to go move-turtles ;;turtle随机移动,消耗能量 eat-grass ;;吃草获取能量 end
定义eat-grass turtle吃草获取能量 修改patch颜色表示草的有无 to eat-grass ask turtles[ if pcolor = green[ set pcolor black set energy (energy+10) ] end
修改原来的move-turtles例程,添加能量消耗指令。 to move-turtles ask turtles [ right random 360 forward 1 set energy energy - 1 ;;移动后能量减少1 ] end
假设turtle能量小于等于0就死亡,当能量大于50就繁殖;青草以一定的恢复率再生。由于主体行为发生了改变,需重新定义go例程, to go move-turtles ;;移动 eat-grass ;;吃草 reproduce ;;繁殖 check-death ;;死亡 regrow-grass ;;青草再生 end
to reproduce ask turtles[ if energy > 50[ ;;如果能量大于50则繁殖 set energy energy-50 ;;母体能量减少50 hatch 1 [set energy 50] ;;产生一个后代,初始能量50 ] end to check-death if energy<=0 [die] ;;如果能量小于等于0则死亡 to regrow-grass ask patches[ ;;青草以0.03的概率再生 if random 100<3 [set pcolor green]
5.监视仿真运行 监视器控件(monitor) 主体标签 显示turtle数量,monitor表达式“count turtles” 每个主体有一个变量lable
6.图形输出 在Interface中创建Plot控件,在Procedures中编制绘图例程。 绘图概念 每个Plot控件必须指定一个唯一名,在绘图时通过Plot名指定在哪个Plot上绘图 绘图时必须使用某个画笔,画笔默认是黑色实线,也可以创建自定义画笔
绘制turtles数量和青草数量曲线 添加Plot控件 创建两个画笔,分别指定颜色 添加do-plots例程 修改 setup和go例程
to setup clear-all setup-patches setup-turtles do-plots ;;绘制初始点 end to go move-turtles eat-grass reproduce check-death regrow-grass do-plots ;;随仿真运行绘制图形 to do-plots set-current-plot “totals” ;;选定plot控件 set-current-plot-pen “turtles” ;;选定画笔turtles plot count turtles ;;绘制turtles数量 set-current-plot-pen “grass” ;;选定画笔grass plot count patches with [pcolor=green] ;;绘制青草数量
7.仿真参数控制 参数控件 开关(switch)、滑动条(slider)、选择器(chooser) 这些控件都对应一个全局变量,在Procedures中将这些全局变量作为参数使用在程序中,就能实现仿真参数的控制。
例如:选择仿真时长 用滑动条设置仿真时长,对应变量名terminate-time 添加全局变量ticks 修改go例程, 当ticks=terminate-time时停止
代码 globals [ticks] ;;声明全局变量ticks … to go if ticks >= terminate-time [stop] ;;判断是否应停止 move-turtles eat-grass reproduce check-death regrow-grass do-plots set ticks ticks+1 ;;时钟推进 end