Попытка заменить элементы во вложенном списке каждый тик

Я строю модель, имитирующую распространение вируса по миру. Сейчас у меня 16 регионов, в каждом по 28 переменных, влияющих на распространение вируса. Из-за большого количества переменных/регионов я знаю, что наиболее эффективно/лучше всего использовать списки.

Это мой текущий код для настройки регионов:

Set Name 0
Set Living-Pop 1
Set Infected-Pop 2
Set Dead-Pop 3
Set Vaccinated-Pop 4
Set Count-Patches 5
Set Density 6
Set Infected-Density 7
Set Development 8
Set Healthcare 9
Set Research-Constant 10
Set Research-Rate 11
Set Water-Constant 12
Set Water-Rate 13
Set Airport-Security 14
Set Border-Security 15
Set Vaccine-Constant 16
Set Vaccine-Rate 17
Set Region-Number 18
Set Airports? 19
Set Hospitals? 20
Set ER? 21
Set Research? 22
Set Water? 23
Set Infected-water? 24
Set Infected? 25
Set Vaccine? 26
Set Borders? 27

set region-data [
[ "Hinterlands"  36138177  0  0  0  2702  13374.60289  0  10  0.975  7.5E-11  0.027103633  0.5  5  0.25  0.03  50000000000  0.007227635  1  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "USA"  318433268  0  0  0  1272  250340.6195  0  10  1  7.5E-11  0.238824951  0.5  5  0.25  0.075  50000000000  0.063686654  2  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Central America"  204157962  0  0  0  383  533049.5091  0  6  0.45  2.5E-11  0.030623694  0.6  3.6  0.4  0.01  50000000000  0.024498955  3  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Andes"  97253901  0  0  0  558  174290.1452  0  5  0.45  2.5E-11  0.012156738  0.2  1  0.3  0.05  50000000000  0.00972539  4  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Amazon"  186508253  0  0  0  1407  132557.3937  0  6  0.45  1.5E-11  0.016785743  0.35  2.1  0.33  0.03  50000000000  0.02238099  5  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Patagonia"  94307819  0  0  0  481  196066.1518  0  5  0.65  1.5E-11  0.007073086  0.4  2  0.3  0.05  50000000000  0.009430782  6  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Europe"  742538246  0  0  0  1175  631947.4434  0  10  0.85  2.5E-11  0.185634562  0.5  5  0.1  0.01  50000000000  0.148507649  7  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Middle East"  209455634  0  0  0  1197  174983.8212  0  5  0.3  1.5E-11  0.015709173  0.1  0.5  0.5  0.5  50000000000  0.020945563  8  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "North Africa"  459321750  0  0  0  2661  172612.4577  0  4  0.2  2.5E-11  0.045932175  0.1  0.4  0.3  0.2  50000000000  0.03674574  9  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "South Africa"  695349014  0  0  0  1535  452996.1003  0  4  0.1  2.5E-11  0.069534901  0.2  0.8  0.3  0.03  50000000000  0.055627921  10  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Russia"  143538971  0  0  0  4071  35258.89732  0  8  0.5  7.5E-11  0.086123383  0.5  4  0.25  0.03  50000000000  0.022966235  11  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "East Asia"  1510450616  0  0  0  1602  942853.0687  0  7  0.35  6.5E-11  0.68725503  0.7  4.9  0.25  0.075  50000000000  0.211463086  12  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "South Asia"  1674152344  0  0  0  1346  1243798.175  0  5  0.25  3.5E-11  0.29297666  0.8  4  0.3  0.01  50000000000  0.167415234  13  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Austalia"  23132574  0  0  0  1156  20010.87716  0  9  0.85  5E-11  0.010409658  0.3  2.7  0.25  0  50000000000  0.004163863  14  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Oceania"  43984482  0  0  0  121  363508.1157  0  2  0.3  5E-12  0.000439845  0.01  0.02  0.25  0  50000000000  0.001759379  15  TRUE  TRUE  TRUE  FALSE  TRUE  FALSE  FALSE  FALSE  TRUE]
[ "Ocean"  0  0  0  0  56542  0  0  0  0  0  0  0  0  0  0  0  0  16  FALSE  FALSE  FALSE  FALSE  TRUE  FALSE  FALSE  FALSE  FALSE]

В процедуре настройки я хочу написать процедуру, которая будет выбирать 1 регион из списка региона-данных (с селектором), и заменять Infected? с true и Infected-Pop со случайным целым числом от 1 до 10. В моей процедуре запуска я затем планирую написать процедуры, которые будут устанавливать новые значения для зараженных, живых и мертвых для каждого тика, в зависимости от процента зараженных, уровня заражения, здравоохранения, развития, общей плотности, и зараженной плотностью.

Прежде чем перейти к хранению данных в списках из хранения данных в патчах, у меня работал этот код:

to-infect
 ask patches with [infected?][
    if infected-pop < living-pop [
      set infected-pop ((infected-pop + (((((infected-pop / living-pop) * (infection-rate / healthcare)) / development) * ((density - infected-density))) * 10)))  ]
    if infected-pop > living-pop [ set infected-pop living-pop ]
end

И нужно будет найти способ переписать этот код для работы со списками.

Кто-нибудь может помочь мне написать процедуру установки для достижения моей цели/помочь мне изменить мою процедуру перехода для списков, а не для исправлений?


person Alex Epstein    schedule 21.04.2015    source источник


Ответы (1)


Возможно, есть более умные решения, но вы могли бы сделать что-то вроде этого:

to replace [region var-position new-value]
  let i 0
  foreach region-data
  [
     if item 0 ? = region
     [
       set region-data replace-item i region-data replace-item var-position ? new-value
     ]
    set i (i + 1)
  ]
end

Условие if проверяет, равен ли первый элемент текущего подсписка region-data указанному region. Команда внутри условия if является вложенной функцией replace-item. Внутренний берет текущий подсписок region-data и заменяет указанный var-position подсписка указанным new-value. Внешний заменяет старый подсписок в region-data этим измененным списком. В вашем случае предположим, что у вас есть средство выбора на вашем интерфейсе с именем «region-chooser», вы можете вызвать функцию замены во время настройки следующим образом:

replace region-chooser Infected? TRUE
replace region-chooser Infected-Pop random 10

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

replace "USA" Water-rate 50
person nldoc    schedule 21.04.2015
comment
Похоже, было бы проще использовать map и ifelse-value? - person Seth Tisue; 21.04.2015