2016-06-24 11 views
1

Ich habe eine klumpige Landschaft, die aus einer Ernte Simulation resultiert. Ich möchte die Größe (Anzahl der verbundenen dunkelgrünen Flecken) der Klumpen identifizieren und ich möchte sie nur behalten, wenn sie größer als 20 zusammenhängende Flecken sind.NetLogo: Halten Sie Klumpen, wenn verbundene Patches bestimmter Größe

enter image description here

Die in R auf „Sieb“ äquivalent sein könnte, aber ich kann nicht herausfinden, wie es in NetLogo zu machen?

Jede Hilfe und Ideen, wie dies zu erreichen ist sehr geschätzt!


die Frage auf vorherigen basiert: NetLogo: how to identify the most extended cluster (patch cluster example)?

mein Code tatsächlich funktioniert nicht:

to find-clusters 
    ; assess the pcolors by timber value 

    ask patches with [road_by_harvest? = FALSE] [ 
    set pcolor 53 ; dark green 
    ] 
    loop [ 
    ;; pick a random patch that isn't in a cluster yet 
    let seed one-of patches with [cluster = nobody] 
    if seed = nobody [ 
     ;show-clusters 
     set plabel-list [pcolor] of patches 
     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 neighbors4 with [(cluster = nobody) and 
    (pcolor = [pcolor] of myself)] 
    [ set cluster [cluster] of myself 
    grow-cluster ] 
end 

Antwort

2

Im Wesentlichen sollten Sie Tiefensuche tun und einen Cluster zu einem bestimmten Label Gruppe, für alle Gruppen (dh während keine Gruppen unerforscht sind). Nachdem Sie sie beschriftet haben, sammeln Sie alle Gruppen. und entfernen Sie Cluster, so dass die Gruppengröße kleiner als der Schwellenwert ist. Im folgenden Beispiel färbe ich sie weiß ... die dunkelgrünen sind diejenigen, die übrig bleiben.

patches-own [cluster-id] 
to setup 
    clear-all 

    let threshold 10 
    ask patches [if (random 3) = 1[ set pcolor 53]] 
    ask patches [set cluster-id -1] 
    label-patches 
    let clusters remove-duplicates [cluster-id] of patches 
    remove-clusters clusters threshold  
end 

;; this will label all clusters 
to label-patches 
    let num-clusters 0 
    while [any? patches with [cluster-id = -1 and pcolor = 53]] 
    [ 
    ask one-of patches with [cluster-id = -1 and pcolor = 53] 
    [label-neighbors num-clusters] 
    set num-clusters num-clusters + 1 
    ] 
end 

;; this will label the whole cluster that a green patch is connected to 
to label-neighbors [a-cluster-id] 
    set cluster-id a-cluster-id 
    ask neighbors4 with [cluster-id = -1 and pcolor = 53][label-neighbors a-cluster-id] 
end 

to remove-clusters [ clusters threshold] 
    foreach clusters 
    [ 
    if count patches with [cluster-id = ?] < threshold 
    [ 
    ask patches with [cluster-id = ?] [set pcolor white] 
    ] 
    ] 
end 
+0

Cool, danke! – maycca