花卉模型与代码

本文介绍了一个基于简单规则的乌龟连接模拟,探讨了乌龟之间的跟随关系和状态变化,以及如何通过参数调整影响模拟结果。作者还鼓励读者尝试扩展模型和修改规则以观察不同效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

它是什么?

在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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异数时空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值