top of page

『人工社会構造指南』の記述と仕様が異なる問題とgetuniqueIDの仕様について

今回の質問の趣旨としては「何故このような仕様なのか」です。 p.244「初期設定だろうと,実行中だろうと,エージェントが生成されると,エージェント種ごとに,生成された順に0から順次,整数をIDに割り当てていきます。一度割り当てられたらシミュレーションが終了するまで変わりません。このように個々のエージェントに与えられる個別の番号をID(アイディー:Identityアイデンティティの略)と呼びます。DelAgt()を実行して,エージェントを消滅させても,番号がずれたりしません。このIDを利用して,モデルの中でエージェントを個体識別するというのが出発点です。」 実際にはエージェントを削除するとエージェントIDが小さい方へ詰められる。シミュレーション途中で変化する。 この現象自体は既知のものであり、旧掲示板でも言及されている (https://mas-auth.kke.co.jp/board/item/index.php?q=75) 当該現象は2体以上のエージェントルールに(変数firstID(integer)を追加した上で)以下のように記述すると観察できる。 Agt_Init{my.firstID = my.ID if my.ID==0 then killagt(my)end if}
Agt_Step{if my.firstID != my.ID then ExitSimulationMsg("IDが変更されました"&my.firstID&"→"&my.ID)end if} mapに表示するなどの変数として扱い観察する分には、 my.UnqID = Cint(GetUniqueID(universe.market.man, my.ID)) のようにUniqueIDを変数に格納しておくことで解決しうる。(UnqIDは自分で設定する事) 尚、GetUniqueID()は言語仕様上は返り値をIntegerでとることになっているが、Agtと認識される。(バグ?)従ってCint()を挟む必要があり、非常に長く記述することになる。また、このことはエージェントがUniqueIDの数値で取っていることも意味しているので、単純に my.UniqID = Cint(my) と表記する事でも実現する。 然しながら、パラメータ情報画面など、どうしてもIDを用いなければならない事態があり不便である。 従って質問は以下の通りである これはバグか 途中で仕様変更となった(バグではない)のであれば、その経緯。(IDか並列して二つある状態や、途中で変化するIDがデフォルトで変数として設定されており、尚且つエージェント自体を示す数値はuniqueIDが用いられているようになった経緯が謎である。) バグであったとしてこれが修正される予定はあるか。 getuniqueIDの挙動は正常か getuniqueIDの使いどころはどこか(先述した通り自身のUniqueIDを問い合わせるならagtを数値変換すれば十分であり簡潔である)

今回の質問の趣旨としては「何故このような仕様なのか」です。 p.244「初期設定だろうと,実行中だろうと,エージェントが生成されると,エージェント種ごとに,生成された順に0から順次,整数をIDに割り当てていきます。一度割り当てられたらシミュレーションが終了するまで変わりません。このように個々のエージェントに与えられる個別の番号をID(アイディー:Identityアイデンティティの略)と呼びます。DelAgt()を実行して,エージェントを消滅させても,番号がずれたりしません。このIDを利用して,モデルの中でエージェントを個体識別するというのが出発点です。」 実際にはエージェントを削除するとエージェントIDが小さい方へ詰められる。シミュレーション途中で変化する。 この現象自体は既知のものであり、旧掲示板でも言及されている (https://mas-auth.kke.co.jp/board/item/index.php?q=75) 当該現象は2体以上のエージェントルールに(変数firstID(integer)を追加した上で)以下のように記述すると観察できる。 Agt_Init{my.firstID = my.ID if my.ID==0 then killagt(my)end if}
Agt_Step{if my.firstID != my.ID then ExitSimulationMsg("IDが変更されました"&my.firstID&"→"&my.ID)end if} mapに表示するなどの変数として扱い観察する分には、 my.UnqID = Cint(GetUniqueID(universe.market.man, my.ID)) のようにUniqueIDを変数に格納しておくことで解決しうる。(UnqIDは自分で設定する事) 尚、GetUniqueID()は言語仕様上は返り値をIntegerでとることになっているが、Agtと認識される。(バグ?)従ってCint()を挟む必要があり、非常に長く記述することになる。また、このことはエージェントがUniqueIDの数値で取っていることも意味しているので、単純に my.UniqID = Cint(my) と表記する事でも実現する。 然しながら、パラメータ情報画面など、どうしてもIDを用いなければならない事態があり不便である。 従って質問は以下の通りである これはバグか 途中で仕様変更となった(バグではない)のであれば、その経緯。(IDか並列して二つある状態や、途中で変化するIDがデフォルトで変数として設定されており、尚且つエージェント自体を示す数値はuniqueIDが用いられているようになった経緯が謎である。) バグであったとしてこれが修正される予定はあるか。 getuniqueIDの挙動は正常か getuniqueIDの使いどころはどこか(先述した通り自身のUniqueIDを問い合わせるならagtを数値変換すれば十分であり簡潔である)

bottom of page