netlogo的基本用法及其案例
·
以下是 NetLogo 的基本用法 及 典型案例 的详细说明,结合操作步骤和实际建模示例,帮助快速上手:
一、基本用法:从安装到建模
1. 安装与启动
- 下载:从 NetLogo官网 下载对应系统的安装包(支持Windows、macOS、Linux),安装后启动程序。
- 界面概览:
- 视图(View):可视化网格世界,显示海龟(可移动个体)和补丁(网格环境)。
- 代码编辑区:编写模型逻辑(NetLogo语言,类Lisp语法)。
- 界面元素:按钮(Buttons)控制仿真开始/停止,滑动条(Sliders)调节参数,监视器(Monitors)显示实时数据。
2. 核心概念快速入门
(1)主体类型
- 海龟(Turtles):
- 创建:
create-turtles <数量>(如create-turtles 50生成50只海龟)。 - 操作:
ask 海龟集合 [ 命令 ](如ask turtles [ fd 1 ]让所有海龟前进1步)。
- 创建:
- 补丁(Patches):
- 坐标:每个补丁用
(pxcor, pycor)表示(范围默认-179到179,可在设置中修改)。 - 操作:
ask patches with [ 条件 ] [ 命令 ](如ask patches with [ pxcor > 0 ] [ set pcolor red ]将x坐标>0的补丁染红)。
- 坐标:每个补丁用
(2)基础语法
- 命令示例:
- 移动:
fd <距离>(前进)、bk <距离>(后退)、rt <角度>(右转)、lt <角度>(左转)。 - 条件:
if <条件> [ 命令 ]或ifelse <条件> [ 命令1 ] [ 命令2 ]。 - 循环:
repeat <次数> [ 命令 ]或while <条件> [ 命令 ]。
- 移动:
- 变量类型:
- 海龟变量:
turtles-own [ age speed ](为每只海龟定义“年龄”和“速度”)。 - 补丁变量:
patches-own [ resource ](为每个补丁定义“资源量”)。 - 全局变量:
globals [ simulation-time ](定义全局时间变量)。
- 海龟变量:
3. 建模步骤(以“随机漫步”为例)
(1)定义主体与初始化
- 在代码区添加:
turtles-own [ energy ] ; 定义海龟的“能量”属性 to setup ; 初始化过程(通常与“设置”按钮绑定) clear-all ; 清除现有主体和补丁 create-turtles 10 [ ; 创建10只海龟 set color blue ; 设置颜色为蓝色 set size 2 ; 设置大小为2 set energy 100 ; 初始能量100 setxy random-xcor random-ycor ; 随机分布在网格中 ] ask patches [ set pcolor green ] ; 所有补丁设为绿色 end
(2)编写行为规则(每时间步执行)
- 定义
go过程(通常与“运行”按钮绑定):to go ; 每个时间步执行的过程 ask turtles [ set energy energy - 1 ; 每步消耗1能量 if energy > 0 [ ; 能量耗尽时海龟死亡 rt random 360 ; 随机转向0-360度 fd 1 ; 前进1步 ; 与补丁交互:若进入边缘补丁,能量恢复50 if pxcor = max-pxcor or pxcor = min-pxcor or pycor = max-pycor or pycor = min-pycor [ set energy energy + 50 ] ] else [ die ] ; 能量为0时删除海龟 ] tick ; 时间步+1 end
(3)设置界面元素
- 在界面编辑器中:
- 添加“设置”按钮,关联
setup过程。 - 添加“运行/停止”按钮,关联
go过程,设置运行速度(如每秒10步)。 - 添加监视器
turtle-count显示当前海龟数量,tick显示时间步。
- 添加“设置”按钮,关联
(4)运行与调试
- 点击“设置”初始化模型,点击“运行”观察海龟随机移动,边缘处能量恢复,部分海龟因能量耗尽消失。
- 调试技巧:用
show <变量>在控制台打印数据,或用“探针”点击海龟查看其energy属性。
二、典型案例:从简单到复杂
案例1:捕食者-猎物模型(经典生态模拟)
目标:模拟捕食者(狼)与猎物(羊)的数量动态,观察种群周期性波动。
核心规则:
- 羊:随机移动,每吃到1个草补丁(绿色)增加能量并可能繁殖,能量耗尽死亡。
- 狼:追逐最近的羊,捕获后增加能量并可能繁殖,未捕获时消耗能量直至死亡。
关键代码:
; 定义主体类型
turtles-own [ type energy ] ; type=0(羊)或1(狼)
patches-own [ grass grow-time ] ; grass=1表示有草,grow-time记录草的生长时间
to setup
clear-all
create-turtles 50 [ set type 0 set energy 100 ] ; 50只羊
create-turtles 10 [ set type 1 set energy 200 ] ; 10只狼
ask patches [ set grass 0 set grow-time 0 ] ; 初始无草
ask n-of 20 patches [ set grass 1 ] ; 生成20个草补丁
end
to go
; 羊的行为
ask turtles with [ type = 0 ] [
move-to one-of neighbors4 ; 随机移动到相邻补丁
if patch-here [ grass ] = 1 [ ; 吃到草
set energy energy + 50
set patch-here grass 0 ; 草被吃掉
if random 100 < 10 [ reproduce ] ; 10%概率繁殖
]
set energy energy - 5 ; 消耗能量
if energy <= 0 [ die ]
]
; 狼的行为
ask turtles with [ type = 1 ] [
let nearest-sheep min-one-of turtles with [ type = 0 ] [ distance myself ]
if nearest-sheep != nobody [ ; 发现羊
face nearest-sheep
fd 1
if [ type ] of patch-here = 0 [ ; 捕获羊
set energy energy + 100
ask patch-here [ die ] ; 杀死羊
if random 100 < 5 [ reproduce ] ; 5%概率繁殖
]
]
set energy energy - 10 ; 消耗更多能量
if energy <= 0 [ die ]
]
; 草的再生
ask patches [
if grass = 0 and grow-time >= 20 [ set grass 1 set grow-time 0 ] ; 20步后再生
set grow-time grow-time + 1
]
tick
end
观察结果:
- 视图中红色代表狼,蓝色代表羊,绿色代表草。
- 统计图表显示狼和羊的数量呈周期性波动(捕食者-猎物振荡),草的分布影响种群动态。
案例2:交通拥堵模拟(简单路口模型)
目标:模拟车辆在十字路口的行驶规则,观察红绿灯对拥堵的影响。
核心规则:
- 车辆(海龟)沿道路(补丁标记为灰色)行驶,遇到路口时根据红绿灯转向(红灯停,绿灯行)。
- 车辆速度固定,间距过近时减速避免碰撞。
关键步骤:
- 初始化道路:用补丁绘制十字道路(横向和纵向道路,路口中心补丁标记为路口)。
- 车辆生成:在道路两端定期生成车辆,设置初始行驶方向(横向或纵向)。
- 红绿灯逻辑:每20步切换红绿灯,控制对应方向车辆通行。
代码片段(简化版):
patches-own [ road direction light ] ; direction=0(横向)或1(纵向),light=0(红)或1(绿)
to setup
; 绘制横向道路(x从-50到50,y=0)
ask patches with [ ycor = 0 and abs(xcor) <= 50 ] [ set pcolor gray set road true set direction 0 ]
; 绘制纵向道路(y从-50到50,x=0)
ask patches with [ xcor = 0 and abs(ycor) <= 50 ] [ set pcolor gray set road true set direction 1 ]
; 路口中心补丁设为红绿灯控制
ask patch 0 0 [ set light 0 ] ; 初始横向红灯(纵向绿灯)
end
to go
; 切换红绿灯(每20步)
if tick mod 20 = 0 [ ask patch 0 0 [ set light 1 - light ] ]
; 车辆移动
ask turtles [
if not on-road? [ die ] ; 离开道路则消失
let next-patch ahead 1
if next-patch = patch 0 0 [ ; 到达路口
if [ direction ] of myself = 0 and [ light ] of patch 0 0 = 0 [ stop ] ; 横向红灯时停止
if [ direction ] of myself = 1 and [ light ] of patch 0 0 = 1 [ stop ] ; 纵向绿灯时通行
] else [ fd 1 ] ; 非路口正常行驶
]
; 生成新车辆(道路两端)
if random 10 < 1 [ ; 10%概率生成车辆
let start-x ifelse random 2 = 0 [ -50 ] [ 50 ] ; 横向道路两端
let start-y ifelse random 2 = 0 [ -50 ] [ 50 ] ; 纵向道路两端
create-turtles 1 [ setxy start-x 0 set direction 0 ] ; 横向车辆
create-turtles 1 [ setxy 0 start-y set direction 1 ] ; 纵向车辆
]
tick
end
观察结果:
- 无红绿灯时路口频繁堵塞,引入红绿灯后车辆有序通过,可通过调整红绿灯时长优化通行效率。
案例3:舆论扩散模型(社会传播模拟)
目标:模拟观点在人群中的传播,假设个体倾向于接受邻居中占多数的观点。
核心规则:
- 每个个体(海龟)有观点
opinion(0或1),每步观察周围邻居的观点,若多数为1则自己转为1,否则保持0。 - 初始时随机分布少量观点1的个体,观察观点如何扩散。
关键代码:
turtles-own [ opinion ]
to setup
clear-all
create-turtles 1000 [ ; 1000个个体
set size 1
set opinion random 2 ; 初始观点随机0或1
set color ifelse opinion = 0 [ blue ] [ red ] ; 蓝色=0,红色=1
setxy random-xcor random-ycor
]
end
to go
ask turtles [
let neighbors-opinions [ opinion ] of neighbors4 ; 获取4邻域观点
let count-1 count neighbors-opinions with [ ? = 1 ]
let count-0 count neighbors-opinions with [ ? = 0 ]
if count-1 > count-0 [ ; 多数为1则改变观点
set opinion 1
set color red
] else if count-0 > count-1 [ ; 多数为0则保持0
set opinion 0
set color blue
] ; 平局时保持不变
]
tick
end
观察结果:
- 初始随机分布的红色个体(观点1)可能逐渐扩大或缩小,最终形成大面积同色区域,体现“从众效应”。
三、进阶技巧与资源
1. 内置模型库
- NetLogo自带 Model Library(通过菜单
File → Model Library访问),包含100+预建模型,如:- 生物学:Langton’s Ant(兰顿蚂蚁)、森林火灾、细菌觅食。
- 社会学:隔离模型(Schelling Model)、谣言传播、城市扩张。
- 物理学:元胞自动机(康威生命游戏)、热扩散。
- 直接打开模型后,可查看代码、修改参数、运行观察,是学习建模的最佳起点。
2. 数据收集与分析
- 记录数据:用
file-open和file-write将每时间步的海龟数量、平均属性等写入文件:to log-data file-open "results.csv" append? true [ file-write tick "," turtle-count "," mean [ energy ] of turtles cr ] end - 可视化分析:使用内置图表(
Plots)实时绘制曲线,或导出数据到Excel、Python进一步分析。
3. 连续空间与3D建模
- NetLogo默认是离散网格,但支持 连续坐标(海龟可在任意实数坐标移动),通过
setxy <x> <y>实现。 - 实验性支持 3D视图(需启用扩展),用于模拟立体环境(如空中无人机群)。
四、总结:NetLogo适合谁?怎么用?
- 适合场景:
- 快速验证假设(如“个体自私行为是否导致公共资源崩溃”)。
- 教育演示(向非专业人士展示复杂系统如何由简单规则涌现)。
- 跨学科研究(生态、社会、交通、工程等领域的多主体模拟)。
- 学习路径:
- 从内置模型库入手,运行并修改示例模型。
- 掌握海龟-补丁交互的基础语法(
ask、with、条件判断)。 - 尝试小型建模项目(如案例1的捕食者-猎物),逐步添加复杂规则。
通过以上步骤,可快速入门NetLogo并构建自己的多主体模型,重点在于通过“微观规则→宏观现象”的映射,理解复杂系统的运行逻辑。
更多推荐
所有评论(0)