Многомасштабный ландшафт в Netlogo (небольшие патчи и большие группы патчей) - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь представить многомасштабную среду, в которой у меня есть большие участки, представляющие важные области в ландшафте, и меньшие участки, которые содержат локальную информацию. Например, я хочу получить данные о снеге в масштабе 1 км ^ 2, но я также хочу иметь более крупные участки (9 км ^ 2), которые суммируют крупномасштабную информацию. Каждое из моих больших исправлений имеет значение переменной, которое отличается от своих соседей, но значение переменной может повторяться по всему ландшафту в других исправлениях. Я ищу самый простой способ для моих черепах определить разницу между крупномасштабными пятнами. Я думал о создании наборов патчей, но я не уверен, как обойти проблему повторения значений переменных в разных патчах. Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: я создал растр с такой же структурой патчей, как крупномасштабный растр и назначил "ID-патч", используя его, чтобы больше не было повторения переменных в мире,Я все еще пытаюсь заставить черепах идентифицировать эти большие участки как сгруппированные объекты.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Вы прокомментировали мой первый ответ

Моя главная проблема заключается в том, что мне нужно запустить "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
0 голосов
/ 11 ноября 2019

Возможно, это не лучший способ, но я думаю, что это сработает. Вы можете позволить регионам иметь несколько переменных, таких как «large-region-unique-id» и «small-region-unique-id», и сделать один проход, чтобы установить все эти переменные. Тогда черепахе нужно будет только взглянуть на участок, чтобы узнать, в какой малый и большой регион он входит.

Если бы вы также создали породу агентов, называемых «регионами» (скажем), у вас могли бы быть регионы…собственные переменные и имеют уникальный идентификатор региона. (на самом деле, номер агента будет работать для этого)

Это должно закодировать информацию, чтобы движущаяся черепаха могла легко найти соответствующую информацию.

breed [ large-regions large-region ]
large-regions-own [
   terrain-type
   large-scale-variables
...
   (who)
]

breed [ small-regions small-region ]
small-regions-own [
   snow-cover
   small-scale-variables
   ...
   (who)
]

patches-own [
   large-scale-region-who   ;;  the id (who) of the large-scale-region the patch is in
   small-scale-region-who   ;;  the id (who) of the small-scale-region the patch is in
   ...
]

Тогда черепаха могла бы спроситьпатч для соответствующей информации о пользователях и используйте его для поиска данных из более крупных «патчей».

Вот как это может выглядеть

  print (word " hilly region count: " count large-regions with [terrain = "hilly"] )
  print (word " deep snow count: " count small-regions with [snow-cover > 75])

  ;; how about highlighting patches that are mountainous with deep snow?

    no-display
    ask patches [
    set terrain-type ""
    set my-snow-cover -1

    set srw  small-scale-region-who     
    if srw > 0 [set my-snow-cover [snow-cover] of (small-region srw)]

    set lrw  large-scale-region-who       
    if lrw > 0 
    [ set terrain-type [terrain] of large-region lrw]

    if-else  (terrain-type = "mountain") and (my-snow-cover > 75)  
        [ set pcolor white ]
        [ set pcolor black ]

   ]
  display
  print " The mountainous terrain with deep snow-cover is shown in white "
...