1、Netlogo建模基础知识讲解建模基础知识讲解14302010008秦奕深秦奕深NetLogo简介1.基本情况vNetLogo是一个用来对自然和社会现象进行仿真的可编程建模环境建模仿真集成环境v由美国西北大学连接学习与计算机建模中心(Center for Connected Learning and Computer-Based Modeling,CCL)开发。v2002年发布了1.0版本,用户手册为4.0.2版本,最新为4.1.1版本2.主要功能v多主体建模(重点)多个移动Agent分布在二维空间中,每个Agent自主行动,所有主体并行异步更新,整个系统随着时间推进而动态变化。v运行控制v仿
2、真输出提供了多种手段实现仿真运行监视和结果输出 v实验管理BahaviorSpace,自动管理仿真运行,并记录结果。v系统动力学仿真v参与式仿真HubNet v模型库3.软件特色v完全可编程v简单语言结构v是LOGO语言的扩展,支持智能体和网络结构v可以定义无限个智能体和变量v多种内置命令帮助使用v支持整型和双精度型浮点数计算v跨平台、可复用的应用。二、NetLogo仿真框架1.NetLogo软件 2.模型的抽象v总体:大量的可移动主体在二维空间中交互作用,随着时间推进,微观个体的属性不断发生变化,系统的宏观特征也因此而变化。v从三个方面理解:主体空间表达仿真推进(1)主体(Agents)v虚
3、拟世界由主体构成,主体能够接受命令,进行活动,所有主体的行为并行并行发生。vNetLogo中共有三类主体,turtles(海龟)patches(瓦片)observer(观察者)主体类型vturtles指能够在世界中移动的主体。v世界是二维的,划分为由patches组成的网格,每个patch占据一个矩形小块。patch不能移动patch也是主体patch和turtle一样可以有自己的属性和行为vobserver是一个全局主体,它观察着由turtles和patches构成的世界,能够执行指令获取世界全部或部分的状态,或实现对世界的控制。虚拟世界(2)空间表达v每个patch有二维坐标(pxcor,
4、pycor)坐标值为整数整数。v默认情况下,二维世界的水平、垂直坐标范围为(-17,17)v每个turtle也有坐标(xcor,ycor)turtle坐标不必是整数不必是整数,因此turtle不一定正好位于某个patch的中心。v一个patch上也可以同时有多个turtles。v实际上对turtle而言,NetLogo的空间是连续的。(3)仿真推进v没有明确的仿真时钟变量,也没有提供特定的事件处理机制v仿真推进是通过不断重复执行某个例程实现的v模型中至少要有初始化初始化例程和仿真执行执行例程初始化例程初始化例程实现对模型初始状态的设置,生成所需的turtles,设置其状态,以及其它工作。仿真的
5、执行仿真的执行通过例程go实现,在go例程中编写所需执行的各种指令,完成一个仿真步的工作。需要在Interface页中建立一个按钮与go例程相联系,该按钮是一个永久(forever)按钮,点击后将不断重复执行go例程,直到遇到stop指令或用户再次点击该按钮则仿真终止。2.建模基本过程vNetLogo模型包括可视化部件和例程两部分,二者具有紧密联系。v先在Interface中创建可视化控件,然后在Procedures中实现相应的代码,通过设置控件的属性将二者联系起来。vInterface中主要有三类部件 运行控制参数控制仿真显示vProcedure中的例程分为两类:命令(command)例程报
6、告(reporter)例程仿真的基本框架初始化to setup每一个仿真周期to go是否结束?结束对所有Turtle循环ask turtles每个Turtle做出决策forward 1是否三、编程指南vbreed vturtles-own vglobals vto setup endvto go endvask turtles set pcolor white vset-default-shape turtles personvsetxy random-xcor random-ycorvset turtles-own randomvset age(22+random 53)vset age(
7、age+1)vset house 0vclear-all(ca)vforward(fd)1vcreate-turles 100vsprout-breeds number vsprout number vhatch number vhatch-breeds number vask one-of men set breed vif vifelse四、生态系统建模示例v假设要模拟一个简单的生态系统,v该系统中有一种生物以青草为食,通过吃草获取能量、v该类生物经历成长、繁殖、死亡过程。1.初始化v创建生物群体,并将它们随机分布在空间中。v例程(demo1)to setup ;定义例程setup cle
8、ar-all ;设置整个世界为初始状态 ;创建100个turtles,创建后各turtle默认坐标是(0,0)create-turtles 100 ;命令所有turtle执行语句setxy random-xcor random-ycor ;各turtle 坐标随机产生,实现turtles在空间中的随机分布 ask turtles setxy random-xcor random-ycorend2.仿真执行例程v实现turtle随机移动v实现go例程,与forever按钮联系vgo 调用move-turtles例程增加代码:(demo2)to go ;定义仿真执行例程go move-turtle
9、s ;调用例程move-turtlesendto move-turtles ;定义例程move-turtles ;所有turtle执行 中的命令序列 ask turtles right random 360 ;右转一个角度,度数随机产生 forward 1 ;前进距离1 end3.青草的模拟v为模拟青草的存在设置patches为绿色v改写setup 例程,其中调用了两个新的例程setup-turtles和setup-patches,分别设置turtle和patch的初始状态 demo3to setup clear-all setup-patches ;调用例程setup-patches set
10、up-turtles ;调用例程setup-turtlesendto setup-patches ;命令所有patches执行指令set pcolor green ;该指令将patch颜色设置为绿色 ask patchesset pcolor greenendto setup-turtles create-turtles 100 ask turtlessetxy random-xcor random-ycorend4.主体行为v现在增加一些行为,假设turtle以青草为食,通过吃草获得能量,移动时要消耗能量。vpatch代表青草,绿色表示有,黑色表示无。v为实现这样的模型,需要重新定义turt
11、les的属性和行为,然后重写go例程。首先给turtle增加变量energy以存储当前能量值,另外添加吃草获取能量的例程,还要修改移动例程以反映能量消耗。自定义turtle变量,修改goturtles-ownenergy ;声明turtle变量energyto go move-turtles ;turtle随机移动,消耗能量 eat-grass ;吃草获取能量end定义eat-grassvturtle吃草获取能量v修改patch颜色表示草的有无to eat-grass ;如果turtle所在patch颜色为绿色,表示有草,则吃草,;令该patch颜色变为黑色,表示已无草,然后自身能量增加10
12、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 ;繁殖
13、 check-death ;死亡 regrow-grass ;青草再生endto reproduce ask turtles if energy 50 ;如果能量大于50则繁殖 set energy energy-50 ;母体能量减少50 hatch 1 set energy 50 ;产生一个后代,初始能量50 endto check-death ask turtles if energy=0 die ;如果能量小于等于0则死亡endto regrow-grass ask patches ;青草以0.03的概率再生 if random 100=terminate-time stop ;判断是否
14、应停止 move-turtles eat-grass reproduce check-death regrow-grass do-plots set ticks ticks+1 ;时钟推进end五、建模技术1.访问邻域原语Neighbors ,Moore邻域neighbors4,von Neumann邻域 in-radius at-points 2.主体交互vT-P交互turtle能够直接访问所在之处的patch,对该patch的属性进行读写 vask turtles set pcolor blue turtle还可以利用空间相关操作获取所需的patches,然后对这些patches的属性进行
15、读写 vask turtles set pcolor-of patch-at 1 0 blue vpatch可以通过一些操作获取相关的turtle例如turtles-here就返回当前patch处的turtle集合。v也可以通过空间相关操作获取相应patch上的turtles。例如”turtles at dx dy”返回与当前patch相对距离(dx,dy)处的turtles集合。T-T交互v实现T-T交互的第一步是得到目标turtle的句柄,然后进行操作。v获取目标turtle句柄的常用方式有三种:随机选取、根据特定条件、空间相关。v随机选取是指在特定agent集合中以随机方式选取一个或n个
16、agent。选取一个agent的原语为one-of 例如“set color-of one-of turtles red”在所有turtles中随机选择一个turtle,将其颜色设为红色。v获得目标agent或agentset的第二种方式是根据特定条件。v方法是使用with原语,语法为agentset with condition,返回满足条件condition的agent集合。例如“turtles with color=red”返回红色的turtle集合;v获取目标agent或agent集合的第三种方式是运用空间相关操作。v比较直接的一种是获取当前patch上的turtle集合,原语有tur
17、tles-here和other-turtles-here,二者的区别仅在于是否包含调用者自身。例如“ask turtle 0 ask other-turtles-here fd 10”表示ID=0的turtle令处于同一patch上的其他turtle前进10。v另一种方式是获取特定patch上的所有turtles。原语有-at dx dy,-on agentset等。例如“turtles-at 1 0”返回右侧紧邻patch上的所有turtle,“turtles-on patch-ahead”返回前方patch上的所有turtle。3.多类异质主体vNetLogo可以定义不同类别(称为bree
18、ds)的turtles,各类turtle可以拥有特有的属性和例程。v定义关键词为breed,例如:breed wolves wolfbreed sheep a-sheepv一旦定义了一类turtle,系统自动创建该类所有turtle的集合,一些相关的原语也马上可以使用了,例如对于sheep类就有create-sheep、hatch-sheep、is-a-sheep?等。也可以指定该类具有的变量,例如对于sheep,“sheep-own grabbed?”就为sheep增加了一个变量。4.持久关系的建立v基本方法是在个体中相互保持对方的引用,这样可以随时对对方进行操作。v例如在个体之间建立简单的伙伴关系。假设还没有找到伙伴的个体随机移动,直到与另一个尚没有伙伴的个体建立伙伴关系,一旦建立伙伴关系后将长期保持。为实现这一模型,首先为turtle增加变量partner,用于保持对伙伴的引用,然后在移动时从相遇的一些无伙伴的turtle中选择一个,相互建立伙伴关系。