そのほか
2024/01/24
彩未翔 増本

マルチエージェントシミュレーションの基本の流れをPythonで簡潔に実装してみた | MASとは何か、matplotlibによる可視化、エージェントから得られるデータとは

logo_Python

マルチエージェント・シミュレーションは、マクロな現象について仕組みを解析するのに適した手法です。
ここでは、マルチエージェントシミュレーションの概要やPythonでの簡単な実装、またエージェントから得られるデータについて説明していきます。

はじめに

社会には、いくつもの要素が絡み合う複雑な事象が溢れています。例えば、身近なもので「高速道路での自然渋滞」があります。高速道路を走行していると、交通事故でもないのに突然渋滞に巻き込まれ、いつの間にか解消していることがあります。この場合、各車両をエージェントとしてモデル化し、信号や道路の条件、他の車両との相互作用を考慮して交通流をシミュレーションすることができます。これにより、交通渋滞の原因分析や最適な交通制御戦略の策定に役立ちます。


マルチエージェント・シミュレーションは、これらマクロな現象について、個々のエージェントの相互作用が積み重なった結果として捉えて、その仕組みを解析するのに適した手法です。


ここでは、マルチエージェントシミュレーションの概要やPythonでの簡単な実装、またエージェントから得られるデータについて説明していきます。


 


マルチエージェントシミュレーション(MAS)とは

構造計画研究所-MASコミュニティより



複数(マルチ)の「エージェント」を用いた仮想実験(シミュレーション)のことを意味します。



エージェントの定義


「エージェント」とは、自分の周囲の状況を認識し、それに基づいて一定のルールに従って自律的に行動する主体のことを指します。

エージェントは、行動をルールとして模擬し、自律的に行動する主体として機能します。


シミュレーションの定義


シミュレーションは、現実を模したモデルを使い、予測や分析を目的とした仮想実験です。


MASの考え方


MASでは、コンピュータの中に仮想世界を作り、その中にエージェントをたくさん配置します。 そして、エージェントたちは与えられた行動基準に従って相互作用を繰り返し、その結果として仮想世界全体に生じた大きな現象やプロセスを確認することができます。


エージェントの基本的な原則とメカニズム

ここでは、エージェント(顧客)が商品棚や他の顧客にぶつからないように動くシミュレーションをPythonで実装しながらmatplotlibで可視化して、基本的な原則を説明していきます。



# ライブラリ等のインポート 
import matplotlib.pyplot as plt
import random
import matplotlib.animation as animation


エージェントの特性



  • 自立性:エージェントは独立して行動し、自らの判断でタスクを実行します

  • 局所的な知識:各エージェントは全体の情報を持たず、自身の周囲の情報に基づいて行動します

  • 多様性:エージェントは異なる特性や行動ルールを持つことができます。


エージェントの行動原則のモデリング



  • ルールベースの行動:エージェントの行動は、あらかじめ設定されたルールやアルゴリズムに基づいています。

  • 学習と適応:一部のエージェントは、環境からのフィードバックを通じて学習し、行動を適応させることができます。


実装


ここではエージェントはどの方向に進むのか、障害物や他のエージェントとぶつかった時どのような動きをするのか等いう行動ルールを定義します。

このコードではエージェントは前か右に0.5進むか静止するようになっています。




# エージェントの定義
class CustomerAgent:
    def __init__(self, x, y):
        # エージェントの初期位置の変数
        self.x = x
        self.y = y


    def move(self, obstacles, other_agents, width, height):
# 新しいエージェントの位置を決定
        new_x = self.x + random.choice([0, 0.5])
        new_y = self.y + random.choice([0, 0.5])


        # 店の境界をチェック
        if new_x < 0 or new_x >= width:
            return  # 移動しない
        if new_y < 0 or new_y >= height:
            return  # 移動しない


        # 障害物や他のエージェントとの衝突をチェック
        for obs in obstacles:
# もし、エージェントが障害物にぶつかる時
            if new_x == obs[0] and new_y == obs[1]:
                return  # 移動しない
        for agent in other_agents:
# もし、エージェントが他のエージェントとぶつかるとき
            if new_x == agent.x and new_y == agent.y:
                return  # 移動しない

# 移動を更新
        self.x, self.y = new_x, new_y


環境のモデリング


  • インタラクティブな舞台:エージェントは、仮想の環境内で操作されます。この環境はエージェントに影響を与え、その反応によって変化することがあります。

  • リアルタイムの動的変化:環境は時間と共に変化し、エージェントの行動によっても影響を受けます。



実装


ここでは、店の広さや障害物の設定など仮想世界を定義します。

エージェントは最初左下に位置して入店と考えています。中央に商品棚が配置されています。




# 環境の設定
store_width = 10. # 店の横幅
store_height = 10. # 店の奥行
num_agents = 10 # エージェントの数

# 障害物(商品棚)の設定
obstacles = [(5, 5), (5.5, 5), (6, 5), (5, 6), (5.5, 6), (6, 6)] # 例えば店の中央に配置

# エージェントの初期位置設置、生成
agents = [CustomerAgent(1, 1) for _ in range(num_agents)]

シミュレーションの実行

エージェントを動かし、位置を更新します。



# エージェントの位置を更新する
def update_positions(agents, obstacles, width,height):
for agent in agents:
agent.move(obstacles, [a for a in agents if a != agent], width, height)

return [(agent.x, agent.y) for agent in agents]

# シミュレーションの実行
num_steps = 50
positions_over_time = []

for step in range(num_steps):
positions = update_positions(agents, obstacles, store_width, store_height)
positions_over_time.append(positions)

シミュレーションの可視化

matplotlibを使用してエージェントの動きを可視化します。



# アニメーションの設定
fig, ax = plt.subplots(figsize=(5, 5))

# アニメーションの設定
fig, ax = plt.subplots(figsize=(5, 5))

def animate(i):
ax.clear()
ax.set_xlim(0, store_width)
ax.set_ylim(0, store_height)
x_values, y_values = zip(*positions_over_time[i])
ax.scatter(x_values, y_values, label='Customers')
obs_x, obs_y = zip(*obstacles)
ax.scatter(obs_x, obs_y, color='red', marker=',', label='Obstacles')
ax.legend()
ax.set_title(f"Step {i}")

ani = animation.FuncAnimation(fig, animate, frames=num_steps, repeat=False)

# アニメーションの保存
ani.save('multi_agent_simulation.mp4', writer='ffmpeg', fps=1)

この動画のように、各エージェント(顧客)が入り口から入り与えられた範囲(店内)から出ずに、他のエージェントや障害物(商品棚)にぶつからないように動いたり静止したりして出口に向かうシミュレーションをすることができました。




更なる展望

回は、エージェント(顧客)が商品棚や他の顧客にぶつからないように動くシミュレーションを実装しました。このシミュレーションでは、エージェントにさまざまなルールを設定することができます。

例えば、エージェントが入口から入って出口に出るようにする、購買目的がある人かない人なのかを設定することもできます。また、エージェントが最初に向かう場所を、POPの有無や誘引率に基づいて決定することもできます。

これにより、より現実に近い仮想世界が作られ、現実世界ではシミュレーションしづらい事象もシミュレーションできるようになります。

最後に

マルチエージェントシミュレーションは、個々のエージェントが自律的に行動し、相互作用することで、複雑なシステムやプロセスをモデル化するための強力な手法です。このアプローチは、交通流、社会経済モデル、環境システム、感染症の拡散など、さまざまな分野で使われています。


Pythonのようなプログラミング言語を使って、シミュレーションのプロセスを柔軟に設計し、結果を直感的に可視化するためにmatplotlibなどのツールを使うことができます。


マルチエージェントシミュレーションは、理論的な研究から実用的な問題解決まで、さまざまな用途で活用されており、その可能性は広範囲にわたっています。


New call-to-action