2016-05-12 10 views
1

Ich versuche, eine Schildkröte Suchfunktion zu codieren, wobei:Wie mache ich Schildkröten für Patches mit festgelegten Bedingungen in einem Satz suchen Radius

wenn sociability> = 0,5 und die lokale Patch-Dichte < Zieldichte

Suchen Sie dann im Umkreis Moves_per_tick nach einem Patch mit einer Differenz zwischen Dichte und Zieldichte, die kleiner ist als die Differenz zwischen der aktuellen Dichte und der Zieldichte.

Wenn eine existiert, dann gehe zu diesem Patch. Wenn keine existieren, dann mache eine zufällige Bewegung der Länge moves_per_tick

Aber ich bin nicht genug vertraut mit der NetLogo Sprache noch, um dies zu ermöglichen. Ich habe mir einige ähnliche Fragen angeschaut, aber keine von ihnen hat mich meinem Ziel nahe genug gebracht.

bin Abarbeiten ich zur Zeit diesen Code, die in vielerlei Hinsicht gebrochen:

to start_search_personality 
    let LD density 
    let AT (Target_density * sociability) 
    let C_D (AT - LD) 

    if sociability >= 0.5 
    [ 
    ifelse C_D >= 0 
     [ 
     let P any? one-of patches with (patches in-radius moves_per_tick with [density] > LD) 
     if [density] of P > LD 
     [face p move-to p]] 
     [move-to patch-here] 
    ] 

Dichte von Patches und definiert als die Anzahl der Schildkröten im Patch gehört. Schildkröten besitzen eine Soziabilität, die einen Wert zwischen 0 und 1 darstellt. Zieldichte wird von woanders eingegeben und ist eine Ganzzahl.

Ich bitte niemanden darum, diesen Code zu debuggen, aber lassen Sie mich zumindest wissen, ob ich auf dem richtigen Weg bin oder vorschlagen, wo ich hinschauen soll. Vielen Dank!

+0

Sie sagen, dass ein Patch diese Funktion aufruft? Da Dichte eine Patch-Variable ist? Wenn ja, wie kann sich ein Patch bewegen? Scheint es, als würden Sie die Definition der Patch-Dichte und die Anzahl der Schildkröten auf dem Patch mischen? – mattsap

Antwort

2

Hier ist mein bester Versuch zu versuchen, die Logik zu verstehen.

to start_search_personality 
    let density-here count turtles-here 

    if sociability >= 0.5 and density-here < target-density 
    [ 
    let p patches in-radius moves_per_tick 
    ifelse any? p with [target-density < abs (density - target-density)] 
    [move-to one-of p with [target-density < abs (density - target-density)]] 
    [ ;;move in a random direction of length moves per tick 
     set heading (random 360) 
     fd moves_per_tick 
    ]  
    ] 
+0

Danke, das hat mich dem ultimativen Ziel viel näher gebracht und beantwortet die obige Frage gut. Diese Funktion wird von move aufgerufen, das in go ist (eine Funktion für immer), aber es funktioniert nur einmal. Wie bekomme ich es, diese Suche jeden Tick neu zu starten, bis die lokale Dichte> = die Zieldichte? Ich habe ein bisschen mit Loops herumgespielt, aber jedes Mal stehe ich in einer unendlichen Serie, die das Modell einfriert ... – Jesse001

+0

Ich glaube nicht, dass eine Funktion, die einmal aufgerufen wird, für immer ... Bist du sicher, dass dein Go-Button hat das für immer ausgewählt? – mattsap

+0

Ja, könnte das Problem sein, dass die Suchfunktion aus zweiter Hand aufgerufen wird? Mit anderen Worten, ist es ein Problem, dass ich diese Funktion mit Move aufrufen, die mit Go aufgerufen wird? – Jesse001

0

Mit den obigen Kommentaren habe ich jetzt einen Funktionscode. Wenn Sie es für sich selbst wiederverwenden, würde ich empfehlen, die Farbänderungen zu entfernen (die ich gerade verwendet habe, um zu testen, dass jede Funktion aufgerufen wurde). Target_density ist zu Beginn des Laufs festgelegt, Schildkröten besitzen s (was zwischen 0 und 1 liegt), Patches besitzen eine eigene Dichte (die bei jedem Tick aktualisiert und als Anzahl der Schildkröten im Patch definiert wird). Die letzte Hürde wird sein, ein Ranking-System zu etablieren, da dieser Code empfindlich für hohe target_densities ist.

to check_personality 
    move-to patch-here 
    let N max-one-of neighbors [density] 
    let ND max [density] of neighbors 
    let LD [density] of patch-here 
    let AT (Target_density * s) 
    let p patches in-radius moves_per_tick_baseline 
    let diff_1 (AT - LD) < (AT - ND) 
    let diff_2 (AT - LD) > (AT - ND) 
    let diff_3 (AT - LD) = (AT - ND) 

ifelse s > 0.5 

[if LD < AT[ 

if diff_1 [ set color white 
    ifelse density >= (0.90 * AT) 
    [move-to patch-here] 
    [ifelse any? p with [density > LD] 
     [move-to one-of p with [density > LD]] 
     [face N forward moves_per_tick_baseline] 
    ] 
    ] 

if diff_2[ set color gray 
    move-to N 
     ] 

if diff_3 
[if ND < LD 
    [ 
    set color black 
    ifelse any? p with [density >= LD] 
    [move-to one-of p with [density >= LD]] 
    [face N forward moves_per_tick_baseline] 
    ] 

    if ND > LD 
    [move-to patch-here face N move-to N]] 
    if ND = LD 
    [ifelse ND = 0 
     [set heading (random 360) forward moves_per_tick_baseline] 
     [set heading (random 360) forward moves_per_tick_baseline] 
    ] 
] 


if LD >= AT [set color yellow set size 10]]