2017-12-05 1 views
0

私は、モニターが1秒間に数回更新されることを知っています。これは、モデルの出力をチェックするときに役立ちます。しかし、それは私のモデルには当てはまらず、重大なものです。モニターを継続的ではなく、1回につき1回更新します。遅いモデル

私はモニターからデータをプロットしようとしています。可能であれば、モニターはレックポーターを1回だけ更新するようにしたい。

現在、私のモデルは機能していますが、1秒に何回も更新されていません。私は誰かが私のモデルの計算の努力をティックごとに一度更新して最小限に抑えるのを助けることを望んでいました。現在のコードの

サンプル:

globals [initial-patch0-health patch0-health intial-patch2-health patch2-health] 
patches-own [ptype penergy max-penergy alive?] 

to setup 
clear-all 
set patch-health 0 
ask-patches [ 
    setup-patches 
    ] 
reset-ticks 
end 
to setup-patches 
let temp random 100 
if temp <= 50 [ 
    set ptype 2 
    set max-penergy random-in-range 0 5 
    set alive? true 
] 
if temp > 50 and temp <= 75 [ 
    set ptype 0 
    set max-penergy random 10 
    set alive? true 
] 
set penergy max-penergy 
set patch2-health (ptype2-health) 
set patch0-health (ptype0-health) 
end 

to go 
ask-patches 
    update-patch-health 
tick 
end 

to patch-health 
if ptype = 2[ 
    set patch2-health (ptype2-health) 
] 
if ptype = 0 [ 
    set patch0-health (ptype0-health) 
] 
end 

to-report ptype2-health 
    report [penergy] of patches with [ptype = 2] 
end 

to-report ptype0-health 
    report [penergy] of patches with [ptype = 0] 
end 

私のモニターと(PATCH2-健康のために同じ)プロット読み:

sum (initial-patch0-health) 

plot sum (patch0-health) 

私はこのような状況で合計を使用レポーターがリストを提供しているからです。

私は単純な「ヒツジ狼種」のスタイルモデルを行っていますが、複数のグラスタイプ(ptype)を使用して初期の草の健康と草の健康状態を時間の経過とともに監視したいと考えています。私はカメを持っていますが、ここにそのコードは入れていません。あなたが私からのより多くのコードを必要とするかどうかを教えてください。

このコードは、スピードを犠牲にして私が望む出力を与えてくれます。私は1度に1度だけ報告すると計算時間を節約できると考えていました。クリーニングとスピードアップのための提案はありますか?

+0

本当にあなたの遅さの原因であるかどうかを確認するために、モニターの取り外し/取り外しを試みましたか?そうでない場合は、プロファイラ拡張を試して、どの部分が計算に時間がかかっているかを調べることができます。 モニターの処理速度が低下している場合は、代わりに出力領域を使用して、1回の変更で1回だけ更新できますか? – Jasper

答えて

2

あなたのコード例は使用できません(未定義の変数patch0-healthはレポーターから出力されません)。MCVE guidelinesを確認してください。これを念頭に置いて、私が問題を再現するのに問題があります。モニタが存在していても存在しないで、profilerのテストを実行しましたが、実行時に違いはありませんでした。この設定で:

extensions [ profiler ] 
globals [ patch-turtle-sum profiler-results] 

to setup 
    ca 
    ask n-of ((count patches)/2) patches [ 
    set pcolor red 
    ] 
    crt 1000 [ 
    setxy random-pxcor random-pycor 
    ] 
    set profiler-results [] 
    reset-ticks 
end 

to profile-check 
    repeat 20 [ 
    profiler:start 
    repeat 20 [ 
     go 
    ] 
    set profiler-results lput profiler:inclusive-time "go" profiler-results 
    profiler:reset 
    ] 
    print profiler-results 
end 

to go 
    ask turtles [ 
    fd 1 
    ] 
    tick 
end 

to-report patch-turtle-sum-report 
    report sum [count turtles-here] of patches with [ pcolor = red ] 
end 

私は(go包括的時間を意味:678.59ミリ秒)を1回patch-turtle-sum-report存在を監視する監視して、インタフェースからprofile-check手順を実行し、一度なし(go包括時間意味:678.56ミリ秒) - 検出可能な違いはありません。 しかし、私はprofilerがモニターを占めているかどうかは分かりません。この場合、この評価は役に立たないかもしれません。また、あなたが扱っているパッチの数がかなり多いこともあります(私のテストの例では、100 X 100パッチを実行していました)ので、計算がうまくいかないことがあります。

to-reportレポーターではなく)1度に1度手動で計算する変数を報告するモニターを使用して、問題を回避できるかどうかは疑問です。たとえば、上の例を参考にして、

set patch-turtle-sum sum [count turtles-here] of patches with [ pcolor = red ] 

計算は、実際にあなたのモデルを遅く何であればモデルをスピードアップすることがあり計算が行われたとき、あなたがコントロールするその方法、:のようなものを持ちます。

+0

"ティックごとに手動で計算する変数を報告するモニターを使用する" - うん、それは私が示唆している –

関連する問題