Как заставить черепах смотреть друг на друга, подождать 3 тика и потом продолжать блуждать?

Я новичок как в Netlogo, так и в stackoverflow, но другие ваши сообщения уже мне очень помогли.

В настоящее время я пытаюсь запрограммировать модель, в которой агенты случайным образом блуждают в пространстве и останавливают их всякий раз, когда они встречаются. «Встреча» здесь означает «переходить друг друга in-radius 2». Они должны face друг друга, подождать 2 отметки и затем продолжать движение, пока не найдут следующего агента.

Я пробовал использовать Вопрос Нзелена по таймеру, но толком не увенчались успехом.

Пока мне удалось заставить их встретиться лицом к лицу. У меня проблемы с размещением tick-команды в нужном месте в моем коде. (РЕДАКТИРОВАТЬ: это было решено удалением команды wait, спасибо Сету. -> И я не хочу, чтобы все черепахи перестали двигаться, а только те, которые встречаются друг с другом). Еще одна вещь, к которой я стремлюсь, - это какое-то визуальное представление их встречи, например, чтобы нашивка мигала в то время, когда они встречаются, или кружок, который появляется вокруг них, когда они встречаются. С wait-командой все снова останавливается, чего я хочу предотвратить.

Пока что ниже кода.

to go 

  tick  

  ask turtles 
  [
   wander
   find-neighbourhood
  ] 

 ask turtles with [found-neighbour = "yes"]
  [
    face-each-other
  ]

 ask turtles with [found-neighbour = "no" or found-neighbour = "unknown"]
 [ wander ]

  end

;-------
;Go commands      

to wander
      right random 50
      left random 50
      forward 1   
end 

 to find-neighbourhood
     set neighbourhood other turtles in-radius 2
     if neighbourhood != nobody [wander]
     find-nearest-neighbour
  end 

  to find-nearest-neighbour
  set nearest-neighbour one-of neighbourhood with-min [distance myself]
  ifelse nearest-neighbour != nobody [set found-neighbour "yes"][set found-neighbour "no"]
            end 

to face-each-other                             ;;neighbour-procedure
  face nearest-neighbour
  set found-neighbour "no"
  ask patch-here [                             ;; patch-procedure
    set pcolor red + 2
    ;wait 0.2
    set pcolor grey + 2
        ]
    if nearest-neighbour != nobody [wander]
  rt 180
  jump 2

  ask nearest-neighbour 
[
    face myself 
    rt 180
    jump 2
    set found-neighbour "no"
  ]  
  end   

person T-Saurus    schedule 05.03.2014    source источник
comment
Код действительно трудно читать, когда в нем куча закомментированного кода, а отступы повсюду. возможно, поэтому никто не пытался ответить на этот вопрос - нужно читать много кода, и вы не упрощаете его.   -  person Seth Tisue    schedule 08.03.2014
comment
Одна вещь, которая бросается в глаза, это то, что вы определенно не хотите использовать wait вообще. Все останавливается, в то время как даже одна черепаха делает wait.   -  person Seth Tisue    schedule 09.03.2014
comment
Это оба очень полезные комментарии, большое вам спасибо. Я стараюсь соответственно редактировать.   -  person T-Saurus    schedule 09.03.2014
comment
Теперь гораздо яснее, спасибо.   -  person Seth Tisue    schedule 09.03.2014


Ответы (2)


С помощью коллеги мне удалось решить проблему с таймером. Как заметил Сет, wait была неправильной командой, и слишком много to-end-циклов сбивали с толку и моих черепах. Теперь код выглядит следующим образом и работает. Черепашки подходят друг к другу, смотрят друг на друга, меняют свою форму на звезды, ждут три тика и затем прыгают в противоположных направлениях.

to setup

  clear-all 
 ask turtles 
   [
     set count-down 3
     ]
reset-ticks

end 
;---------
to go

 ask turtles 
  [    
   if occupied = "yes" [
     ifelse count-down > 0 
[
       set count-down (count-down - 1)
       set shape "star"
     ][
       set shape "default"
       rt 180
       fd 2
       set occupied "no"
       set count-down 3
     ] 
   ]

   if occupied = "no" [
     ; Wandering around, ignoring occupied agents

     set neighbourhood other turtles in-radius 2

     ; If someone 'free' is near, communicate!

     set nearest-neighbour one-of neighbourhood with-min [distance myself]
     ifelse nearest-neighbour != nobody [
         if ([occupied] of nearest-neighbour = "no") [
            face nearest-neighbour            
            set occupied "yes"
            ask nearest-neighbour [ 
              face myself              
              set occupied "yes"
           ]]
     ][
       ; No one found, keep on wandering
       wander
     ]]] 
   tick 
   end
;-------
;Go commands      

to wander
      right random 50
      left random 50
      forward 1   
end 
person T-Saurus    schedule 10.03.2014

Вы правы, сославшись на вопрос Нжелена. По сути, ответ на ваш вопрос состоит в том, что вам нужно сделать то же самое. Когда вы пытались это сделать, вы были на правильном пути. Я бы посоветовал нанести еще один удар, а если вы застряли, покажите нам, где именно вы застряли.

person Seth Tisue    schedule 09.03.2014
comment
Мне помог коллега, и нам удалось решить проблему. Не то чтобы я сейчас не застрял на следующем шаге, но я думаю, что могу закрыть этот вопрос ... Как я могу это сделать? - person T-Saurus; 10.03.2014
comment
Вы можете ответить на свой вопрос и опубликовать свой код, поскольку решение может быть полезно другим. Или для закрытия см. meta.stackexchange.com/questions/37752/ - person Seth Tisue; 10.03.2014