saii-lab

「知性のルーツを発見する」がテーマのブログ。人工知能(AI)、プログラミング教育などの幅広いトピックを扱います。

MetalでGPUコンピューティング(2)

前回に引き続き、Apple製のフレームワーク、MetalについてQiitaに記事を書きました。
今回はMetalの応用編です。
アプリの描画部分にMetalを用いるのではなく、ロジック部分にMetalを用いるという通常と逆の試みを行い、群知能を実装します。
各個体はローカルに互いと、そして彼らの環境と対話する。個々のエージェントがどう行動すべきかを命じている集中的な制御構造は通常存在しないが、そのようなエージェント間の局所相互作用はしばしば全体の行動の創発(emergence)をもたらす。このようなシステムの自然界の例として、アリの巣、鳥の群れ、動物の群れ、細菌のコロニー、魚の群れなどがある。
-群知能- Wikipedia
コンピュータ上の群知能として有名なものに、クレイグ・レイノルズによって考案されたBoidsがあります。
Boidsは複雑系や自己組織化に深く関わっているのですが、各個体が以下のたった3つのルールに従うだけで、個体の集合が魚や鳥の群れのように振る舞います。

1.分離(Separation)各個体は他の個体とぶつからないように動く。
2.整列(Alignment)各個体は他の個体と速度と方向を合わせるように動く。
3.結合(Cohesion)各個体は他の個体の集合の中心方向へ向かうように動く。

上記と全く同じにしても面白くないので、今回はこのルールに少しアレンジを加えました。

a.等距離 各個体が等距離を保つように動く。
b.並行 各個体が他の個体と同じ向きになるように動く。
c.等速 各個体は他の個体と同じ速度になるように動く。

Boidsとの違いは群れが中心を持たず、各個体がより分散的に動くことです。

数式、コードなどは以下のQiitaの記事に具体的に記述しました。
[iOS] MetalでGPUコンピューティング(2)

以下は動作例です。

魚たちが集まって、まるで一つの生き物であるような動きをします。姿形はクラゲのようでありますが、無数の個体が集まって一つの個体を形成する様子は粘菌のようでもあり、魚を細胞とするならば多細胞生物に例えることもできるかと思います。
パラメータの調整に、魚たちは渦を形成したり、 一様な群れを形成したりします。

今回は群知能を対象としましたが、GPUの活用により生命らしさが実装が可能なことがわかりました。もちろん、今回のMetalを用いた技術は機械学習などへの応用も期待できるかと思います。

今回使用したコードは、こちらに置いておきます。
https://github.com/yukinaga/SwarmIntelligence