在 NetLogo 中修改海龟的布局圆
Modify a layout-circle for turtles in NetLogo
我正在尝试让 NetLogo 中的 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
我正在尝试让 NetLogo 中的 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