netlogo多代理仿真软件介绍

Download Report

Transcript netlogo多代理仿真软件介绍

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不能移动
 patch也是主体
 patch和turtle一样可以有自己的属性和行为

observer是一个全局主体,它观察着由turtles和
patches构成的世界,能够执行指令获取世界全部或
部分的状态,或实现对世界的控制。
虚拟世界
Observer
Turtle
Patch
(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
move-turtles
end
;;定义仿真执行例程go
;;调用例程move-turtles
to move-turtles
;;定义例程move-turtles
;;所有turtle执行[ ]中的命令序列
ask turtles[
right random 360 ;;右转一个角度,度数随机产生
forward 1
;;前进距离1
]
end
3.青草的模拟
 为模拟青草的存在设置patches为绿色
 改写setup
例程,其中调用了两个新的例程
setup-turtles和setup-patches,分别设置
turtle和patch的初始状态
demo3
to setup
clear-all
setup-patches
setup-turtles
end
;;调用例程setup-patches
;;调用例程setup-turtles
to setup-patches
;;命令所有patches执行指令set pcolor green
;;该指令将patch颜色设置为绿色
ask patches[set pcolor green]
end
to setup-turtles
create-turtles 100
ask turtles[setxy random-xcor random-ycor]
end
4.主体行为
现在增加一些行为,假设turtle以青草为食,通过吃
草获得能量,移动时要消耗能量。
 patch代表青草,绿色表示有,黑色表示无。
 为实现这样的模型,需要重新定义turtles的属性和
行为,然后重写go例程。

 首先给turtle增加变量energy以存储当前能量值,
 另外添加吃草获取能量的例程,
 还要修改移动例程以反映能量消耗。
自定义turtle变量,修改go
turtles-own[energy]
to go
move-turtles
eat-grass
end
;;声明turtle变量energy
;;turtle随机移动,消耗能量
;;吃草获取能量
定义eat-grass
 turtle吃草获取能量
 修改patch颜色表示草的有无
to eat-grass
;;如果turtle所在patch颜色为绿色,表示有草,则吃草,
;;令该patch颜色变为黑色,表示已无草,然后自身能量增加10
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
ask turtles[
if energy<=0 [die]
]
end
;;如果能量小于等于0则死亡
to regrow-grass
ask patches[
;;青草以0.03的概率再生
if random 100<3 [set pcolor green]
]
end
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
end
;;绘制初始点
;;随仿真运行绘制图形
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] ;;绘制青草数量
end
7.仿真参数控制
 参数控件
开关(switch)、滑动条(slider)、选择器(chooser)
这些控件都对应一个全局变量,在Procedures中
将这些全局变量作为参数使用在程序中,就能实
现仿真参数的控制。
例如:选择仿真时长
 用滑动条设置仿真时长,对应变量名
terminate-time
 添加全局变量ticks
 修改go例程,
随着仿真修改ticks
当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