2017-08-17 15 views
-1

ich im Voraus entschuldigen, wie einfach die Antwort wahrscheinlich auf diese Frage ist, bin ich sehr neu für NetLogo und sehr aus meiner Tiefe.Netlogo Vergleich Liste der globalen Variablen Zahlen

Ich versuche, eine Wassertemperatur von einer Datei zu lesen und damit meine Schildkröten zu bekommen zu sterben/Rasse abhängig von der Temperatur ab. Ich habe die Datei endlich gelesen und habe die Wassertemperatur als globale Variable eingestellt, bin aber jetzt im Vergleichsteil festgefahren. Es lässt mich die Variable nicht mit einer Zahl vergleichen, weil ich denke, dass die Variable eine Liste ist. Die folgende Fehlermeldung wird angezeigt.

The > operator can only be used on two numbers, two strings, or two agents of the same type, but not on a list and a number. 
error while turtle 7 running > 
    called by procedure REPRODUCE 
    called by procedure GO 
    called by Button 'go' 

Code ist unten;

globals [ year 
    month 
water-temperature ] 
extensions [ csv ] 


to setup 
    ca 
    load-data 
    create-turtles 50 
    [ set size 1 
    set color red 
    setxy random-xcor random-ycor ] 
    reset-ticks 
end 

to go 
    ask turtles [ move 
    reproduce ] 
    run-temperature 
end 

to load-data 
    file-close-all 
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv" 
end 

to run-temperature 
    file-close-all 
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv" 
    while [ not file-at-end? ] [ 
    set water-temperature csv:from-row file-read-line 
    tick ] 
    file-close 
end 

to move 
rt random 50 
    lt random 50 
    fd 1 
end 

to reproduce 
    if water-temperature > 35 [ die ] 
    if water-temperature > 30 and water-temperature < 34 [ hatch 1 rt random-float 360 fd 1 ] 
    if water-temperature > 25 and water-temperature < 29 [ hatch 2 rt random-float 360 fd 1 ] 
    if water-temperature > 20 and water-temperature < 24 [ hatch 3 rt random-float 360 fd 1 ] 
end 

Ich wäre so dankbar für jede Hilfe!

Thanks :)

Hannah

Antwort

2

willkommen Überlauf zu stapeln. Können Sie bitte ein Beispiel für die ersten Zeilen Ihrer "test3.csv" -Datei angeben? Das hilft, Ihre Frage zu sortieren - wenn Sie einen Header oder mehrere Spalten haben, die Ihre Probleme verursachen könnten - werden mehrere Spalten möglicherweise als Liste eingelesen. Außerdem denke ich, dass Sie file-read anstelle von file-read-line wollen.

Ein paar andere Dinge - Ihre load-data Prozedur ist unnötig, soweit ich sagen kann (Sie brauchen nur das Laden in run-temperature auftreten).

Noch wichtiger ist, Ihr Code jetzt etwas sagt wie: „Alle Schildkröten, bewegen und reproduzieren Nun, lesen Sie die ganze Temperatur Datei Zeile für Zeile.“ Das Problem ist, dass Ihre while Aussage sagt, „bis Sie haben noch das Ende der Datei erreicht, eine Zeile gelesen, tick, und zum nächsten bewegen.“ Darüber hinaus wird Ihr Modell tick einmal pro Zeile, ohne die Schildkröten jemals tun anything- ist es wahrscheinlich einfacher, nur Ihre tick am Ende Ihres go Verfahren haben. Es ist wahrscheinlich besser, die Verwendung von while in Ihrem go Verfahren in diesem Szenario zu vermeiden, da es Schleife, bis die while Bedingung erfüllt ist.

Es könnte einfacher sein, einfach Ihre ganze test.csv zu lesen und in einer Variablen zu speichern, um den Zugriff zu erleichtern - hier ein Beispiel. Verwenden Sie dieses Setup:

Zuerst sagen Netlogo Wasser-Temperatur-Liste ist eine Liste mit Satz und []. Führen Sie dann dieselbe Datei wie zuvor zum Öffnen/Schließen aus, um die Datei für das Lesen vorzubereiten. Verwenden Sie dann eine ähnliche while Schleife Ihre Temperaturen in water-temperature-list zu lesen, mit lput:

set water-temperature-list [] 

    file-close-all 
    file-open "test3.csv" 
    while [ not file-at-end? ] [ 
    set water-temperature-list lput file-read water-temperature-list 
    ] 
    file-close-all 
    reset-ticks 
end 

Jetzt Ihrem Modell einfacher, diese Werte zugreifen, da sie direkt in einem Modell Variable gespeichert werden. Sie können leicht den ticks Wert mit item als Index zum Beispiel für die Listen- verwenden, auf tick 0 das erste Element in der Liste zugegriffen wird, auf tick 1 das zweite Element, und so weiter.Zum Beispiel:

to go 
    set water-temperature item ticks water-temperature-list 

    ask turtles [ 
    if water-temperature > 30 [ 
     die 
    ] 
    if water-temperature <= 30 [ 
    rt random 60 
    fd 1 
    ] 
    ] 
    tick 
end 

Beachten Sie, dass mit dieser Einstellung, wenn Sie bis zum Ende Ihrer Temperaturen zu bekommen, wird ein Fehler sein, die besagt, dass Netlogo nicht die nächste Liste finden Element- Sie setzen müssen, werden Halte den Zustand irgendwo an, um das zu verhindern.

Ich weiß, dass eine Alternative zu Ihrem Ansatz ist, aber ich hoffe, dass es hilfreich ist. Für ein anderes ähnliches, aber komplizierteres Beispiel, sehen Sie sich diese model by Uri Wilensky an.

Verwandte Themen