2016-08-05 2 views
1

Я пишу модель Netlogo, которая включает только патчи. Мне удалось создать ландшафт, состоящий из пятен 6 разных цветов (каждый из которых представляет собой разную растительность в моем проекте) по вероятности. Таким образом, красные пятна имеют вероятность 10% на каждом патче, желтый 5%, коричневый 20% и так далее.Создание кластеров патчей без изменения вхождения

Пример моего кода, где эта вероятность устанавливается:

let i random-float 1 
    ifelse i + random-float 0.1 <= 0.8 ;random 0.1 threshold for environmental noise 
     [ set pcolor green ] 
     [ ifelse i + random-float 0.1 <= 0.9 
     [ set pcolor yellow ] 
     [ set pcolor blue ] ] 

Однако это создает случайный образец для каждого цвета. Но я хотел бы создать кластерный пространственный шаблон для одного из них. В частности, в моем пейзаже я хочу, чтобы доля коричневых пятен составляла 50%. Но если бы я установил эту 50-процентную вероятность для каждого патча, коричневые патчи будут распределены случайным образом. Как заставить его занять 50% моего пейзажа, но появиться в кластерном шаблоне?

Я попытался создать кластерный рисунок, используя район Мура, но это, очевидно, изменяет пропорцию коричневых пятен.

Я надеюсь, что это несколько ясно. Спасибо за любую помощь заранее.

+0

http://stackoverflow.com/questions/19326781/adding-patch-clusters-in-a-landscape, http://stackoverflow.com/questions/20336364/how-to-create-cluster- патчи -что-не-перекрытие между ними, http://stackoverflow.com/questions/22121735/to-build-patch-clusters-at-large-spatial-scales, http://stackoverflow.com/ вопросы/20997901/create-a-random-shape-blob-of-a-given-area-in-netlogo/ –

ответ

1

Вы можете посеять на основе ваших весов, а затем расти вокруг семян. Вот другой подход: покрасьте все патчи на основе ваших весов, а затем сгруппируйте цвета.

extensions [rnd] ;use the rnd extension 
globals [threshold] 

to setup 
    ca 
    set threshold 2 
    let _cw [[red 10] [yellow 20] [blue 70]] ;colors with weights 
    ask patches [set pcolor first rnd:weighted-one-of-list _cw [last ?]] 
    repeat 20 [cluster] ;adjust to taste 
end 

to cluster 
    ask patches [ 
    if unhappy? [ 
     swap-pcolor 
    ] 
    ] 
end 


to swap-pcolor 
    let _c pcolor 
    let _p one-of neighbors with [pcolor != [pcolor] of myself] 
    set pcolor [pcolor] of _p 
    ask _p [set pcolor _c] 
end 

to-report unhappy? 
    let _ct count neighbors with [pcolor = [pcolor] of myself] 
    report (_ct < threshold) 
end 
+0

Привет, Алан! Спасибо! Это работало в основном для меня, за исключением части вложенных списков, где я пытаюсь заменить номер веса переменной, которая была рассчитана в другой процедуре. Я читал, что мне нужно использовать «список» для создания списка с переменной? Но я получаю ошибку «ожидаемая константа» ... возможно, вы знаете, как это решить? – lyh198

+0

Что я пробовал до сих пор let _cw list (list brown x) [blue 0.2]; x - переменная, установленная в предыдущей процедуре. Netlogo позволяет это, но поверхности ошибок, которые я не могу использовать, выходят в контексте наблюдателя. – lyh198

+0

Ваш список верен, но вам понадобятся скобки, если у вас более двух подписок. Ошибка 'go' - это что-то еще. Это означает, что вы написали так, чтобы он напрямую ссылался на переменную патча (или черепахи) вместо того, чтобы просить патч (или черепаху) получить доступ к его атрибуту. – Alan

Смежные вопросы