Моя стратегия для решения этой проблемы заключается в том, чтобы понять, что все, что нам действительно нужно сделать, это «залить» патч цветом и пометить все найденные соседние патчи, а затем повторить для любых немаркированных, не черных патчей, пока они не будут все готово.
NetLo go не имеет команды "флуд", чтобы получить все патчи, смежные с патчем, отвечающим критериям, поэтому мы создаем наш собственный специальный репортер для его обработки, patches-adjacent
. Тогда просто попросить этих patches-adjacent
установить region
для выбранного в данный момент региона.
Мне не нравится этот код, он немного привередливый и будет склонен к бесконечным циклам, если его неправильно настроить. , но это должно работать. Могу поспорить, что есть более чистый способ сделать это, о котором я сейчас не думаю.
; add a variable to track the different regions
; the default value will be `0` for each patch when `clear-all` is called
patches-own [ region ]
to set-regions
let current-region 1
; only act on non-black patches that haven't yet been assigned a region
let untagged patches with [ region = 0 and pcolor != black ]
while [any? untagged] [
ask one-of untagged [
ask patches-adjacent [
set region current-region
]
]
; update the region and the untagged patches we have left to process
set current-region current-region + 1
set untagged patches with [ region = 0 and pcolor != black ]
]
; this is just to get a view of the regions to quickly see if our code worked, it can be removed
ask patches [ set plabel region ]
end
to-report patches-adjacent
report patches-adjacent-ex (patch-set self) pcolor
end
to-report patches-adjacent-ex [found pc]
let newly-found neighbors4 with [ (not member? self found) and pcolor = pc and region = 0 and pcolor != black ]
set found (patch-set found newly-found)
ask newly-found [
; use recursion to find the patches adjacent to each newly-found one
; relying on updating the `found` agentset as we go to avoid duplicates
; or looping forwarder
set found (patches-adjacent-ex found pc)
]
report found
end