Couzin's Algorithm

概要

boidのアルゴリズムのように魚や鳥などの群れ行動をシミュレーションします. Couzinのアルゴリズムはboidよりかは少しばかり複雑なアルゴリズムです.

パラメータを変化させることで集団のふるまいが大きく変化します.

複数種族の相互作用を考えることで捕食・逃避行動をシミュレーションできます.

また, 最適化手法を用いてCouzinアルゴリズムのパラメータの最適化を試すことができます.

Unityのバージョンは,2019.4.13f1で作成しました.それ以外のバージョンでは動作確認していません.

目次

Unityの基本的な説明

操作画面

Unityを開くと以下のような画面になります.

プロジェクトウィンドウでAssets/Scenes/の中からシーンを選ぶことでシーンを選択することができます. その後, 画面上部の再生ボタンをクリックすることでシミュレーションを開始することができます. 各シーンに配置されているオブジェクト(魚や壁, またシミュレーションを統括しているスクリプトなど)はヒエラルキーに表示され, 選択することでインスペクターで編集することができます.

例えばCouzinのパラメータは, Assets/Scenes/Observe/Playgroundなどのシーンをプロジェクトウィンドウでダブルクリックして開き, Arrowの名が入ったオブジェクトをヒエラルキーで選択し, インスペクターに表示されたCouzin Agentコンポーネントを編集することで変更することができます.

シーンの説明

ObserveとOptimizeの2種類のシーンがあります.

Observe

ObserveではCouzinのパラメータを手動で変えて魚の行動を観察することができます. Observeには以下の5つのシーンが用意されています. 好きなシーンを開いて,Unity Editorの画面上部中央のPlayボタンを押せば動かすことができます. 再生中にはGame画面の左上に表示されるTime Scaleのスライダーでプログラムの実行速度を調整できます.

Optimize

Optimizeでは, Couzinのアルゴリズムを焼きなまし法やPSOなどを用いて最適化することができます. シーンの初期設定はObserveと同じですが, ヒエラルキーウィンドウでEnvironmentコンポーネントを選択するとインスペクターで最適化手法を選択することができます.

スクリプトの説明

シーケンス

このプログラムは大まかに以下のような流れで動作しています(図はPSOによる最適化の例です). 上部に記載されているon playは最初に再生ボタンを押した時に実行されます. 一方, 下部に記載されているevery frameは毎フレーム実行されます.

最適化手法の導入

Assets/Scenes/Optimize以下に配置されているシーンの中でEnvironmentオブジェクトの実行したいコンポーネントだけにチェックマークを付けることで最適化手法を選ぶことができます. Assets/Scripts/Environment/AnnealEnvironment.csには焼きなまし法, Assets/Scripts/Environment/PSOEnvironment.csにはParticle Swarm Optimizationが実装されています.

各Environment.csはAgentManagerを操作することができるので, 好きな最適化手法を用いてパラメータの最適化を行うことができます. 実装の際はAssets/Scripts/Environment/MyEnvironment.csのコメントに詳細が書いてあるので参照してください.

アルゴリズムの説明

Couzinのアルゴリズムでは,各個体が周囲の個体の位置・速度の情報をもとに次に移動する方向を決定します. その基本原理は,個体間で適切な距離を保ちながら,かつ,他の個体から離れすぎないというものです.

詳しい説明は参考文献をご参照ください.

周囲に自らと同種族のみが存在する場合

自らの周囲を距離に応じて3種類の領域に分割します.(下図)

それぞれの領域の意味合いは以下の通りです.

また,zor外の死角にいる個体は感知しません.

各個体の次に移動する方向は以下のルールで決定します.

それぞれの領域の広さを変化させると,最初の図のように異なった集団のふるまいが見られます. (A: 群集,B: トーラス,C: 動的な併進,D: 高度な併進)

周囲に他の種族の個体が存在する場合

zorや索敵範囲内に他の種族の個体が存在する場合は,相手が獲物であればそれに近づくように,そうでなければ離れるように移動する. それ以外の場合は,上の周囲に自らと同種族のみが存在する場合と同じです.

参考文献