現在遊園地の混雑緩和に向けたシミュレーションを行おうとしております。
行列に並んだエージェントがアトラクションを体験するまで抜け出さない設定だったので、エージェントに「我慢できる時間」を与えて並んでいる時間がその時間に達したら行列を抜けるという設定をしたいです。
シミュレーションモデルは MAS COMMUNITY の artisocモデル集 のサンプルである「遊園地モデル」を使用、再構築しております。
「限界時間に達すると行列から抜ける」という設定は行えたのですが、その後に向かうアトラクションのリストに抜けたアトラクションを一時的に除外したく
通常の設定ですと、体験し終えたアトラクションは次に乗るアトラクションリストから除外されていくのですが、抜けたアトラクションはまだ体験しておらず、また並びなおす可能性があるので抜けたときは次に向かうアトラクションのリストから一時的に除外したいと思っています。
以下のようなプログラムを導入して、抜けたアトラクションをFalse にして抜けた後に行動決定2を行い、行動を行った後に抜けたアトラクションを True にすることで「抜けたアトラクションを一時的に次に向かうアトラクションのリストから外す」を実現しようとしたのですが、シミュレーション結果からおそらく行列から抜けた入場者が再び同じアトラクションの行列に並んでいることを示しているのではないかと考え、何がいけないのかわからなくなってしまいました。
再構築しているモデルは「park.model」です。
知識をお持ちの方がいらっしゃいましたら、どうぞご教示ください。
Sub アトラクションでの行動() {
Dim i As Integer
// Dim obj5 As Agt
Dim tmpUnvisitedFlags() As Boolean // 配列として宣言します
// ReDim tmpUnvisitedFlags(Universe.アトラクション数 - 1) // 配列のサイズを設定します
// 高速化のためにまとめて++
My.待ち時間 = My.待ち時間 + 1
My.滞在時間 = My.滞在時間 + 1
// 許容待ち時間を超えた場合、行列から抜けるかを決定
If My.待ち時間 > My.許容待ち時間 Then
// 行列から抜けるかどうかを確率で決定
If Rnd() < My.行列から抜ける確率 Then
// 行列から抜ける
RemoveAgt(My.目標アトラクション.待ち行列, My)
/* // 未訪問フラグの現在の状態をコピー
For i = 0 To Universe.アトラクション数 - 1
tmpUnvisitedFlags(i) = My.未訪問フラグ(i)
next i */
// 一時的に抜けたアトラクションを未訪問リストから除外
My.未訪問フラグ(My.目標アトラクション.ID) = False
// 新しい目標アトラクションを選ぶ(抜けたアトラクションを除外)
@ 行動決定2(My,My.ID) // obj5 がどこから来るのかが不明です。必要に応じて修正してください。
// 抜けたアトラクションを再訪可能にする(もし必要なら)
/* For i = 0 To Universe.アトラクション数 - 1
My.未訪問フラグ(i) = tmpUnvisitedFlags(i)
next i */
My.未訪問フラグ(My.目標アトラクション.ID) = True
// 状態を移動中に変更
My.現在の状態 = 1
End If
End If
}
🙂