Netlogo, проверка, если два агента подключены к одному и тому же агенту - PullRequest
3 голосов
/ 23 мая 2019

У меня есть проблема, которую я хочу решить. Допустим, есть два типа агентов (кролики и охотники). Я хочу, чтобы охотники нашли ближайшего к ним кролика. Но если два охотника должны были найти одного и того же кролика (т.е. ближайший кролик к охотнику 103 и охотнику 105 - это кролик 99). Я хочу, чтобы один из охотников нашел следующего ближайшего кролика. Таким образом, каждый охотник должен проверить, к каким кроликам подключены другие охотники, и, если любой охотник связан с тем же кроликом, найти следующего ближайшего кролика. Есть идеи как это решить. Спасибо

breed [hunters hunter]
breed [rabbits rabbit]

hunters-own [rab-in-sight]

to setup
  clear-all
  create-hunters 20
  create-rabbits 100

  ask hunters [
  set color red
  setxy random-xcor random-ycor
  ]
  ask rabbits [
    set color white
    setxy random-xcor random-ycor
  ]

end

to connect
  ask hunters [
    set rab-in-sight min-one-of rabbits in-radius 5 [distance myself]
  ]

end

Ответы [ 2 ]

4 голосов
/ 23 мая 2019

Вы можете использовать либо переменную, которая указывает, является ли целью кролик, либо использовать links, чтобы выполнить то же самое.

Ссылочный подход

Проверьте эту модифицированную версию вашего setup, у которого охотники установили для rab-in-sight значение nobody:

breed [hunters hunter]
breed [rabbits rabbit]

hunters-own [rab-in-sight]

to setup
  clear-all
  create-hunters 20
  create-rabbits 100

  ask hunters [
    set color red
    setxy random-xcor random-ycor
    set rab-in-sight nobody
  ]
  ask rabbits [
    set color white
    setxy random-xcor random-ycor
  ]
  reset-ticks
end

Затем используйте if или ifelse операторы для управления поведением охотника в зависимости от того, охотится ли он в настоящее время на кролика:

to go
  ask hunters [ 
    connect
  ]
  tick
end

to connect
  ; If a hunter is not already targetting a rabbit
  ifelse rab-in-sight = nobody [
    fd 1

    ; Choose a target rabbit that does not already have a link with other hunters
    set rab-in-sight min-one-of ( rabbits in-radius 5 with [ 
      not any? my-links ] ) [distance myself]

    ; If that rabbit exists, create a link with it so no other hunters will 
    ; target the same rabbit
    if rab-in-sight != nobody [
      create-link-with rab-in-sight
    ]
  ] [
    ; If you're targetting a rabbit, hunt it
    face rab-in-sight
    ifelse distance rab-in-sight > 1 [
      fd 1
    ] [
      move-to rab-in-sight
      ask rab-in-sight [
        die
      ] 
      set rab-in-sight nobody
    ]
  ]
end

Переменный подход

Подход с использованием флага или семафора аналогичен - слегка измененsetup теперь устанавливает rab-in-sight на nobody и дает rabbits targeted? логическую переменную, которая установлена ​​на false:

breed [hunters hunter]
breed [rabbits rabbit]

hunters-own [rab-in-sight]
rabbits-own [ targeted? ]

to setup
  clear-all
  create-hunters 20
  create-rabbits 100

  ask hunters [
    set color red
    setxy random-xcor random-ycor
    set rab-in-sight nobody
  ]
  ask rabbits [
    set color white
    setxy random-xcor random-ycor
    set targeted? false
  ]
  reset-ticks
end

Теперь, когда охотник нацеливается на кролика, он имеетэтот кролик меняет свою targeted? переменную на true, чтобы другие охотники "знали", что не должны также целиться:

to go
  ask hunters [ 
    connect
  ]
  tick
end

to connect
  ; If a hunter is not already targetting a rabbit
  ifelse rab-in-sight = nobody [
    fd 1

    ; Choose a target rabbit that is not currently being targeted
    set rab-in-sight min-one-of ( rabbits in-radius 5 with [ 
      not targeted? ] ) [distance myself]

    ; If that rabbit exists, have it set targetted? to true so 
    ; no other hunters will target the same rabbit
    if rab-in-sight != nobody [
      ask rab-in-sight [
        set targeted? true
      ]
    ]
  ] [
    ; If you're targetting a rabbit, hunt it
    face rab-in-sight
    ifelse distance rab-in-sight > 1 [
      fd 1
    ] [
      move-to rab-in-sight
      ask rab-in-sight [
        die
      ] 
      set rab-in-sight nobody
    ]
  ]
end
2 голосов
/ 23 мая 2019

В этом случае я рекомендую создать отдельный набор агентов для кроликов, скажем, rabbits-not-hunted.Охотник выбирает одного из кроликов поблизости в этом наборе, в то время как выбранный кролик удаляется из этого набора.Поэтому следующий охотник не может больше выбрать этого кролика в качестве цели и выбирает следующую «свободную» добычу.Пожалуйста, проверьте код ниже:

breed [hunters hunter]
breed [rabbits rabbit]

hunters-own [rab-in-sight]

to setup
  clear-all
  create-hunters 20
  create-rabbits 100

  ask hunters [
  set color red
  setxy random-xcor random-ycor
  ]
  ask rabbits [
    set color white
    setxy random-xcor random-ycor
  ]

end

to connect
  ;; a seperate agentset of all rabbits which are not hunted yet. At first, all rabbits can be hunted, therefore it coincides with all rabbits
  let rabbits-not-hunted rabbits

  ask hunters [
    ;; the prospective prey is taken from the set of rabbits-not-hunted yet
    let prospective-prey turtle-set min-one-of rabbits-not-hunted in-radius 5 [distance myself] 

    set rab-in-sight prospective-prey

    ;; updates rabbits-not-hunted agentset by removeing the prey selected from the agentset
    set rabbits-not-hunted rabbits-not-hunted with [ not member? self prospective-prey ]
  ]

end

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

...