我如何在 NetLogo 中使用带有 turtles-on 关键字的 turtle-sets
how can I use turtle-sets with turtles-on keyword in NetLogo
从示例开始:
to move-cars
ask turtles with [ shape = "car"] [
ifelse not can-move? 1
[ die! ]
[ ifelse [ pcolor ] of patch-ahead 1 = red [] [ifelse any? turtles-on patch-ahead 1 [] [ fd 1 ] ]]
]
这是我搬车的程序。只有当前方没有红色补丁或前方没有车辆时,车辆才能移动。
我遇到的问题是由 ifelse 第二部分的 turtles-on 引起的,因为它会检查所有海龟。我确实有几种汽车品种和其他我不想检查的海龟代理。我只想检查特定海龟组 turtles-on 。在这种情况下
turtles with [ shape = "car" ]
总结一下我想问一下:(文字)前面有没有车形的乌龟?
我试过了,但没有用:
[ ifelse [ pcolor ] of patch-ahead 1 = red [] [ifelse any? turtles-on turtles with [shape = "car"] patch-ahead 1 [] [ fd 1 ] ]]
最后,我解决了这个问题,但解决方案丑陋且多余。我检查了是否有任何特定品种领先一个补丁,因为我知道我可以使用 breed-on。这是:
[ ifelse [pcolor] of patch-ahead 1 = red [] [ ifelse any? carsSN-on patch-ahead 1 or any? carsSE-on patch-ahead 1 or any? carsEN-on patch-ahead 1 or any? carsWS-on patch-ahead 1 or any? carsNS-on patch-ahead 1 or any? carsNE-on patch-ahead 1 or any? carsES-on patch-ahead 1[ ] [ fd 1 ] ] ]
你能建议更好的方法来使用特定代理集的 turtles-on 吗?
您使用 with [ shape = "car" ]
的方法存在一些语法问题,否则它应该是一种可行的方法。您不能使用 turtles-on turtles
,因为 turtles-on
只有在补丁上下文中才真正有意义。同样,您需要使用原语 of
表明您想要 turtles-on
的 特定补丁(补丁提前 1)。您的方法的一个变体是:
ask cars [
if patch-ahead 1 != nobody [
if [pcolor] of patch-ahead 1 != red and [ count turtles-here with [ shape = "car"] ] of patch-ahead 1 = 0 [
fd 1
]
]
]
此外,您是否有任何特定原因在每种情况下都使用 ifelse
而不是仅在 if 语句中使用 !=(就像我在这里所做的那样)?
附带说明一下,我个人建议不要让您的汽车在不同方向行驶时使用不同品种。我更喜欢拥有一个可以遵循相同规则的单一品种。它更干净,您仍然可以在品种内进行区分(例如,turtles-own
表示起始方向)。它还可以通过只处理一个品种来消除您在这里遇到的问题。也就是说,我确信在某些情况下多个品种会更好,如果它对您的模型有意义,那就太好了!
从示例开始:
to move-cars
ask turtles with [ shape = "car"] [
ifelse not can-move? 1
[ die! ]
[ ifelse [ pcolor ] of patch-ahead 1 = red [] [ifelse any? turtles-on patch-ahead 1 [] [ fd 1 ] ]]
]
这是我搬车的程序。只有当前方没有红色补丁或前方没有车辆时,车辆才能移动。
我遇到的问题是由 ifelse 第二部分的 turtles-on 引起的,因为它会检查所有海龟。我确实有几种汽车品种和其他我不想检查的海龟代理。我只想检查特定海龟组 turtles-on 。在这种情况下
turtles with [ shape = "car" ]
总结一下我想问一下:(文字)前面有没有车形的乌龟?
我试过了,但没有用:
[ ifelse [ pcolor ] of patch-ahead 1 = red [] [ifelse any? turtles-on turtles with [shape = "car"] patch-ahead 1 [] [ fd 1 ] ]]
最后,我解决了这个问题,但解决方案丑陋且多余。我检查了是否有任何特定品种领先一个补丁,因为我知道我可以使用 breed-on。这是:
[ ifelse [pcolor] of patch-ahead 1 = red [] [ ifelse any? carsSN-on patch-ahead 1 or any? carsSE-on patch-ahead 1 or any? carsEN-on patch-ahead 1 or any? carsWS-on patch-ahead 1 or any? carsNS-on patch-ahead 1 or any? carsNE-on patch-ahead 1 or any? carsES-on patch-ahead 1[ ] [ fd 1 ] ] ]
你能建议更好的方法来使用特定代理集的 turtles-on 吗?
您使用 with [ shape = "car" ]
的方法存在一些语法问题,否则它应该是一种可行的方法。您不能使用 turtles-on turtles
,因为 turtles-on
只有在补丁上下文中才真正有意义。同样,您需要使用原语 of
表明您想要 turtles-on
的 特定补丁(补丁提前 1)。您的方法的一个变体是:
ask cars [
if patch-ahead 1 != nobody [
if [pcolor] of patch-ahead 1 != red and [ count turtles-here with [ shape = "car"] ] of patch-ahead 1 = 0 [
fd 1
]
]
]
此外,您是否有任何特定原因在每种情况下都使用 ifelse
而不是仅在 if 语句中使用 !=(就像我在这里所做的那样)?
附带说明一下,我个人建议不要让您的汽车在不同方向行驶时使用不同品种。我更喜欢拥有一个可以遵循相同规则的单一品种。它更干净,您仍然可以在品种内进行区分(例如,turtles-own
表示起始方向)。它还可以通过只处理一个品种来消除您在这里遇到的问题。也就是说,我确信在某些情况下多个品种会更好,如果它对您的模型有意义,那就太好了!