如何在 netlogo 模拟器的网络中找到两个海龟(代理)之间的角度?
How can I find angle between two turtles(agents) in a network in netlogo simulator?
在编队中,机器人相互链接,邻域中的机器人数量可能会有所不同。如果一个机器人有 5 个邻居,我如何找到那个机器人与另一个机器人的角度?
(在评论之后,我替换了 <face
+ read heading
> with just using towards
, wich 我忽略了作为一个选项。出于某种原因,我所指的评论很快就被删除了,所以我不知道谁提出了建议,但我从手机通知中读了足够多)
在 NetLogo 中,通常可以使用海龟的 heading
来了解度数。
由于您的代理是 linked,第一个想法可能是使用 link-heading
,直接 reports the heading in degrees from end1 to end2。
但是请注意,这可能并不理想:只有当您有兴趣了解从 end1 到 的标题时,使用 link-heading
才会一尘不染end2,意思是:
- 如果您的link是定向的,它会报告从源到目标的航向;
- 如果您的 link 是 未定向的 ,它会报告标题 from the older turtle to the younger turtle。
如果您对此感兴趣,那很好。但事实可能并非如此!例如,如果您有未定向的 link 并且想知道从 turtle 1
到 turtle 0
的角度,使用 link-heading
会给您错误的值:
to setup
clear-all
create-turtles 2 [
setxy random-xcor random-ycor
set color black
set label who
]
ask turtle 0 [
create-link-with turtle 1
]
end
to go
ask link 0 1 [
show link-heading
]
end
...虽然我们知道,通过观察两只乌龟的位置,从turtle 1
到turtle 0
的度数必须在45附近。
一种更适合所有可能情况的方法是直接查看您感兴趣的乌龟的 heading
,而不考虑 link 的性质或方向。你可以让你的参考海龟face
成为目标海龟,然后读取参考海龟的heading
。或者更好:您可以直接使用 towards
,它只报告相同的信息,但不必让海龟实际改变它们的航向。复制并 运行 下面的代码,看看这种方法如何总是给出正确的答案!
to setup
clear-all
create-turtles 5 [
setxy random-xcor random-ycor
set color black
set label who
]
end
to go
let reference sort turtles
foreach reference [
r ->
ask r [
print "---------------------------------------------------------------------------------------------------------------------------------------------"
let targets sort other turtles
foreach targets [
t ->
let direction (towards t)
type "I am " type self type ". The NetLogo angle between me and " type t type " is " type direction type ", while the normal mathematical angle is " print heading-to-angle direction
]
print "---------------------------------------------------------------------------------------------------------------------------------------------"
]
]
end
to-report heading-to-angle [ h ]
report (90 - h) mod 360
end
在您的情况下,目标组(我在上面的简短示例中设置为 other turtles
)可以基于实际的 link,因此构造为 (list link-neighbors)
或 sort link-neighbors
(因为如果您想使用 foreach
,代理集必须作为列表传递 - see here)。
更新:实际上我最终还制作了一个更能代表您的情况的玩具模型,即使用 links 并使用 link-neighbors
。见下文:
to setup
clear-all
create-turtles 100 [
move-to one-of patches with [not any? turtles-here]
set color black
set label who
]
ask n-of 2 turtles [
create-links-with n-of 5 other turtles
]
end
to go
let reference-turtles sort turtles with [count my-links > 2]
foreach reference-turtles [
r ->
ask r [
print "-----------------------------------------------------------------------------------------------------------------------------------------------"
let targets sort link-neighbors
foreach targets [
t ->
let direction (towards t)
type "I am " type self type ". The NetLogo angle between me and " type t type " is " type direction type ", while the normal mathematical angle is " print heading-to-angle direction
]
print "-----------------------------------------------------------------------------------------------------------------------------------------------"
]
]
end
to-report heading-to-angle [ h ]
report (90 - h) mod 360
end
最后说明:您一定注意到了 heading-to-angle
过程,它直接取自 atan
条目 here。这是一种有用的方法,可以将 NetLogo 几何中表示的度数(其中北为 0,东为 90)转换为以通常的数学方式表示的度(其中北为 90,东为 0)。我不知道你对什么学位感兴趣,所以在这里留下这个提示是值得的。
在编队中,机器人相互链接,邻域中的机器人数量可能会有所不同。如果一个机器人有 5 个邻居,我如何找到那个机器人与另一个机器人的角度?
(在评论之后,我替换了 <face
+ read heading
> with just using towards
, wich 我忽略了作为一个选项。出于某种原因,我所指的评论很快就被删除了,所以我不知道谁提出了建议,但我从手机通知中读了足够多)
在 NetLogo 中,通常可以使用海龟的 heading
来了解度数。
由于您的代理是 linked,第一个想法可能是使用 link-heading
,直接 reports the heading in degrees from end1 to end2。
但是请注意,这可能并不理想:只有当您有兴趣了解从 end1 到 的标题时,使用 link-heading
才会一尘不染end2,意思是:
- 如果您的link是定向的,它会报告从源到目标的航向;
- 如果您的 link 是 未定向的 ,它会报告标题 from the older turtle to the younger turtle。
如果您对此感兴趣,那很好。但事实可能并非如此!例如,如果您有未定向的 link 并且想知道从 turtle 1
到 turtle 0
的角度,使用 link-heading
会给您错误的值:
to setup
clear-all
create-turtles 2 [
setxy random-xcor random-ycor
set color black
set label who
]
ask turtle 0 [
create-link-with turtle 1
]
end
to go
ask link 0 1 [
show link-heading
]
end
...虽然我们知道,通过观察两只乌龟的位置,从turtle 1
到turtle 0
的度数必须在45附近。
一种更适合所有可能情况的方法是直接查看您感兴趣的乌龟的 heading
,而不考虑 link 的性质或方向。你可以让你的参考海龟face
成为目标海龟,然后读取参考海龟的heading
。或者更好:您可以直接使用 towards
,它只报告相同的信息,但不必让海龟实际改变它们的航向。复制并 运行 下面的代码,看看这种方法如何总是给出正确的答案!
to setup
clear-all
create-turtles 5 [
setxy random-xcor random-ycor
set color black
set label who
]
end
to go
let reference sort turtles
foreach reference [
r ->
ask r [
print "---------------------------------------------------------------------------------------------------------------------------------------------"
let targets sort other turtles
foreach targets [
t ->
let direction (towards t)
type "I am " type self type ". The NetLogo angle between me and " type t type " is " type direction type ", while the normal mathematical angle is " print heading-to-angle direction
]
print "---------------------------------------------------------------------------------------------------------------------------------------------"
]
]
end
to-report heading-to-angle [ h ]
report (90 - h) mod 360
end
在您的情况下,目标组(我在上面的简短示例中设置为 other turtles
)可以基于实际的 link,因此构造为 (list link-neighbors)
或 sort link-neighbors
(因为如果您想使用 foreach
,代理集必须作为列表传递 - see here)。
更新:实际上我最终还制作了一个更能代表您的情况的玩具模型,即使用 links 并使用 link-neighbors
。见下文:
to setup
clear-all
create-turtles 100 [
move-to one-of patches with [not any? turtles-here]
set color black
set label who
]
ask n-of 2 turtles [
create-links-with n-of 5 other turtles
]
end
to go
let reference-turtles sort turtles with [count my-links > 2]
foreach reference-turtles [
r ->
ask r [
print "-----------------------------------------------------------------------------------------------------------------------------------------------"
let targets sort link-neighbors
foreach targets [
t ->
let direction (towards t)
type "I am " type self type ". The NetLogo angle between me and " type t type " is " type direction type ", while the normal mathematical angle is " print heading-to-angle direction
]
print "-----------------------------------------------------------------------------------------------------------------------------------------------"
]
]
end
to-report heading-to-angle [ h ]
report (90 - h) mod 360
end
最后说明:您一定注意到了 heading-to-angle
过程,它直接取自 atan
条目 here。这是一种有用的方法,可以将 NetLogo 几何中表示的度数(其中北为 0,东为 90)转换为以通常的数学方式表示的度(其中北为 90,东为 0)。我不知道你对什么学位感兴趣,所以在这里留下这个提示是值得的。