Netlogo文档都是英文,相关教程也比较少,在扒过一个代码之后发现如果不把结构和命令研究明白很难调好代码,开一个笔记记录一下学习过程。
学习素材也主要来自于官方文档和文心一言回答。
我们仍然以ant-lines为例
netlogo中不同颜色的关键字大致分为三种类型:
- 绿色:通常用于表示定义新事物的命令或原语。这些可能包括定义新过程(使用
to
和end
关键字)、创建新的海龟(create-turtles
)、补丁(patches
)或链接(links
)等。 - 蓝色:通常用于表示要求代理人(如海龟或补丁)执行动作的原语。这些可能包括移动海龟(
setxy
)、改变颜色(set color
)、执行某些行为(如forward
、turn-right
等)等。 - 紫色:通常用于表示报告值的原语,这些原语返回某个值但不改变模拟世界的状态。例如,
xcor
和ycor
返回海龟的当前x和y坐标,color
返回海龟或补丁的颜色等。
第一部分
定义
绿色:通常用于表示定义新事物的命令或原语。这些可能包括定义新过程(使用to
和end
关键字)、创建新的海龟(create-turtles
)、补丁(patches
)或链接(links
)等。
breed
breed [ leaders leader ] breed [ followers follower ]
breed
是一个关键字,用于创建新的代理(agent)种类或“品种”(breed)。这些代理可以是乌龟(turtles)、链接(links)或其他类型的对象,具体取决于你的模型需要。
使用breed
而不是简单的turtles-own
或patches-own
等,可以使得代码更清晰,更容易维护,特别是当模型变得复杂时。
通过breed 声明后 可使用create 、ask命令来配置agent
create-leaders 1 [ set color red ] ;;设置颜色
ask leaders [ set pen-size 2 pen-down ] ;;设置痕迹大小和确定是否留下轨迹
ask leaders [ wiggle leader-wiggle-angle correct-path ;;让leader在一定范围内摇头 if (xcor > (food-x - 5 )) [ facexy food-x food-y ] if xcor < food-x [ fd 0.5 ] ]
globals
globals [ nest-x nest-y ;; location of center of nest food-x food-y ;; location of center of food ]
这个就是声明全局变量,nest-x,nest-y应该是二维上对坐标定义的一种类型,声明后后面应该就都可以对变量进行操作了。
to & end
to 的使用包括to setup;to go;to correct-path;to-report; 后接end结尾
在NetLogo中,to
关键字用于定义过程(也称为函数或方法)。NetLogo的过程允许你封装一系列的命令,然后可以通过调用这个过程名来重复执行这些命令。使用过程可以使你的代码更加模块化和可重用。
可以是无参也可以有参
有参情形:
to create-turtles-with-color [n turtle-color][...] ;
动作
蓝色:通常用于表示要求代理人(如海龟或补丁)执行动作的原语。这些可能包括移动海龟(setxy
)、改变颜色(set color
)、执行某些行为(如forward
、turn-right
等)等。
NetLogo是一个强大的建模环境,提供了丰富的命令和动作供用户创建和模拟各种复杂系统。在NetLogo中,动作(或称为命令)是代理执行的动作,用于指导代理的行为。以下是一些NetLogo中常见的动作和概念:
- 基本动作:
create-turtles number
:创建指定数量的海龟(turtles)。set [variable] value
:设置海龟或patches的变量值。move-to xcor ycor
:移动海龟到指定的坐标。forward distance
:海龟向前移动指定的距离。right angle
或left angle
:海龟右转或左转指定的角度。
- 询问与报告:
ask agents [commands]
:向指定的代理(如海龟或patches)发送命令。[reporter] of agent
:获取代理的某个属性值。
- 监控与观察:
plotxy x-list y-list
:在绘图区域绘制x和y值的图表。monitor variable
:在界面上显示某个变量的值。
- 列表操作:
let mylist [1 2 3]
:创建一个包含元素的列表。item index list
:获取列表中指定索引位置的元素。replace-item index list new-value
:替换列表中指定索引位置的元素。
- 随机数与概率:
random number
:生成指定范围内的随机数。random-float number
:生成0到指定数之间的随机浮点数。ifelse [condition] [then-commands] [else-commands]
:基于条件执行不同的命令。
- 定时与事件:
tick
:推进模拟的时间步。every n [commands]
:每n个时间步执行一次命令。at time [commands]
:在指定的时间执行命令。
- 模型控制:
setup
和go
:模型的初始化和运行过程。clear-all
:清除所有的海龟、patches、链接和变量。reset-ticks
:将时间步重置为0。
- 界面与交互:
show-turtle
和hide-turtle
:显示或隐藏海龟。set-color color
:设置海龟或patches的颜色。set-label label
:给海龟设置标签。
- 链接与网络:
create-links-from turtles [commands]
:从指定的海龟创建链接。create-links-with other-turtles [commands]
:在当前海龟和其他海龟之间创建链接。
- 文件和I/O:
file-open "filename.txt"
:打开文件。file-write string
:向文件写入字符串。file-close
:关闭文件。
这只是一个大致的概述,NetLogo的功能非常丰富,提供了大量的内置命令和动作,以及用户自定义函数和过程的能力。通过组合这些动作,用户可以创建出复杂且高度定制化的模型。要深入了解NetLogo的所有动作和特性,建议查阅NetLogo的官方文档或相关教程。
sprout
sprout 1[]
sprout
通常用于patches上,它使得每个符合条件的patch上生成一个或多个海龟.
原语
紫色:通常用于表示报告值的原语,这些原语返回某个值但不改变模拟世界的状态。例如,xcor
和 ycor
返回海龟的当前x和y坐标,color
返回海龟或补丁的颜色等。
紫色中有一个比较特殊的关键字turtles
在NetLogo中,“turtles”是其中一个重要的主体类型,它们代表了可以在世界中移动和交互的个体。这些“海龟”可以根据编程的指令执行各种动作,比如移动、改变方向、改变颜色等。它们常常用于模拟自然和社会现象中的移动实体,如行人、车辆、动物等。
NetLogo的模型构建者可以通过编程来控制这些海龟的行为。例如,可以为海龟设置特定的移动规则、交互规则,以及响应环境变化的方式。通过大量的海龟在二维空间中的交互作用,可以模拟复杂系统的演化过程,并观察系统的宏观特性如何随时间推移而发生变化。
同时,NetLogo提供了丰富的命令和原语来操作海龟。例如,可以使用create-turtles
命令创建新的海龟,使用setxy
命令设置海龟的位置,使用set heading
命令设置海龟的朝向,以及使用forward
命令让海龟向前移动等。
综上所述,NetLogo中的“turtles”是构建仿真模型的重要组件,它们通过编程控制的行为和交互作用,使得模拟复杂系统的演化成为可能。
NetLogo的原语数量相当多,涵盖了各个方面,从基本的代理控制到复杂的数学运算和图形界面交互等。在这里,我无法提供NetLogo中所有原语的示例,因为这将是一个极其庞大且详尽的列表。然而,我可以为你提供一些常见和重要的原语示例,并建议你查阅NetLogo的官方文档或参考手册以获取完整的原语列表和详细示例。
以下是一些常见NetLogo原语的示例:
代理控制:
netlogo复制代码
create-turtles 100 ; 创建100个海龟 | |
ask turtles [setxy random-xcor random-ycor] ; 随机设置海龟的位置 | |
ask patches with [pxcor > 5] [set pcolor blue] ; 将x坐标大于5的patches设置为蓝色 |
变量和属性:
netlogo复制代码
turtles-own [age] ; 定义海龟拥有一个名为age的属性 | |
set age 0 ; 设置海龟的age属性为0 | |
print (age of turtle 0) ; 打印海龟0的age属性值 |
列表操作:
netlogo复制代码
let mylist [1 2 3 4 5] ; 创建一个包含数字的列表 | |
print item 2 mylist ; 打印mylist中索引为2的元素(即3) | |
set mylist replace-item 2 mylist 10 ; 将mylist中索引为2的元素替换为10 |
数学运算:
netlogo复制代码
let sum sum [age] of turtles ; 计算所有海龟age属性的总和 | |
let average mean [age] of turtles ; 计算所有海龟age属性的平均值 |
随机数:
netlogo复制代码
let random-num random 100 ; 生成一个0到99之间的随机整数 | |
let random-float random-float 1.0 ; 生成一个0到1之间的随机浮点数 |
时间和模拟控制:
netlogo复制代码
reset-ticks ; 重置时间步计数器为0 | |
tick ; 推进一个时间步 |
图形界面和交互:
netlogo复制代码
set-default-shape turtles "circle" ; 设置海龟的默认形状为圆形 | |
create-plot "Population" ; 创建一个名为"Population"的图表 | |
plotxy ticks [count turtles] ; 在图表上绘制时间步和海龟数量的关系 |
字符串操作:
netlogo复制代码
let my-string "Hello, NetLogo!" ; 创建一个字符串 | |
print substring my-string 1 5 ; 打印my-string中从索引1到5的子串(即"ello") |
这些只是一小部分示例,NetLogo的原语涵盖了非常广泛的功能和用法。为了获取完整的原语列表和详细的示例,我建议你查阅NetLogo的官方文档。在NetLogo的界面中,你可以通过点击“帮助”菜单,然后选择“用户手册”或“命令参考”来获取这些资源。这些文档将提供详尽的原语列表、描述、示例以及用法说明,帮助你充分利用NetLogo的功能来构建复杂的模型。
回归普通常见原语min-pxcor;color shape size 等等都是一些属性,并且可以对其进行修改
通常用set进行操作,下面介绍一些代码中比较特殊的原语。
patch
表示“方格”,用于表示空间中的位置、资源分布、环境特征等。Patches可以具有不同的属性,如颜色、形状、状态等,并可以包含一个或多个变量。
ask patch 假设你有一个模型,其中每个patch都存储了一些关于食物量的信息,你可以使用 ask patch
来设置或查询这个信息。
ask patch nest-x nest-y [ sprout 1 [ set color brown set shape "circle" set size 10 stamp die ] ]
这段代码的含义就是查询nest所在的patch信息并对他进行操作。
who
在NetLogo中,who
是一个常用的报告者(reporter),它返回当前代理(例如海龟或链接)的唯一标识符。每个代理在NetLogo的模型中都有一个唯一的整数ID,这个ID就是who
所返回的值。
[ face turtle (who - 1) if time-to-start? and (xcor < food-x) [ fd 0.5 ] ]
这行代码使当前的海龟(代理)面向ID比它小1的海龟。在模拟中,这通常意味着当前的海龟(可能是一个跟随者)在跟随其前面的海龟(可能是一个领导者)。who
是当前海龟的ID,who - 1
则是前面一个海龟的ID(假设ID是连续且递增的)。face
命令使当前海龟调整其朝向,使其面对指定的海龟。
random
常用生成随机数
let random-num random 100
if(random-num >= 50)[die] ;50概率死亡