2016-04-04 3 views
1

Ich habe Patches mit 3 Farben (gelb, grün und rot). Die grünen haben einen Rangwert. Ich möchte eine gegebene Anzahl ('n-Zellen') von entweder gelben oder grünen Flecken ('Kandidaten-Zellen') fragen, um rot zu werden. Ich bin mir bewusst, was ich tun kann, dass zufällig die primitive mit ‚n-of‘, wie folgt aus:Wie fügt man dem Primit 'n-of' in NetLogo 'Prioritäten' hinzu?

let candidate-cells (patches with [ pcolor = yellow or pcolor = green ]) 
ask n-of n-cells candidate-cells [ set pcolor red ] 

Aber ich würde zu den Patches wie Prioritäten hinzufügen, die gerötet wird. Erstens möchte ich, dass gelbe Flecken rot werden (zufällig), aber wenn es immer noch Flecken gibt, die rot werden, nachdem alle Flecken gelb sind, möchte ich grüne Flecken mit dem höchsten Rangwert rot werden lassen, bis die Anzahl der gedrehten Flecken erreicht ist die Nummer der 'n-Zellen'. Ich denken dieses Stück Code, bis auf seine letzte Zeile funktionieren sollte:

let candidate-yellow-cells (pcolor = yellow) 
    let candidate-green-cells (pcolor = green) 

    ask n-of n-cells candidate-yellow-cells [ set pcolor red ] 

    if n-cells > candidate-yellow-cells [ 
    let left-cells (n-cells - candidate-yellow-cells) 
    ask n-of left-cells candidate-green-cells [ set pcolor red ] 

Aber noch bin ich mit ‚n-of‘ wieder für die grünen Zellen, frage ich mich, wie konnte ich ersetzen, die durch etwas, das würde die "linken Zellen" als die grünen Flecken mit dem höchsten "Rang" -Wert auswählen. Vielen Dank im Voraus.

Antwort

1

Dieses Beispiel sollte man dort:

globals [n-cells] 
patches-own [rank] 
to setup 
    set n-cells 500 
    ask patches [ 
    set pcolor one-of [yellow green red] 
    set rank random 3 
    ] 
end 

to recolor 
    let _yellows (patches with [pcolor = yellow]) 
    let _ny count _yellows 
    ifelse (n-cells > _ny) [ 
    ask _yellows [set pcolor red] 
    let _greens sort-on [(- rank)] (patches with [pcolor = green]) 
    let _ng length _greens 
    let _n min (list (n-cells - _ny) _ng) 
    ask patch-set sublist _greens 0 _n [set pcolor red] 
    ][ 
    ask n-of n-cells _yellows [ 
     set pcolor red 
    ] 
    ] 
end 
+0

Danke, Alan, erneut gespeichert Sie den Tag. Könnte doch irgendjemand bitte erklären, warum wir das 'min' brauchen: 'lasst _n min (list (n-cells - _ny) _ng)'? –

+0

@ThalesWest Sie können nicht mehr Patches anfordern, als es gibt, also wenn Sie nach zu vielen fragen, fragt das nur alle, die es gibt. Eine Alternative besteht darin, in Betracht zu ziehen, dass zu viele ein Fehler sind, aber hier ging ich davon aus, dass das Programm weiterlaufen sollte. – Alan