Вы прокомментировали мой первый ответ
Моя главная проблема заключается в том, что мне нужно запустить "find max-one-of neigboring-large-patches [large-scale-variable]", чтобы яМне нужны мои черепахи, чтобы понять, каковы соседние крупные участки, и уметь читать их как единицы, если это имеет смысл. Я не могу понять, как включить это в ваш ответ, какие-нибудь мысли?
Вот как это сделать. Этот код быстрый и неаккуратный, но он иллюстрирует суть.
Пусть большие области имеют значения x и y, сгенерированные во время создания. По сути, они хранят номера столбцов и строк сетки больших областей, которая покрывает область просмотра.
breed [ large-regions large-region ]
large-regions-own [
terrain
region-color
population
x
y
]
Тогда, концептуально, соседи области будут иметь значения x и y в пределах +/- 1 отзначения x и y региона, так что вы можете идентифицировать их таким образом.
Чтобы упростить кодирование за счет места, когда я генерировал регионы, я также сохранял уникальный идентификатор (who) этого региона и его xи значения y в каждом патче в этом регионе, в переменных lrx и lry.
patches-own [
large-region-who
lrx
lry
]
Суть поиска соседнего большого региона с максимальным значением совокупности, как вы и просили, приведена ниже. Я кодировал это для скорости в отладке, а не для элегантности, так что это может быть значительно убрано. В полном исходном коде есть много операторов печати, которые эффективно комментируют каждый шаг в решении запрошенного поиска.
Это оглядывается (исправление 0 0), находит информацию о x и y большой области из этого исправления, генерируетнабор агентов больших регионов с близлежащими значениями x и y выполняет поиск по максимальному [населению] для этого набора, чтобы извлечь регион с наибольшим населением. Он также окрашивает запрашивающий участок в черный, локальный большой регион - в синий, а максимальный сосед - в красный.
В основном это работает - большие области смещены на один патч от того места, где они должны быть - но это иллюстрирует суть. Запустите программу установки и зайдите и убедитесь сами.
Вот (некрасивый) код для игры. Интересная проблема. Вы также можете легко распространить это на небольшие регионы, и оба будут работать одновременно. Наслаждайтесь!
globals [
large-region-size
]
breed [ large-regions large-region ]
large-regions-own [
terrain
region-color
population
x
y
]
patches-own [
large-region-who
lrx
lry
]
to setup
clear-all
set large-region-size 5
no-display
make-large-regions
ask patches [ set pcolor white ]
display
ask large-regions [ set hidden? true]
print (word " hilly region count: " count large-regions with [terrain = "hilly"] )
;; print (word " deep snow count: " count small-regions with [snow-cover > 75])
reset-ticks
end
to go
ask patches [ set pcolor white]
; ;; lets examine the large-regions
; print " large region xvals "
; let xvals [ ]
; ask large-regions [ set xvals fput x xvals ]
; set xvals remove-duplicates xvals
; show xvals
; print " "
; print " patch lrx values: "
; set xvals [ ]
; ask patches [ set xvals fput lrx xvals ]
; set xvals remove-duplicates xvals
; show xvals
; print "========================================="
print " let's examine large-regions around the patch at 0 0 "
let x-spot 0
let y-spot 0
print ( word " looking for large-regions with max population bordering the following patch " x-spot " " y-spot)
; ask n-of 1 patches [ set x-spot pxcor set y-spot pycor print (word "selected patch " x-spot ", " y-spot )]
let home-who [ large-region-who] of patch x-spot y-spot
print (word "home-region-who is " home-who)
print " "
;; thinking ahead, we have coded the x and y values of the large region around us directly into the patch variables
let home-x [ lrx ] of patch x-spot y-spot
let home-y [ lry ] of patch x-spot y-spot
print (word "this blue home region has x=" home-x " and y=" home-y )
ask patches with [lrx = home-x and lry = home-y] [ set pcolor blue ]
ask patch x-spot y-spot [ set pcolor black ]
let home-neighbor-set large-regions with [
( x >= ( home-x - 1 )) and ( x <= ( home-x + 1) ) and (y >= ( home-y - 1 ) ) and ( y <= ( home-y + 1 ) ) ]
print "count of home-neighbor-set is "
print count large-regions with [
( x >= ( home-x - 1 )) and ( x <= ( home-x + 1) ) and (y >= ( home-y - 1 ) ) and ( y <= ( home-y + 1) ) ]
print " "
print "here is that set "
show home-neighbor-set
print " "
ask home-neighbor-set [ print (word "Large region with who = " who " has population " population )]
let big-boy max-one-of home-neighbor-set [ population]
show big-boy
print ( word " Neighboring red large-region with largest population is " big-boy " with population " [population] of big-boy )
let bbx 0
let bby 0
let bwho 0
ask big-boy [ set bbx x set bby y set bwho who]
ask patches with [lrx = bbx and lry = bby] [ set pcolor red ]
tick
end
to make-large-regions ;; for testing
let px min-pxcor
let py min-pycor
let region-id -1 ;; missing
let mysize large-region-size
let stopper 0
while [px < max-pxcor] [
while [py < max-pycor] [
if stopper > 300 [ stop ] ;; stops making large regions
set stopper stopper + 1
let xcode round ( ( px + 1) / 5)
let ycode round ( ( py + 1) / 5)
;; make a new region
let decolor one-of [ red blue yellow green ]
create-large-regions 1 [
set terrain one-of ["hilly" "flat" "mountain" "water" "swamp"]
set region-id who
set population random 1000
set x xcode
set y ycode
set region-color decolor
]
;; large region is defined, update the patches in that region
ask patches with [ (abs (pxcor - px) < (mysize / 2) )
and (abs (pycor - py) < (mysize / 2) )] [
set pcolor decolor
set large-region-who region-id
set lrx xcode
set lry ycode
]
set py py + mysize
]
if py > max-pycor [
set py min-pycor
set px px + mysize]
]
end