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

質問 (解決済み)

[artisocモデル] 隣接している全てのエージェントを1つの集合とみなしたい.
質問者: maniさん , 質問日時: 2019/12/25 23:26
格子モデルチェス型空間にエージェントが複数いるとき,隣接している全てのエージェントを1つの集合として番号を割り振りたいです.


○=空白のセル
●=エージェント
○○○○○○○○○○
○●●○○○○○○○
○●●●●○○○○○
○○●●○○○○○○
○○○○○○●●●○
○○○○○○●●●○
○○○○○○○●●○
○○○○○○○○○○

○○○○○○○○○○
○11○○○○○○○
○1111○○○○○
○○11○○○○○○
○○○○○○222○
○○○○○○222○
○○○○○○○22○
○○○○○○○○○○

という具合にエージェントに何かしら変数を持たせ,集合ごとに番号を振るという処理ができないか考えているのですが,どうすれば良いか全くわかりません.
「隣接している全てのエージェントを1つの集合と見なす」
というのをアルゴリズムに落とし込むとどういった処理になるのでしょうか.



▼解決した回答


斜め方向にいるエージェントは同じ集合とは見なさない場合に、少し工夫が必要ですね。
愚直に、UnivereのルールのなかでFor文を用いて座標を探索して判定するのはどうでしょうか。
探索は、5セル同時に行い、当該セルかつ周囲4セルのうち1セル以上にエージェントがいる場合、現在の集合IDを与え、
いない場合は、現在の集合ID+1にして、集合IDを付与するとか。
参考までに疑似コードを示します。ただしこの場合、MakeAllAgtSetAroundPositionCellで存在しないXY座標を参照することになってしまいエラーが出ると思います。そこはうまくIF文を使い回避してください

For i = 0 to 空間のX座標 - 1
 For j = 0 to 空間のY座標 - 1
  MakeAllAgtSetAroundPositionCell(AgtSet型変数1, 空間, i, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数2, 空間, i+1, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数3, 空間, i-1, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数4, 空間, i, j+1, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数5, 空間, i, j-1, 0, 0)
  If CountAgtSet(AgtSet型変数1)> 0 Then
   If (CountAgtSet(AgtSet型変数2)+CountAgtSet(AgtSet型変数3)+CountAgtSet(AgtSet型変数4)+CountAgtSet(AgtSet型変数5))>0 Then
    One = GetAgt(AgtSet型変数1,0)
    One.集合ID = Universe.現在の集合ID
   Else
    Universe.現在の集合ID = Universe.現在の集合ID + 1
    One = GetAgt(AgtSet型変数1,0)
    One.集合ID = Universe.現在の集合ID
   End if
  End if
 Next j
Next i

回答者: igaguri さん , 回答日時: 2019/12/31 12:53

▼ 全ての回答


斜め方向にいるエージェントは同じ集合とは見なさない場合に、少し工夫が必要ですね。
愚直に、UnivereのルールのなかでFor文を用いて座標を探索して判定するのはどうでしょうか。
探索は、5セル同時に行い、当該セルかつ周囲4セルのうち1セル以上にエージェントがいる場合、現在の集合IDを与え、
いない場合は、現在の集合ID+1にして、集合IDを付与するとか。
参考までに疑似コードを示します。ただしこの場合、MakeAllAgtSetAroundPositionCellで存在しないXY座標を参照することになってしまいエラーが出ると思います。そこはうまくIF文を使い回避してください

For i = 0 to 空間のX座標 - 1
 For j = 0 to 空間のY座標 - 1
  MakeAllAgtSetAroundPositionCell(AgtSet型変数1, 空間, i, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数2, 空間, i+1, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数3, 空間, i-1, j, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数4, 空間, i, j+1, 0, 0)
  MakeAllAgtSetAroundPositionCell(AgtSet型変数5, 空間, i, j-1, 0, 0)
  If CountAgtSet(AgtSet型変数1)> 0 Then
   If (CountAgtSet(AgtSet型変数2)+CountAgtSet(AgtSet型変数3)+CountAgtSet(AgtSet型変数4)+CountAgtSet(AgtSet型変数5))>0 Then
    One = GetAgt(AgtSet型変数1,0)
    One.集合ID = Universe.現在の集合ID
   Else
    Universe.現在の集合ID = Universe.現在の集合ID + 1
    One = GetAgt(AgtSet型変数1,0)
    One.集合ID = Universe.現在の集合ID
   End if
  End if
 Next j
Next i

回答者: igaguri さん , 回答日時: 2019/12/31 12:53
なるほど,斜めも同じ集合とする場合はMakeAllAgtSetAroundPositionCellを1回にし視野を1にすれば出来そうですね.
考え方がよくわかりました.ありがとうございます!

回答者: mani さん , 回答日時: 2020/01/08 19:32



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