2017-02-15 36 views
1

У меня есть модель, которая генерирует кластеры желтых патчей, и мне интересно посмотреть на частотное распределение размеров кластеров. Для этого я кооптировал код из «Пример кластеров патчей» в библиотеке кодов NetLogo. Кажется, что он работает (см. Фотографии ниже) с точки зрения поиска кластеров (хотя я бы предпочел, чтобы он не учитывал зеленые пятна в кластерах), но я не могу понять, как получить размеры (или количество патчей) каждого из этих кластеров. В идеале я хотел бы сделать гистограмму частотного распределения размеров кластеров (за исключением зеленых патчей) и иметь возможность экспортировать эти данные.Как хранить/подсчитывать размеры отдельных кластеров и строить их в NetLogo

Кроме того, было бы здорово, если бы я мог найти способ получить гистограмму частот размера кластера во время работы модели.

Код, который я использую, чтобы получить кластеры прямо из «Патч-кластеров», кроме того, что я убиваю всех агентов, чтобы я мог читать числа. Здесь это ...

to find-clusters 
ask turtles [die] ;; this clears the board so I can see the clusters 
    loop [ 
    ;; pick a random patch that isn't in a cluster yet 
    let seed one-of patches with [(cluster = nobody)] 
    ;; if we can't find one, then we're done! 
    if seed = nobody 
    [ show-clusters 
     stop ] 
    ;; otherwise, make the patch the "leader" of a new cluster 
    ;; by assigning itself to its own cluster, then call 
    ;; grow-cluster to find the rest of the cluster 
    ask seed 
    [ set cluster self 
     grow-cluster ] 
    ] 
end 


to grow-cluster ;; patch procedure 
    ask neighbors with [(cluster = nobody) and 
    (pcolor = [pcolor] of myself)] 
    [ set cluster [cluster] of myself 
    grow-cluster ] 
end 

;; once all the clusters have been found, this is called 
;; to put numeric labels on them so the user can see 
;; that the clusters were identified correctly 
to show-clusters 
    let counter 0 
    loop 
    [ ;; pick a random patch we haven't labeled yet 
    let p one-of patches with [plabel = ""] 
    if p = nobody 
     [ stop ] 
    ;; give all patches in the chosen patch's cluster 
    ;; the same label 
    ask p 
    [ ask patches with [cluster = [cluster] of myself] 
     [ set plabel counter] ] 
    set counter counter + 1 ] 

end 

Спасибо за вашу помощь!

Model BEFORE finding clusters

Model after finding clusters

+0

Используйте 'расширение table', чтобы произвести таблицу частот в таблице:' графов [runresult plabel] из patches'. Затем вы можете использовать 'table: to-list', чтобы получить точки для построения графика. – Alan

ответ

0

В принципе, для каждого значения кластера в вашей модели, вы хотите, чтобы сосчитать все патчи с тем же идентификатором. Это можно сделать с помощью карты. Он использует список уникальных значений кластера патчей (remove-duplicates [cluster] of patches), а затем для каждой записи в этом списке он подсчитывает все исправления с этим значением кластера. Результаты сохраняются в списке, и они представляют размеры всех ваших кластеров. Этот список можно построить как гистограмму частоты, используя примитив histogram. Не забудьте установить x-ось вашего графика в правдоподобное максимальное значение и установить режим рисования в режим штриховки.

NetLogo 6 Синтаксис:

to calc-frequency 
    let freq map [[i] -> count patches with [cluster = i]] remove-duplicates [cluster] of patches 

    set-current-plot "hist" 
    histogram freq 
end 

NetLogo 5 Синтаксис:

to calc-frequency 
    let freq map [count patches with [cluster = ?]] remove-duplicates [cluster] of patches 

    set-current-plot "hist" 
    histogram freq 
end