Netlogo 获得一定距离内所有邻居的推力
Netlogo Get a pushing force from all neighbours within a distance
对于每只海龟,我有一个名为 visible-neighbors 的代理集,它们是一定距离内的海龟。
我想从每个可见的邻居那里得到对这只乌龟的拉力。然后总结力量。对于来自一个邻居的每个拉力都遵循等式力 = 1 / 距离 ^ 2。我的想法是将力分解为 x 和 y 分量,然后将 x 和 y 上的力相加,最后再次合成力。
这是我目前拥有的代码。它是可运行的,但由于某些原因它不起作用。
to get-direction-naive
set visible-neighbors (other turtles) in-radius 75 with [ distance myself > 0 ]
ifelse any? visible-neighbors
[let distance-list [distance myself] of visible-neighbors
let x-cors [xcor] of visible-neighbors
let x-diff map [? -> ? - xcor] x-cors
let x-forces (map [ [a b] -> a / (b ^ 3) ] x-diff distance-list)
let x-sum sum x-forces
let y-cors [ycor] of visible-neighbors
let y-diff map [? -> ? - ycor] y-cors
let y-forces (map [ [a b] -> a / (b ^ 3) ] y-diff distance-list)
let y-sum sum y-forces
ifelse y-sum = 0
[ifelse x-sum > 0
[set heading 0]
[set heading 180] ]
[set heading atan x-sum y-sum]
]
[right random 360]
end
如有任何建议,我们将不胜感激。
您发现什么不起作用?你想让海龟被拉向彼此,对吗?这似乎可以根据需要设置海龟的标题——不过我认为您可以删除两个嵌套的 ifelse
语句。查看此玩具版本:
to setup
ca
crt 20 [
setxy random-xcor random-ycor
pd
]
reset-ticks
end
to force-pull
ask turtles [
let visible-neighbors other turtles in-radius 10
ifelse any? visible-neighbors [
let distance-list [distance myself] of visible-neighbors
let x-cors [xcor] of visible-neighbors
let x-diff map [ ? -> ? - xcor] x-cors
let x-forces force-calc x-diff distance-list
let x-sum sum x-forces
let y-cors [ycor] of visible-neighbors
let y-diff map [? -> ? - ycor] y-cors
let y-forces force-calc y-diff distance-list
let y-sum sum y-forces
set heading atan x-sum y-sum
let hyp sqrt ( ( x-sum ^ 2 ) + ( y-sum ^ 2 ) )
fd e ^ ( -0.5 * hyp )
] [
right random 360
]
]
tick
end
to-report force-calc [ dif-list dist-list ]
report ( map [ [ a b ] -> a / ( b ^ 3 ) ] dif-list dist-list )
end
在我看来,海龟正确地面向计算出的方向并聚集在一起。
对于每只海龟,我有一个名为 visible-neighbors 的代理集,它们是一定距离内的海龟。
我想从每个可见的邻居那里得到对这只乌龟的拉力。然后总结力量。对于来自一个邻居的每个拉力都遵循等式力 = 1 / 距离 ^ 2。我的想法是将力分解为 x 和 y 分量,然后将 x 和 y 上的力相加,最后再次合成力。
这是我目前拥有的代码。它是可运行的,但由于某些原因它不起作用。
to get-direction-naive
set visible-neighbors (other turtles) in-radius 75 with [ distance myself > 0 ]
ifelse any? visible-neighbors
[let distance-list [distance myself] of visible-neighbors
let x-cors [xcor] of visible-neighbors
let x-diff map [? -> ? - xcor] x-cors
let x-forces (map [ [a b] -> a / (b ^ 3) ] x-diff distance-list)
let x-sum sum x-forces
let y-cors [ycor] of visible-neighbors
let y-diff map [? -> ? - ycor] y-cors
let y-forces (map [ [a b] -> a / (b ^ 3) ] y-diff distance-list)
let y-sum sum y-forces
ifelse y-sum = 0
[ifelse x-sum > 0
[set heading 0]
[set heading 180] ]
[set heading atan x-sum y-sum]
]
[right random 360]
end
如有任何建议,我们将不胜感激。
您发现什么不起作用?你想让海龟被拉向彼此,对吗?这似乎可以根据需要设置海龟的标题——不过我认为您可以删除两个嵌套的 ifelse
语句。查看此玩具版本:
to setup
ca
crt 20 [
setxy random-xcor random-ycor
pd
]
reset-ticks
end
to force-pull
ask turtles [
let visible-neighbors other turtles in-radius 10
ifelse any? visible-neighbors [
let distance-list [distance myself] of visible-neighbors
let x-cors [xcor] of visible-neighbors
let x-diff map [ ? -> ? - xcor] x-cors
let x-forces force-calc x-diff distance-list
let x-sum sum x-forces
let y-cors [ycor] of visible-neighbors
let y-diff map [? -> ? - ycor] y-cors
let y-forces force-calc y-diff distance-list
let y-sum sum y-forces
set heading atan x-sum y-sum
let hyp sqrt ( ( x-sum ^ 2 ) + ( y-sum ^ 2 ) )
fd e ^ ( -0.5 * hyp )
] [
right random 360
]
]
tick
end
to-report force-calc [ dif-list dist-list ]
report ( map [ [ a b ] -> a / ( b ^ 3 ) ] dif-list dist-list )
end
在我看来,海龟正确地面向计算出的方向并聚集在一起。