Как заставить агента собираться в своей группе, используя правило BOIDS в Netlogo? - PullRequest
0 голосов
/ 17 октября 2018

Вот что я хочу сделать:

  1. Мне нужны все агенты двигаться вперед в группе с использованием правила BOIDS

  2. Я хочу, чтобы они смогли обернуться после того, как они встретят стену (мой мир не заперт, они не могут проникнуть через стену, чтобы достичь другой сторонымир)

вот мой код:

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 Ответ

0 голосов
/ 19 октября 2018

Ошибка, которую вы получаете в этой строке:

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 на количество товарищей по команде, которое вы хотите, конечно.

...