我想根据高斯分布在一些x和y坐标范围内随机放置海龟,同一个地方没有两只海龟。
我尝试过的事情: 1.存在http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-normal 但是我如何避免海龟找到相同的补丁。
我以前用过的代码(只是随机分发):
ask n-of population patches-in-box
[
sprout-inboxturtles 1
]
;人口数 - 海龟数量 ;盒子里的补丁 - 我想放置海龟
答案 0 :(得分:2)
对于正态分布,没有内置的等效n-of
(并且我不清楚如果有的话应该是什么)。因此,您必须使用random-normal
并根据您的特殊情况进行调整:
to distribute-turtles [ pop box ]
if pop > count box [ error "Box can't hold all turtles!" ]
let ys [ pycor ] of box
let xs [ pxcor ] of box
let min-x min xs
let min-y min ys
let max-x max xs
let max-y max ys
let mid-x mean list min-x max-x
let mid-y mean list min-y max-y
let w max-x - min-x
let h max-y - min-y
crt pop [
loop [
let x random-normal mid-x (w / 6)
if x > max-x [ set x max-x ]
if x < min-x [ set x min-x ]
set xcor x
let y random-normal mid-y (h / 6)
if y > max-y [ set y max-y ]
if y < min-y [ set y min-y ]
set ycor y
if not any? other turtles-here [ stop ]
]
move-to patch-here ; to center in patch
]
end
这是你如何称呼它的一个例子:
to setup
ca
let population 100
let patches-in-box patches with [ abs pxcor < 10 and abs pycor < 10 ]
ask patches-in-box [ set pcolor black + 2 ]
distribute-turtles population patches-in-box
end
一些注意事项:
如果您直接传递min-x
,max-x
,min-y
和max-y
代码,而不是从{{中找出这些值,那么代码效率会更高1}} agentset,但除非你的盒子真的很大,否则不应该产生巨大的差异。
我们需要确保box
小于补丁的数量,否则它会永远循环,因为没有任何免费的补丁放在哪里放龟:这就是为什么我们扔发生时的错误。 pop
越接近pop
,即使它没有错误,也需要更长的时间才能完成,因为最后几只乌龟很难找到一个位置。
您可以使用标准偏差(count box
和w / 6
)来获得所需的分布形状(这基本上就是钟形曲线的“陡度”)。
h / 6
理论上是无界限的,因此它可以为您提供框外的坐标。这就是我们将结果“剪辑”到最小和最大可能坐标的原因。如果您的标准偏差太高,您可能会发现很多海龟最终“卡在”盒子的边框上。
答案 1 :(得分:2)
我刚刚意识到你可以通过使用NetLogo rnd:weighted-n-of
的Rnd Extension原语彻底解决速度问题!以下是一些修订后的代码:
extensions [ rnd ]
to distribute-turtles [ pop box ]
if pop > count box [ error "Box can't hold all turtles!" ]
let ys [ pycor ] of box
let xs [ pxcor ] of box
let min-x min xs
let min-y min ys
let max-x max xs
let max-y max ys
let mid-x mean list min-x max-x
let mid-y mean list min-y max-y
let w max-x - min-x
let h max-y - min-y
ask rnd:weighted-n-of pop box [
[ (p (pxcor - mid-x) (w / 6)) * (p (pycor - mid-y) (h / 6)) ] of ?
] [ sprout 1 ]
end
to-report p [ x std-dev ]
report (1 / (std-dev * sqrt (2 * pi))) * e ^ (0 - ((x ^ 2) / (2 * (std-dev ^ 2))))
end
rnd:weighted-n-of
的作用是代理集(或列表)和记者任务应该返回&#34;权重&#34;对于每个元素。权重较大的元素有更好的被挑选机会。在我们的示例中,我们使用probability density function的normal distribution(代码中的p
报告者)将这些权重分配给框中的修补程序。
您可以像我的其他答案一样使用distribute-turtles
:
to setup
ca
let patches-in-box patches with [ abs pxcor < 10 and abs pycor < 10 ]
let population (count patches-in-box - 10)
ask patches-in-box [ set pcolor black + 2 ]
distribute-turtles population patches-in-box
end
...但在这种情况下,即使population
几乎与count patches-in-box
一样大,代码也会非常快速地运行。为什么?因为rnd:weighted-n-of
是&#34;聪明&#34;足以有时丢弃已经被挑选的元素,并继续挑选尚未被挑选的元素。 (如果您对细节感兴趣,可以查看the underlying Scala code。)在我们的情况下,这意味着盒子中心附近的补丁不会一次又一次地被挑选失败:只有免费的地方将继续发挥作用。