Выпуская две черепахи за тик нетлого - PullRequest
2 голосов
/ 22 марта 2020

В настоящее время я работаю над моделью, в которой я мог бы моделировать движение пешеходов при совершении покупок. Итак, я уже понял некоторые вещи, которые мне нужны, но я пытался выяснить , как выпустить 2 черепахи за тик (как пара) в определенном патче. Обе черепахи выпускаются одновременно. Мой код основан на муравьиных строках, но он просто освобождает всех пешеходов за один раз, и тогда черепахи начинают ходить. Клещи также начинаются после выпуска всех черепах. Я хочу, чтобы черепахи начали "ходить", когда они входят. Вот мой код:

breed [ leadvisitors leadvisitor ]
breed [ visitors visitor ]

to setup
  clear-all
   setup-visitors
reset-ticks
end

to setup-visitors 
  create-leadvisitors num-of-pedestrians * 0.1    ;;create 10% of the total number of pedestrians
  [ 
    set demand-type "none"
    set color black
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 0    
  ]
  create-visitors (num-of-pedestrians - (num-of-pedestrians * 0.1)) 
  [ set demand-type 0
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 1
    set attracted? false
  ]  ]
end

to go
  if turtles = 0  [ stop ]

  ask turtles 
  [ 
    set-demand-type  
    have-demand
  ]  


  if ticks > 100 [ stop ]
  tick
  display-labels
end

;;;;; visitor's internal state of demand ;;;;;

to set-demand-type
  if demand-type = 0
  [ set demand-type "food"
    set color red
    let target (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = red] 
  ]
end 

to have-demand  
  if demand-lvl = 0 
  [
    ifelse wait-time = -1 
    [ stroll ]

    [ set wait-time wait-time - 1
      if wait-time = 0
      [ stroll ]]
    ]

  if demand-lvl = 1
    [ ifelse wait-time = -1 
      [ stroll
        evaluate ]

      [ set wait-time wait-time - 1
        if wait-time = 0
        [ stroll 
          evaluate ]] 
    ] 
end 

to stroll 
if any? neighbors with [ pcolor = gray - 3 ]
  [ die ]

  ifelse any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = red]
  [ facexy exitpt-x exitpt-y ]
  [ rt random-float visitor-view-angle lt random-float visitor-view-angle ]
  fd walking-speed  
end

to evaluate 
  if any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = gray - 4 or pcolor = gray - 3 or pcolor = red + 2]
  [ facexy exitpt-x exitpt-y 
    rt random-float visitor-view-angle lt random-float visitor-view-angle 
    fd walking-speed ]

  let _mycolor color
  if any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
  [ let new-target max-one-of ( patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [patch-influence]
    let dist-to-new-target min-one-of (patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [distance myself]
    face new-target
    set heading towards new-target
    fd walking-speed   
    set attracted? true       

    attracted-and-visiting
    re-evaluate 
   ]


end 

to attracted-and-visiting        
   if pcolor = red + 2
   [ set heading towards one-of patches with [pcolor = red + 2]
     fd 0
     set patch-popularity patch-popularity + 1
     set wait-time avg-waiting-time 

    if count turtles-here > 0
        [ set num-of-visitors num-of-visitors + 1 ]
          set plabel num-of-visitors 
   ]      
end


to re-evaluate
  let _mycolor color
  if not any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
  [ set attracted? false ]

  ifelse choose? [set heading towards one-of patches with [pcolor = _mycolor]] [facexy exitpt-x exitpt-y]    
end


to-report choose?
  report random 2 = 0
end

Я надеюсь, что кто-то может мне помочь с этим. Заранее спасибо.

1 Ответ

3 голосов
/ 23 марта 2020

В результате наших обратных комментариев, позвольте мне попробовать то, что вы ищете. Я предполагаю, что вы хотите создать leadvisitors в начале цикла, а затем добавить два visitors на тик по мере выполнения цикла. Если это так, то ваша setup процедура будет выглядеть примерно так:

globals [num-visitors-created]

to setup
  clear-all
  set num-visitors-created 0
  create-leadvisitors num-of-pedestrians * 0.1  [
    set demand-type "none"
    set color black
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 0
    set num-visitors-created num-visitors-created + 1
  ]
  reset-ticks
end

, создавая leadvisitors, но не visitors. Обратите внимание, что глобальная переменная num-visitors-created отслеживает количество созданных leadvisitors и visitors, увеличиваясь на единицу каждый раз, когда создается leadvisitor или visitor.

В вашем go процедуры, вы будете создавать по два посетителя каждый тик, пока общее число visitors и leadvisitors созданных не достигнет num-of-pedestrians. (Если есть место только для одного нового посетителя, хотите ли вы, чтобы только один был создан, или они должны быть созданы в парах? Я предполагаю последнее.) Поскольку вы не хотите, чтобы смерть посетителя освободите место для нового, мы проверим созданный номер, а не номер, который еще жив.

to go
  if turtles = 0  [ stop ]

  ; create a new pair of visitors if there is room.
  if num-visitors-created <= (num-of-pedestrians - 2)
    create-visitors 2 [ 
      set demand-type 0
      set size 1
      set heading 180
      set pen-size 1
      setxy 0 16
      set destination one-of patches
      set wait-time -1
      set demand-lvl 1
      set attracted? false
      set num-visitors-created num-visitors-created + 1
    ]

  ask turtles 
  [ 
    set-demand-type  
    have-demand
  ]

  if ticks > 100 [ stop ]
  tick
  display-labels
end

(Поскольку, похоже, что leadvisitors может d ie, вы хотите сохранить определенное минимальное число или пропорция leadvisitors? Если это так, вы должны открыть новый вопрос.)

Приведенный выше код создаст пару новых visitors на patch 0 16 на каждом тике. Однако, если вы хотите, чтобы новый visitors был создан на другом патче, скажем, одном из красных, вы могли бы в своей процедуре go иметь этот патч sprout для новых посетителей.

  ask one-of patches with [pcolor = red] [
    sprout-visitors 2 [ 
      set demand-type 0
      set size 1
      set heading 180
      set pen-size 1
      set destination one-of patches
      set wait-time -1
      set demand-lvl 1
      set attracted? false
      set num-visitors-created num-visitors-created + 1
    ]
  ]

Обратите внимание, что здесь координаты xy новых посетителей не установлены, поэтому они начинаются с патча, который их вырастил.

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

...