Как сделать так, чтобы две породы черепах чередовались, выходя из одного гнезда - PullRequest
1 голос
/ 09 мая 2019

В этой модели муравьев у меня есть две породы черепах: несовершеннолетние и фуражиры. Прямо сейчас все фуражиры выйдут одним файлом, за которым следуют все несовершеннолетние (это делается путем задержки первоначального отъезда. Я хочу, чтобы они выходили по очереди, пока у меня не кончатся фуражиры или не кончатся несовершеннолетние.

Я пытался поместить Ask Turtles [if who> = ticks [stop]] в качестве первого шага процедуры GO, но это заставило всех черепах взорваться из гнезда вместо того, чтобы оставить один файл.

to go 
  ask foragers
  [ if who >= ticks [ stop ]  ;; delay initial departure
    wiggle
    fd 1 ]
  ask minors
  [ if who >= ticks [ stop ]  ;; delay initial departure
    ifelse color = white
    [ look-for-transporter ]
    [ hitchhike ]]
  tick
end

Я хочу, чтобы фуражиры и несовершеннолетние чередовались при выходе из гнезда. Прямо сейчас все фуражиры уходят раньше, чем несовершеннолетние.

1 Ответ

1 голос
/ 10 мая 2019

who номера присваиваются каждой черепахе , поскольку она создана и не зависит от породы.Таким образом, если вы создадите 10 фуражиров, а затем создадите 10 миноров, ваши фуражиры будут иметь значения who от 0 до 9, а ваши несовершеннолетние будут иметь who значения от 10 до 19. По этой причине, какую бы породу вы ни создали в первую очередь (и, следовательно, имеет самый низкий диапазон who чисел), начнет двигаться в соответствии с вашим if who >= ticks... кодом.Чтобы ваш код на основе who делал то, что вам нужно, вам нужно чередовать создание ваших фуражиров и несовершеннолетних.

Однако, как правило, использование чисел who немного ограничено - вам может быть проще создавать свои собственные переменные или управлять этим другим способом.Например, установка ниже создает nest-patch в крайнем левом углу мира и перемещает некоторых фуражиров и несовершеннолетних в этот патч.У черепах есть логическая переменная at-nest?, которую вы можете использовать для управления перемещением черепах:

breed [ foragers forager ]
breed [ minors minor ]

globals [ last-left nest-patch ]
turtles-own [ at-nest? ]

to setup
  ca
  create-foragers 10 [ set color red ]
  create-minors 20 [ set color blue ]
  set nest-patch patch min-pxcor 0
  ask nest-patch [ set pcolor yellow ]
  ask turtles [
    move-to nest-patch
    set heading 90
    set at-nest? true
    pd
  ]
  set last-left minors
  reset-ticks
end

Изначально для всех черепах at-nest? установлено значение true.Затем вы можете чередовать представителей каждой породы, для которых вы просите установить at-nest? на true.Взгляните на приведенный ниже пример, который содержит более подробную информацию в комментариях:

to go
  ; If there are any turtles on the nest patch with at-nest? set to true
  if any? ( turtles-on nest-patch ) with [ at-nest? ] [
    ; If both breeds are present on the nest patch, alternate back and forth
    ; between breeds to set at-nest? to false
    ifelse ( length remove-duplicates [breed] of turtles-on nest-patch = 2 ) [
      set last-left ifelse-value ( last-left = minors ) [ foragers ] [ minors ]
      ask one-of last-left with [ at-nest? ] [
        set at-nest? false
      ]
    ] [
      ; Otherwise, just ask one-of whichever breed is left to set at-nest? to false
      ask one-of turtles-on nest-patch [
        set at-nest? false
      ]   
    ]
  ]

  ; Ask any turtles who have at-nest? set to false to move
  ask turtles with [ not at-nest? ] [
    if heading != 90 [
      rt ifelse-value ( breed = minors ) [ 12 ] [ -12 ]
    ]
    if xcor > 0 and heading = 90 [
      rt ifelse-value ( breed = minors ) [ 12 ] [ -12 ]
    ]
    fd 1
  ]      
  tick
end

Этот код выводит что-то вроде:

enter image description here

...