它是什么?
在Follower中,乌龟试图根据一小组简单的规则与其他乌龟“连接”,形成长链。
它是如何工作的?
乌龟只能追随另一个乌龟,同样它也只能被另一个乌龟追随。这意味着有四种乌龟状态,每种状态由不同的颜色表示:
- 品红色:未连接
- 绿色:跟随另一个乌龟(“尾巴”)
- 黄色:被另一个乌龟跟随(“头部”)
- 蓝色:跟随并被其他乌龟跟随(“身体”部分)
乌龟以品红色(未连接)状态创建。在每次转向时,每只乌龟检查周围一个正方形甜甜圈形状内的随机路径。如果它在那里找到一个尚未被跟随的乌龟,它将“抓住”并开始跟随那只乌龟的移动。一个未连接的乌龟(尚未“抓住”其他乌龟的乌龟)将会随机移动。
如何使用它
SETUP:清除世界并创建在POPULATION滑块中指定数量的乌龟。所有乌龟都以未连接状态(品红色)创建。
GO:运行模拟。
POPULATION:指定在SETUP中创建的乌龟数量。
NEAR-RADIUS:乌龟搜索的甜甜圈内半径。
FAR-RADIUS:乌龟搜索的甜甜圈外半径。
WAVER:非跟随乌龟移动的随机性量。
还有一个名为“Turtle Count”的图表,它会随时间显示每种状态的乌龟数量。
注意事项
每个滑块对模拟都有不同的影响。
注意当乌龟数量很高时,链条往往会非常快地形成。这是因为有更多的乌龟,因此每只乌龟在每次转向时都有更多的机会连接。
改变甜甜圈的大小倾向于影响乌龟如何开始连接,但从长远来看对模拟结果影响不大。在非常小的值下,甜甜圈大小最有趣,这导致乌龟连接成非常小的循环。另外,非常大的厚甜甜圈(大FAR-RADIUS,小NEAR-RADIUS)在有大量乌龟时看起来很有趣。
移动随机性的量(由WAVER设置)也可以改变模拟结果。WAVER的值非常高会导致形成小循环,因为乌龟不断地在自己身上移动,增加将链条头部连接到尾部的机会。
在任何参数下,模拟都会朝着形成循环的方向发展。循环可能是通过环绕世界而形成的,但几乎在所有情况下,如果模拟运行足够长时间,你将得到许多小循环或一个大循环。如果WAVER滑块设置为零,链条将永远不会连接到自己,但否则模拟应该会朝着循环进行。
尝试的事情
尝试将waver设置得很高。注意乌龟如何聚集成小团。这是因为它们经常在自己身上移动,这增加了连接到它们尾部的机会。如果甜甜圈允许乌龟检查到它们附近,这是有道理的,但如果不能(NEAR-RADIUS很大),同样的事情仍然会发生。为什么会这样?
注意我们正在绘制所有四种可能的乌龟状态,但图表上只显示了三种。你知道为什么吗?
扩展模型
尝试实现不同的规则来让乌龟相互跟随。例如,如果关闭世界包裹,将会看到有趣的结果。或者,如果允许两只乌龟有相同的领导者,会怎么样?
你也可以尝试让乌龟有一定的概率再次分开。看看这会如何影响它们形成的图案。
代码
turtles-own [
leader ;; the turtle this turtle is following,
;; or nobody if not following
follower ;; the turtle that is following this turtle,
;; or nobody if not being followed
]
to setup
clear-all
create-turtles population
[ set color magenta
setxy random-xcor random-ycor
set leader nobody
set follower nobody ]
reset-ticks
end
to go
ask turtles
[ if leader = nobody
[ attach-turtle ] ]
ask turtles [ turn-turtle ]
ask turtles [ fd 1 ]
tick
end
to attach-turtle ;; turtle procedure
;; find a random patch to test inside the donut
let xd near-radius + random (far-radius - near-radius)
let yd near-radius + random (far-radius - near-radius)
if random 2 = 0 [ set xd (- xd) ]
if random 2 = 0 [ set yd (- yd) ]
;; check for free turtles on that patch
let candidate one-of (turtles-at xd yd) with [follower = nobody]
;; if we didn't find a suitable turtle, stop
if candidate = nobody [ stop ]
;; we're all set, so latch on!
ask candidate [ set follower myself ]
set leader candidate
;; change our color
ifelse follower = nobody
[ set color lime ]
[ set color sky
set shape "line" ]
;; change our leader's color
ask candidate
[ ifelse leader = nobody
[ set color yellow ]
[ set color sky
set shape "line" ] ]
end
to turn-turtle ;; turtle procedure
;; if we are still unattached...
ifelse leader = nobody
;; do a somewhat random glide
[ rt random-float waver - random-float waver ]
;; otherwise follow the leader
[ face leader ]
end
; Copyright 1998 Uri Wilensky.
; See Info tab for full copyright and license.