4

私は NetLogo でゲーム理論のシミュレーションを実行してきました。現在、クロス集計データを含む多数のデータ ファイルがあります。各列には異なる変数の値が格納されており、c. データを含む 1000 行。これらのファイルを取得して各列の平均値を計算するプログラムを作成しようとしています。

各ファイルに一定数のデータ行がある限り機能するプログラムがあります。このプログラムは、ファイル読み取りコマンドのループを使用して実行中の合計を計算し、すべての行が読み取られた後に読み取られた行の数で割ります。

ただし、実際のデータ ファイルの行数は可変です。ファイルアットエンドを使用してコードを変更しようとしていますか? 最後の行の後に実行中の合計ループを終了するようにしますが、それを使用する方法を見つけることができませんでした-ファイルが最後にあるというエラーが表示されます.

誰かがこれに対処する方法を提案できますか? 以下に作業コードを貼り付けました。

--

globals [target-file-name  
current-tally-file  
lines-read  
coops-fixed-run cheats-fixed-run either-fixed-run coop-freq-min-run  
coop-freq-max-run coop-freq-mean-run ticks-run  
num-lines  
]  

to setup  
set target-file-name user-input "Type a name for the target file"  
file-open target-file-name  
file-print("TallyFile Reps pFixCoop pFixCheat pFixEither MeanMinCoop MeanMaxCoop MeanMeanCoop")  
file-close  
set num-lines read-from-string user-input "How many lines in the file to be processed?" 
end 

to go  
set current-tally-file user-file  
file-open current-tally-file  
set lines-read 0  

while [lines-read < num-lines][  
let in1 file-read set coops-fixed-run (coops-fixed-run + in1)  
let in2 file-read set cheats-fixed-run (cheats-fixed-run + in2)  
let in3 file-read set either-fixed-run (either-fixed-run + in3)  
let in4 file-read set coop-freq-min-run (coop-freq-min-run + in4)  
let in5 file-read set coop-freq-max-run (coop-freq-max-run + in5)  
let in6 file-read set coop-freq-mean-run (coop-freq-mean-run + in6)  
let in7 file-read set ticks-run (ticks-run + in7)    
set lines-read (lines-read + 1)   
]  

stop-and-clear  
end  


to stop-and-clear  

let pfixcoop (coops-fixed-run / lines-read)  
let pfixcheat (cheats-fixed-run / lines-read)  
let pfixeither (either-fixed-run / lines-read)  
let mean-of-mins (coop-freq-min-run / lines-read)  
let mean-of-maxs (coop-freq-max-run / lines-read)  
let mean-of-means (coop-freq-mean-run / lines-read)  
let mean-of-ticks (ticks-run / lines-read)  

file-open target-file-name  
file-print (word current-tally-file " " lines-read " " pfixcoop " " pfixcheat "
" pfixeither " " mean-of-mins " " mean-of-maxs " " mean-of-means " "
mean-of-ticks)  
file-close  


set coops-fixed-run 0  
set cheats-fixed-run 0  
set either-fixed-run 0  
set coop-freq-min-run 0  
set coop-freq-max-run 0  
set coop-freq-mean-run 0  
set ticks-run 0  
set lines-read 0  

stop  

end  
4

1 に答える 1

4

ファイルからすべての行を読み取る方法は次のようになります。

to read-file [filename]
  file-open filename
  while [not file-at-end?][
    ;read one line
    let in1 file-read
    let in2 file-read
    ;and so one, at the end you will probably want to put these into some global variable
    set global-in1 fput in1 global-in1
  ]
  file-close filename
end

これは、すべての行が正確にデータ項目の名前番号を持ち、その番号が何であるかを知っていることを前提としています。それ以外の場合は、file-read の代わりに file-read-line を使用してください

于 2010-02-11T11:27:48.503 に答える