2017-08-17 194 views
-1

對於這個問題,我提前很抱歉,我對netlogo非常陌生,並且非常深入。Netlogo將全局變量列表與數字進行比較

我想從文件中讀取水溫,並因此根據溫度讓我的海龜死亡/繁殖。我最終得到了這個文件,並將水溫設置爲一個全局變量,但是我現在停留在比較部分。它不會讓我將變量與數字進行比較,因爲我認爲該變量是一個列表。出現以下錯誤消息;

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' 

代碼在下面;

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 

我會很感激任何幫助!

謝謝:)

漢娜

回答

2

歡迎堆棧溢出。你能提供一個你的「test3.csv」文件的前幾行的例子嗎?這將有助於讓您的問題排序 - 如果您有一個標題或多個列可能會導致您的問題 - 多列可能會被列入閱讀。另外,我想你想要file-read而不是file-read-line

其他一些東西 - 你的load-data程序是不必要的,據我所知(你只需要加載發生在run-temperature)。

更重要的是,您的代碼現在說:「所有海龜,移動和複製,現在,請逐行讀取溫度文件的整個問題是您的while聲明中說「直到您尚未達到文件末尾,讀取一行,打勾並移至下一行。」此外,您的模型將每行一次tick,沒有海龜做任何事情 - 它可能更簡單,只需在go過程的最後一步使用您的tick。在這種情況下,最好避免在go過程中使用while,因爲它會循環直到滿足while條件。

讀取整個test.csv並將其存儲在變量中以便於訪問可能更容易 - 下面是一個示例。使用此設置:

globals [ 
    water-temperature 
    water-temperature-list 
] 

to setup 
    ca 
    crt 50 [ 
    setxy random-xcor random-ycor 
    ] 

首先,告訴Netlogo water-temperature-list是一個使用set和[]的列表。然後,像以前一樣關閉/打開相同的文件來準備文件以供閱讀。然後,使用一個類似while循環讀取你的溫度爲water-temperature-list,使用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 

現在你的模型更簡單地訪問這些值,因爲它們直接存儲在一個模型變量。您可以使用作爲該列表的索引來輕鬆使用ticks值,例如,在tick 0上將訪問列表中的第一個元素,在tick 1上顯示第二個元素,依此類推。例如:

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 

請注意,這個設置一旦你到你的下結束,會出現一個錯誤,告訴您的NetLogo找不到下一個列表元素 - 你必須把在某處停止條件以防止這種情況。

我知道這是您的方法的替代方法,但我希望它有幫助。對於另一個類似但更復雜的示例,請查看model by Uri Wilensky