NetLogo: вычислить периметр патч-набора

Я моделирую выбор территории в NetLogo и хотел бы, чтобы мои черепахи вычислили периметр своей территории после ее создания. Я пытался придумать, как это сделать, но пока не нашел хороших средств. Любые идеи?

введите описание изображения здесь

patches-own 
[ owner ] ;; patches know who owns them

turtles-own
[ territory  ;; agentset of patches I own
  food ;; food acquired in my territory
  threshold ] ;; food required, will build territory until meet this

to go
   tick
   ask turtles [ build-territory ]
end

to build-territory
   if food > threshold [ calculate-perimeter ]  ;; stop building when enough food
   pick-patch  ;; keep picking patches until meet threshold.
end

to calculate-perimeter
   ;; what could I use to add up the perimeter of the territory?
end

Спасибо заранее за любые предложения!


person User847462    schedule 28.03.2017    source источник


Ответы (1)


Модификация моего последнего ответа вам:

to setup
  ca
  ask patches with [pxcor > 0 ] [
    set pcolor white
  ]
  crt 1 
end

to go
  ask turtles [
    let blacklist patches with [ pcolor = black ]
    let northpatches patches with [ pycor > 0 ]
    let northred ( northpatches with [ member? self blacklist = false ] )
    ask northred [ set pcolor red ]
    let border northred with [ any? neighbors4 with [ pcolor != red ] ]
    ask border [
      set pcolor blue 
    ]
    print count border
  ]
end

Вы можете обозначить участки границы / периметра как любые участки территории с соседями, которые не территории. Для вас это может выглядеть примерно так:

  ask turtles [
    print count territory with [ any? neighbors4 with [owner != myself ] 
    ]
  ]

Опять же, я не могу протестировать его без вашей настройки, поэтому вам придется изменить.

Изменено ниже

Чтобы подсчитать края участков, которые находятся на границе, вы можете попросить их подсчитать свои neighbors4, принадлежащие другой черепахе. Затем они могут добавить их к длине периметра черепахи. Например:

to assess-perimeter  ;;; must be called by a turtle
  print ("Assessing perimeter")
  let current-turtle who
  let temp-per-len 0
  let border-patches patches with [ owner = current-turtle and any? neighbors4 with [ owner != current-turtle ] ]
  show (word "I have " count border-patches " border patches")
  ask border-patches [   
    ;; One way to get each border patch to check each of its neighbors 
    let nobodies 4 - count neighbors4 ;; if any patches are on the edge of the world, returns the number of those edges
    let non-territory-edges count neighbors4 with [ owner != current-turtle ]
    let border-edges nobodies + non-territory-edges
    set temp-per-len temp-per-len + border-edges
  ]
  show (word "My perimeter length: " temp-per-len )
  set perimeter-length temp-per-len
end

Если это называется после того, как все черепахи выбрали весь свой домашний ареал, идея состоит в том, что каждая черепаха оценивает границу своего домашнего ареала. Затем каждый из этих участков границы подсчитывает свои neighbors4, у которых есть другой владелец. Я использовал «temp-per-len» как суммирующую переменную внутри цикла, которая затем используется для установки turtles-own «длины периметра». Полный код модели, включая настройки и определения, можно найти здесь. Обратите внимание: вам придется загрузить или скопировать код, модель слишком громоздкая, чтобы хорошо работать в формате HTML.

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

person Luke C    schedule 28.03.2017
comment
Спасибо, Люк. Я размышлял об этом с момента вашего сообщения на прошлой неделе. Идея использования подсчета патчей с соседями4 с [owner! = Me] приближает подсчет периметра, но не является точным. Если один из этих патчей имеет ›1 соседний патч, принадлежащий владельцу, он все равно будет считаться только 1 единицей периметра, если это имеет смысл. Например, патч, на который указывает текстовое поле Territory 2 выше, будет 1 из этих соседей4 с патчами [owner! =self], добавляя длину периметра в 1 единицу к расстоянию по периметру, но на самом деле он должен добавить 2 единицы. Я все еще пытаюсь определить более точный метод. - person User847462; 03.04.2017
comment
Ах, вы пытаетесь считать границы участков, а не участки, как ваше определение периметра, это правильно? Я отредактирую свой ответ, чтобы предложить возможное решение. - person Luke C; 03.04.2017