在 NetLogo 中修改海龟的布局圆

Modify a layout-circle for turtles in NetLogo

我正在尝试让 Ne​​tLogo 中的 layout-circle 让每一只乌龟向中心移动一个坐标,而其余的则远离它。我找到了使用 random 的方法,但结果并不是很整洁。我想要得到的是围绕圆圈以之字形方式定位的海龟,没有我得到的随机成分。例如,所有偶数的海龟都向中心移动,而所有奇数的海龟都远离。

任何想法,希望这足够清楚?

to setup
  clear-turtles
  create-turtles 100
  layout-circle (sort turtles) max-pxcor - 1
  ask turtles [setxy xcor (ycor + random 3 - 1)]
end

鉴于您的海龟已排序,使用它们的 who 会起作用。另外,如果你想保留圆形布局,你应该让海龟沿着半径而不是根据世界坐标移动(如果你不想要随机效果,一定要去掉 random)。

在我们继续之前,一个很大的警告:你会经常读到使用代理的 who 是糟糕的 NetLogo 编码实践(我自己仍然需要准确理解为什么那是危险的)。 考虑到您的海龟在布局中进行了排序,并假设这段文字仅在设置时发生,我认为在您的情况下使用 who 是足够安全的 - 但是,我还包括一种不使用 [=12 的方法=],在未分类的海龟的情况下也需要。

在这两种情况下,结果都是这样的:

(注意这个完美的曲折只有在海龟数量为偶数时才有可能)

接近 who

to setup
  clear-turtles
  create-turtles 100
  layout-circle (sort turtles) max-pxcor - 1

  ask turtles [
    ifelse (who mod 2 = 0)
      [forward 0.5]
      [forward -0.5]
  ]
end

这样做,每只偶数的乌龟都会向前移动一点,而每只奇数的乌龟都会向后移动相同的量。

没有who

的方法

这必须更详细地说明。

我们利用了这样一个事实,如果我们让海龟从圆形布局中交替向前和向后移动(通过ifelse (counter mod 2 = 0) [] []实现),那么离最后移动的海龟最近的海龟(移动的海龟是reference-turtle 在代码中)将是下一个尚未移动的圆周上的乌龟。

在每次while迭代结束时,当前reference-turtle会要求最近的海龟成为新的reference-turtle

为了使这一切都有效,我们可以使用 counter 作为 while 循环的停止条件和海龟知道是向前还是向后移动的条件

to setup
  clear-turtles
  create-turtles 100
  layout-circle turtles max-pxcor - 1

  let counter 0
  let reference-turtle one-of turtles
  
  while [counter < count turtles] [
    ask reference-turtle [
      ifelse (counter mod 2 = 0)
        [forward 0.5]
        [forward -0.5]
      
      ask min-one-of other turtles [distance myself] [
        set reference-turtle self
      ]
    ]
    
    set counter counter + 1
  ]
end