Как заставить агента собираться в своей группе, используя правило BOIDS в Netlogo?
Вот что я хочу сделать:
Мне нужно, чтобы все агенты продвигались в группе, используя правило BOIDS.
Я хочу, чтобы они могли развернуться после того, как встретят стену (мой мир не заперт, они не могут проникнуть сквозь стену, чтобы достичь другой стороны мира)
вот мой код:
globals [nearest-teammates teammmembers]
turtles-own [ myteamset teamID myID teammatesID ]
to setup-groups
let teamCounter 1
ask turtles [
if myteamset = nobody [
let possible-teammates other turtles with [ myteamset = nobody ]
ifelse count possible-teammates > 1 [
set myteamset ( turtle-set self n-of 2 possible-teammates )
let ids sort [myID] of myteamset
set teammmembers myteamset
set nearest-teammates min-one-of myteamset[distance myself]
let tempteam teamCounter
set teamCounter teamCounter + 1
ask myteamset [
set teammatesID ids
set myteamset teammmembers
set teamID tempteam
]
] [
show "Not enough turtles to make a new team!"
]
]
]
end
стекающаяся часть:
to move-in-groups
let teamNumbers remove-duplicates [teamID] of turtles
foreach teamNumbers [
ask one-of turtles with [ teamID = ? ] [
if myteamset != nobody [
ask myteamset [
set heading mean-heading [ heading ] of myteamset
ifelse distance one-of turtles with [ teamID = ? ] < 3
[separate]
[align
cohere]]
fd 1 ]]]
end
код помощников
to-report mean-heading [ headings ]
let mean-x mean map sin headings
let mean-y mean map cos headings
report atan mean-x mean-y
end
to align
turn-towards average-flockmate-heading max-align-turn
end
to cohere
turn-towards average-heading-towards-flockmates max-cohere-turn
end
to separate
turn-away ([heading] of nearest-teammates) max-separate-turn
end
to turn-away [new-heading max-turn]
turn-at-most (subtract-headings heading new-heading) max-turn
end
to-report average-heading-towards-flockmates
let x-component mean [sin (towards myself + 180)] of nearest-teammates
let y-component mean [cos (towards myself + 180)] of nearest-teammates
ifelse x-component = 0 and y-component = 0
[ report heading ]
[ report atan x-component y-component ]
end
to-report average-flockmate-heading
let x-component sum [dx] of nearest-teammates
let y-component sum [dy] of nearest-teammates
ifelse x-component = 0 and y-component = 0
[ report heading ]
[ report atan x-component y-component ]
end
to turn-at-most [turn max-turn]
ifelse abs turn > max-turn
[ ifelse turn > 0
[ rt max-turn ]
[ lt max-turn ] ]
[ rt turn ]
end
to turn-towards [new-heading max-turn]
turn-at-most (subtract-headings new-heading heading) max-turn
end
Ошибка, которую я получаю:
SUM expected input to be a list but got the number -0.961261695938319 instead.
error while turtle 4 running SUM
called by procedure AVERAGE-FLOCKMATE-HEADING
called by procedure ALIGN
called by (command task from: procedure MOVE-IN-GROUPS)
called by procedure MOVE-IN-GROUPS
called by procedure GO
called by Button 'go'
Что я должен делать? Мне нужна помощь(>▂<)´¯
·. Спасибо за ваше время.
1 ответ
Ошибка, которую вы получаете, происходит в этой строке:
let x-component sum [dx] of nearest-teammates
NetLogo сообщает, что вы пытались передать один номер sum
вместо того, чтобы передать это список. Как это могло случиться? Это произойдет, если nearest-teammates
содержит один агент вместо набора агентов.
Итак, давайте посмотрим, где вы определяете nearest-teammates
:
set nearest-teammates min-one-of myteamset[distance myself]
Вы видите проблему? Вы используете min-one-of
, который дает вам единственный агент!
Как вы могли получить, например, 10 ближайших агентов, а не только ближайших? К счастью, у NetLogo есть примитив, который делает именно это: min-n-of
, Вот как вы бы это использовали:
set nearest-teammates min-n-of 10 myteamset [ distance myself ]
замещать 10
конечно, с количеством товарищей по команде.