NetLogo. Категории патчей из файла Landsat
Я расширяю модель, рассматривая влияние различных видов фруктов и фрагментации на популяцию обезьян. Модель считывает файл LandSat, состоящий из 1 и 0 (представляющий лесные и вырубленные леса). Мне нужно реклассифицировать 1 в три вида деревьев. На данный момент в коде у меня случайным образом заданы три типа деревьев, теперь я хочу, чтобы они были разделены на проценты, то есть 30 процентов лесных участков - синие, 50 процентов - желтые, 20 - зеленые. У меня есть этот банкомат: я думаю, что я должен изменить:
[if value = 1 [установить значение one-of tree-types ]
Я пытался с n-of, но я не могу заставить его работать.
Какие-либо предложения?
to load-forest
file-open "patch46.txt"
let tree-types [ 1 2 3 ]
let tree-colors [ 0 15 65 45]
let tree-fruits [ 0 25 50 100 ]
foreach n-values world-height [ min-pycor + ? ]
[let num-lines ?
foreach n-values world-width [ min-pxcor + ? ]
[let num-cols ?
ask patch num-lines num-cols
[set value file-read
]
]
]
file-close
ask patches
[ if value = 1 [ set value one-of tree-types ]
set pcolor item value tree-colors
set fruit item value tree-fruits
]
end
1 ответ
Одна из возможностей для вас будет использовать rnd:weighted-one-of
примитив из расширения NetLogo Rnd.
Это работает как one-of
, но вероятность выбора каждого элемента может быть разной (т. е. взвешенной).
Предположим, у вас есть список вероятностей для ваших различных типов деревьев:
let probabilities [ 30 50 20 ]
Вы можете использовать его как:
set value rnd:weighted-one-of tree-types [ item (? - 1) probabilities ]
Обратите внимание, что это даст вам в среднем 30% синих деревьев, 50% желтых деревьев и 20% зеленых деревьев, но это может варьироваться от бега к бегу. Так как вы уже использовали one-of
, который имеет тот же эффект (то есть, в среднем 33% каждого типа), я полагаю, вы в порядке с этим. Если бы вы хотели точные проценты каждый прогон, ответ был бы совсем другим.
Примечание:
Ваш tree-colors
а также tree-fruits
списки имеют "пустышку" 0
элемент, чтобы вы могли использовать тип дерева value
непосредственно в качестве индекса для этих списков. Это сбивает с толку, и плохая практика по разным причинам. Например, show length tree-fruits
распечатает 4
, Это также означает, что вы не можете использовать tree-types
и другие списки в том же foreach
или же map
построить, например: (foreach tree-types tree-fruits [...])
, Эти вещи могут показаться не такими уж важными, но в итоге они складываются и усложняют понимание вашей программы.
Вы должны либо укусить пулю и использовать value - 1
в качестве индекса или изменить нумерацию типов вашего дерева на [ 0 1 2 ]
,