2016-05-29 8 views
1

Ich versuche, räumliche Muster auf Netlogo zu simulieren. Ich habe einen Code geschrieben, der die Landschaft in gleiche Teile teilt, abhängig von den vom Benutzer eingestellten Zeilen- und Nullzeilen. Zum Beispiel, in diesem Fall eine 3 X 3 Landschaft, bestehend aus 9 ‚Lager‘:Looping zu Anzahl Patches in Netlogo

3 X 3 landscape; each smaller square is a camp

Ich versuche, jedes Lager eine andere PLabel zu setzen, 0-8 in diesem Fall der Nummerierung, um die Nutzungs Identifizieren Sie, welches Lager das ist. Ich habe versucht, Schleifen zu verwenden, um dies festzulegen, aber unerwartete Probleme auftreten.

to set-camp-number 

    let startcol max-pxcor/no-of-cols 
    let startrow max-pycor/no-of-rows 
    let t 1 
    set camp-number 0 
    while [ t <= no-of-cols ] [ 
    set a startcol * t 
    ask patches with [ pxcor <= a and pxcor >= a - startcol ] [ 
     let k 1 
     loop [ 
     if k > no-of-rows [ stop ] 
     set b startrow * k 
     ask patches with [ pxcor <= a and pxcor >= a - startcol and pycor <= b and pycor >= b - startrow ] [ 
      set plabel camp-number ] 
      set camp-number camp-number + 1 
      set k k + 1 ]] 
    set t t + 1 ] 

end 

Statt zu bekommen, was ich will (was jedes Lager ist selbst Patches Markierung 0-8 in diesem Szenario), die Lagernummer scheint selbst in einer Schleife laufen zu lassen, ist es sehr große Werte von PLabel resultierenden .

My current output

Ich habe andere Methoden ausprobiert, aber dies scheint einfachsten zu sein, zu verstehen, aber ich weiß, Schleifen manchmal in Netlogo schwierig sein können. Ich habe versucht, foreach-Befehl zu implementieren, da das Schleifen so mühsam ist, Patches zu beschriften (es muss einen anderen Weg geben?), Aber ich blieb stecken. Ich würde deine Hilfe sehr schätzen. Vielen Dank!

Antwort

2
globals [n-rows n-cols] ; to be set by user in your code 

to setup 
    ca 
    set n-rows 3 
    set n-cols 3 
    ask patches [set plabel category self] 
end 

to-report category [#patch] 
    let _colstep world-width/n-cols 
    let _rowstep int (world-height/n-rows) 
    let _x [pxcor] of #patch - min-pxcor 
    let _y [pycor] of #patch - min-pycor 
    let _rownum int (_y/_rowstep) 
    let _colnum int (_x/_colstep) 
    report _rownum * n-cols + _colnum 
end 
+0

Warum nicht einfach sagen lassen _x pxcor - min-pxcor? Gleiches für das y. Ich sehe kein Bedürfnis, einen Verweis auf sich selbst zu geben. – mattsap

+0

Dies ist bei weitem ein effizienter Code! Ich habe mich ein wenig mit der Logik hinter der letzten Zeile auseinandergesetzt, aber das macht jetzt viel mehr Sinn! Danke Alan! – lyh198

+1

@mattsap Ja, das könnte man hier machen. Ich neige zu Schreibverfahren ohne Nebenwirkungen, sogar in NetLogo. – Alan