Netlo go Ошибка: «Этот <turtle>уже мертв - PullRequest
1 голос
/ 19 июня 2020

Я изучаю поведение стаи в netlo go, и для того, чтобы отслеживать различные стада, я использую скрытую черепаху-«держателя стада», которую я могу вывести или позволить d ie, если будет создана новая стая или в существующем стаде заканчиваются члены. Однако я сталкиваюсь с проблемой, когда в некоторых случаях, когда я пытаюсь взаимодействовать с некоторыми данными в стае, как указано через отдельного члена стаи, я получаю сообщение «Это мертво», в результате чего код

Из того, что я понимаю о команде «d ie», если черепаха любого вида умирает, она должна удалить себя из любого набора агентов или переменных, которые ссылаются на нее, и, следовательно, такого рода ошибки не должны не проблема? Как я могу исправить или хотя бы отладить эту странную проблему?

Код моей функции оценки стада, в которой возникают проблемы, указанные ниже:

to evaluate-flock
  if is-in-flock = True ; checking to see if a flock has died out
  [
    if get-flock-size flock-reference < 2 ; is the turtle the only one in the flock?
    [
      if verbose = True [ print "Flock has dwindled to nothing" ]
      ask flock-reference ; has no more members, so is removed.
      [
        ask flock-members
        [
          set flock-reference nobody ; clear any remaining flock members of association with this flock
        ]
        die
      ]
      set is-in-flock False ; no longer in a flock
    ]
  ]
  ifelse is-in-flock = True ; is turtle in a flock?
  [
    if verbose = True [ type "This turtle is in flock " print [ who ] of [ flock-reference ] of self ]
    if any? other preys in-radius vision with [ is-in-flock = True ] with [ flock-reference != [ flock-reference ] of myself ]; check for nearby turtles that are in different flocks
    [
      if verbose = True [ print "There are other nearby flocks" ]
      let current-school-size ( get-flock-size [ flock-reference ] of self )
      if verbose = True [ type "I am part of a school of " print current-school-size ]
      let temp-list turtle-set other preys in-radius vision with [ is-in-flock = True ] with [ flock-reference != [ flock-reference ] of myself ] with [ ( get-flock-size flock-reference ) > current-school-size ] with [ subtract-headings ( average-schoolmate-heading [ flock-members ] of flock-reference ) heading < 60]; are any nearby turtles in different, larger flocks that I am alligned with? if so, add them to a list
      if count temp-list > 0 ; does the list have any members?
      [
        if verbose = True [ print "Found a bigger flock" ]
        ask flock-reference
        [
          remove-from-flock myself ; remove myself from my old flock
        ]
        set flock-reference [ flock-reference ] of ( max-one-of temp-list [ get-flock-size flock-reference ] ); join the biggest flock on this list
        set is-in-flock True ; sets it to true in case it wasn't for some reason.
      ]
    ]
  ]
  [
    if verbose = True [ type "Turtle " type [ who ] of self print " is not in a flock" ]
    ifelse any? other preys in-radius vision with [ is-in-flock = True ] ; are there any pre-existing flocks the turtle can join?
    [
      if verbose = True [ print "There are nearby flocks" ]
      let potential-flock turtle-set other preys in-radius vision with [ is-in-flock = True ] ; grab any nearby turtles that are already in a flock
      ***set potential-flock potential-flock with [ subtract-headings ( average-schoolmate-heading ( [ flock-members ] of flock-reference ) ) heading < 60]; remove any that are not aligned with this turtle***
      if count potential-flock > 0
      [
        if verbose = True [ print "There are nearby flocks that I am aligned with" ]
        set flock-reference [ flock-reference ] of ( max-one-of potential-flock [ get-flock-size flock-reference ] ); join the biggest flock on this list
        set is-in-flock True ; turtle is now in a flock
      ]
    ]
    [ ; if there are no pre-existing flocks, turtle starts its own
      let potential-flock turtle-set other preys in-radius vision with [ is-in-flock = False ] ; Grab any nearby turtles not already in a flock
      set potential-flock potential-flock with [ subtract-headings ( average-schoolmate-heading potential-flock ) heading < 60]; remove any that that are not aligned with this turtle
      if count potential-flock > 0
      [
        if visualize-flock-creation = True
        [
          set color green
          ask potential-flock [ set color green ]
          wait 0.25
          set color blue
          ask potential-flock [ set color blue ]
        ]
        if verbose = True [ type "Number of nearby potential flockmates " print count potential-flock ]
        hatch-flock-holders 1 ; create a new flock-holder
        [
          set size 0
          set color black ; sets the new flock's placeholder color to the background
          set flock-members potential-flock ; adds the list of members to the new flock
          ask flock-members
          [
            set flock-reference myself ; asks the new flock members to add the new flock as their flock-reference 
            set is-in-flock True ; all these turtles are now in a flock
          ]
        ]
      ]
    ]
  ]
end

Возможно неясная ссылка на имя переменной для кода выше: flock-reference: - переменная, хранимая каждой стайкой «добывающей» черепахой, которая просто указывает на скрытую черепаху-«держателя стада». flock-members: - Набор агентов "хищных" черепах, которые прикреплены к скрытой черепахе-"держателю стаи".

Я добавил изображение полного сообщения об ошибке ниже. Dead turtle error message

Пожалуйста, дайте мне знать, если есть какие-то сомнения по поводу того, что здесь происходит, или если есть что-то, что я могу прояснить. Спасибо!

1 Ответ

4 голосов
/ 20 июня 2020

Я не могу это проверить, но предполагаю, что ошибка связана с тем, что агент prey 2 имеет ссылку на умерший flock-holder. Когда flock-holder умирает, он (как вы знаете) удаляется из всех наборов angentset, членом которых он был, а переменные, содержащие указатель на него, сбрасываются, чтобы указать на nobody. Однако NetLo go достаточно умен, чтобы знать, что этот nobody - мертвый flock-holder, и выдает сообщение об ошибке, с которым вы столкнулись. Если после ошибки вы проверили prey 2 или ввели show [flock-reference] of prey 2 в командной строке, я ожидаю, что вы обнаружите, что flock-reference действительно имеет значение nobody.

Я предполагаю, что где-то в вашего кода, не все жертвы, которые были в (теперь мертвой) стае, были переназначены в другое стадо, а скорее сохранили свое старое значение flock-reference, теперь nobody. Когда вы просите стадо на d ie, вы можете добавить строку show preys with [flock-reference = nobody]. Если таковые имеются, вы можете выяснить, почему.

Надеюсь, это поможет, Чарльз

...