2017-08-17 13 views
-1

答えが簡単かもしれないことを前もってお詫びします。私は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-lineの代わりにfile-readが必要だと思います。

他のいくつかの事柄 - あなたのload-data手続きは私が言うことができる限り必要ではありません(あなたがロードする必要があるのはrun-temperatureです)。 「すべてのカメ、今移動して再現し、ラインによって全体温度ファイルの行を読んで。」:

はさらに重要なのは、あなたのコードは、今のようなものを言います問題は、あなたのwhileステートメントが「ファイルの終わりに達してから行を読み、目盛りをつけて次の行に移動するまで」と言っているということです。さらに、あなたのモデルはtickを1行に1回、何もやっていません。go手続きの最後にtickを置く方が簡単かもしれません。 whileの条件が満たされるまでループするので、このシナリオではgo手順でwhileの使用を避ける方がよいでしょう。

test.csvの全文を読んで簡単にアクセスできるように変数に格納するほうが簡単かもしれません。ここは一例です。

globals [ 
    water-temperature 
    water-temperature-list 
] 

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

まず、Netlogo water-temperature-listにsetと[]を使用したリストを伝えます。次に、前と同じファイルを閉じて開いて、読み込み用にファイルを準備します。その後、lputを使用して、water-temperature-listにあなたの温度を読み取るために同様のwhileループを使用します。

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 

それらは直接モデルの変数に格納されているので、今すぐあなたのモデルは、より簡単に、これらの値にアクセスします。たとえば、ティック0では、リストの最初の要素にアクセスし、ティック1では2番目の要素などを指すように、の値をticksの値で簡単に使用できます。例:あなたはあなたの温度の最後に得れば、この設定で、Netlogoはあなたが置く必要があるでしょう、エレメント次のリストを見つけることができないことを伝えるエラーがあることが

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 

注意それを防ぐためのどこかの停止条件。

私はそれがあなたのアプローチに代わるものだと知っていますが、それが役に立ちそうです。他の同様の、より複雑な例については、model by Uri Wilenskyをご覧ください。