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 ],

Другие вопросы по тегам