MAS コミュニティ
artisoc質問用掲示板(アーカイブ)
  
質問掲示板は移転しました。新掲示板はこちら

質問 (解決済み)

[artisocモデル] 異なるエージェント間で1つの変数を共有する方法
質問者: hidaka_maさん , 質問日時: 2018/12/13 12:08
Universe下にある1つの変数を複数のエージェントで共有することは可能でしょうか?

Universe
|_test    …空間
  |_userA …エージェント1
  |_userB …エージェント2
  |_userC …エージェント3

各エージェントが1step毎に一定確率でランダムに仕事をします.
test下にあるエージェントがした仕事の合計を調べるときに良い方法はありますでしょうか?

今は
Universe
|_test    …空間
 |_userA …エージェント1
    |_doneA
 |_userB …エージェント2
|_doneB
 |_userC …エージェント3
|_doneC
のようにして,グラフを見て集計しています.



▼解決した回答


たぶん、コードが間違っているのでは?println()などを使いきちんとデバッグしましょう。
Universe.totalを使う場合は、
Universeの下にtotalを作成し、
コードでは、
Universe.total = Universe.test.taskdone(0) + Universe.test.taskdone(1) + Universe.test.taskdone(2) + Universe.test.taskdone(3)
だと思いますが…

回答者: igaguri さん , 回答日時: 2018/12/13 14:46

▼ 全ての回答


できます。質問するよりもやってみた方が早いと思います。
変数「Universe.taskdone」を作成して、
各Agtのルールに
If 仕事をやった then
universe.taskdone = universe.taskdone + 1
End if
とします。
ですが、上記では、各エージェントタイプの判別はできないので、
「Universe.taskdone」を配列にして、
エージェント1の場合、
If 仕事をやった then
universe.taskdone(0) = universe.taskdone(0) + 1
End if
エージェント2の場合
If 仕事をやった then
universe.taskdone(1) = universe.taskdone(1) + 1
End if
If 仕事をやった then
universe.taskdone(2) = universe.taskdone(2) + 1
End if
これらを合計したい場合は、
Universeのルールの最後に、
Universe,totaltaskdone = Universe.tasckdone(0) + Universe.tasckdone(1) + Universe.tasckdone(2)
とすれば良いでしょう。

回答者: igaguri さん , 回答日時: 2018/12/13 12:27
igaguri さん
ありがとうございます.
コンソールで確認したら、しっかり計算できていました.
しかし、時系列グラフに表示した時に合計の計算がされていないようなのですが、何か問題がありますでしょうか?
グラフにはUniverse.totalを表示させています.

Universe
|_total    …グラフ表示用
|_test    …空間
|_taskdone …変数
 |_userA  …エージェント1
    |_taskdone(0)
 |_userB  …エージェント2
|_taskdone(1)
 |_userC  …エージェント3
|_taskdone(2)


以下はUniverseのコードです.
Univ_Init{
}
Univ_Step_Begin{
Dim total As Integer
total = Universe.test.taskdone(0) + Universe.test.taskdone(1) + Universe.test.taskdone(2) + Universe.test.taskdone(3)
PrintLN(total)
}

Univ_Step_End{
If GetCountStep( )== 50 then
ExitSimulation ( )
End if
}
Univ_Finish{
}

回答者: hidaka_ma さん , 回答日時: 2018/12/13 14:22
total = Universe.test.taskdone(0) + Universe.test.taskdone(1) + Universe.test.taskdone(2) + Universe.test.taskdone(3)
をUniv_step_beginではなく、Univ_step_endのルールで計算した方が良いと思います。

回答者: igaguri さん , 回答日時: 2018/12/13 14:26
ちなみに、Universe.totalを作成しているのならば、
Dim total As Integerは不要なのでは?

回答者: igaguri さん , 回答日時: 2018/12/13 14:28
Univ_step_endの中に移動しましたが,時系列グラフでは0になったままでした.

Universe.totalだけを消すと実行時にグラフのエラーが出て、Dim total As Integerだけを消すと実行時にtotalが未定義だとエラーが出ます.

回答者: hidaka_ma さん , 回答日時: 2018/12/13 14:42
たぶん、コードが間違っているのでは?println()などを使いきちんとデバッグしましょう。
Universe.totalを使う場合は、
Universeの下にtotalを作成し、
コードでは、
Universe.total = Universe.test.taskdone(0) + Universe.test.taskdone(1) + Universe.test.taskdone(2) + Universe.test.taskdone(3)
だと思いますが…

回答者: igaguri さん , 回答日時: 2018/12/13 14:46
あと、Universe.test.taskdoneのtestが空間を指しているのならば、やめましょう。
空間の下に変数を作成すると、空間の大きさに依存した2次元配列になるので

回答者: igaguri さん , 回答日時: 2018/12/13 14:49



Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
( 会社情報 情報セキュリティ・個人情報について )