2016-08-05 23 views
1

Ich schreibe ein Netlogo-Modell, das nur Patches enthält. Es ist mir gelungen, eine Landschaft aus Flecken von 6 verschiedenen Farben (die jeweils eine andere Vegetation in meinem Projekt repräsentieren) nach Wahrscheinlichkeit zu erstellen. So haben rote Flecken eine Wahrscheinlichkeit von 10% auf jedem Pflaster, gelb 5%, braun 20% und so weiter.Patches erstellen, ohne das Vorkommen zu ändern

Ein Beispiel für meinen Code, wo diese Wahrscheinlichkeit hoch gesetzt:

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

Dies schafft jedoch ein zufälliges Muster für jede Farbe. Aber ich möchte ein geclustertes räumliches Muster für eines von ihnen erstellen. Insbesondere in meiner Landschaft möchte ich, dass der Anteil an braunen Flecken bei 50% liegt. Aber wenn ich diese 50% -Wahrscheinlichkeit für jedes Pflaster festlege, werden die braunen Flecken zufällig verteilt. Wie bekomme ich 50% meiner Landschaft, aber in einem gruppierten Muster?

Ich versuchte, das gruppierte Muster unter Verwendung der Moore Nachbarschaft zu schaffen, aber das ändert offensichtlich den Anteil der braunen Flecken.

Ich hoffe, das ist etwas klar. Danke für jede Hilfe im Voraus.

+0

http://stackoverflow.com/questions/19326781/adding-patch-clusters-in-a-landscape, http://stackoverflow.com/questions/20336364/how-to-create-cluster- patches-that-do-not-overlap-zwischen-ihnen, http://stackoverflow.com/questions/22121735/to-build-patch-clusters-at-large-spatial-scales, http://stackoverflow.com/ Fragen/20997901/creating-a-random-shape-blob-eines-gegebenen-bereich-in-netlogo/ –

Antwort

1

Sie könnten basierend auf Ihren Gewichten Samen und dann um die Samen wachsen. Hier ist ein anderer Ansatz: Färben Sie alle Patches basierend auf Ihren Gewichten und gruppieren Sie dann die Farben.

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

Hallo Alan! Vielen Dank! Das funktionierte hauptsächlich für mich, außer für die verschachtelten Listen, wo ich versuche, die Gewichtsnummer durch eine Variable zu ersetzen, die in einer anderen Prozedur berechnet wurde. Ich lese ich muss 'Liste' verwenden, um eine Liste mit einer Variablen zu erstellen? Aber ich bekomme den Fehler "erwartet eine Konstante" ... Weißt du vielleicht wie man das löst? – lyh198

+0

Was ich bisher versucht habe, lasse _cw Liste (Liste braun x) [blau 0.2]; x ist eine Variable, die in der vorherigen Prozedur gesetzt wurde. Netlogo erlaubt es aber Fehleroberflächen, die ich nicht verwenden kann, gehen in einen Beobachterkontext. – lyh198

+0

Ihre Liste ist korrekt, aber Sie benötigen Klammern, wenn Sie mehr als zwei Unterlisten haben. Der 'go' Fehler ist etwas anderes. Es bedeutet, dass Sie go geschrieben haben, so dass es sich direkt auf eine Patch- (oder Turtle-) Variable bezieht, anstatt einen Patch (oder eine Turtle) zu bitten, auf sein Attribut zuzugreifen. – Alan