粒子生命シミュレーション
- 原子のような粒子同士の単純な引力と斥力のルールを使って、原始的な人工生命をシミュレーションするシンプルなプログラム。
- GUI要素を除けば、コードは1ページ未満。
- 動画チュートリアルと案内は以下で確認可能。
詳しく見る (YouTube動画チュートリアル)
オンラインデモ (JavaScript版)
インターフェース (C++版)
例示結果
再現できるいくつかの興味深いパターン
- これらのパターンを再現するために、パラメータを正確に一致させる必要はない。
- 興味深いパターンを得る最良の方法は、まずランダムなパラメータ探索を試すこと。
- 興味深いパターンを見つけたら、段階的に微調整を試みる。
- 局所最大値にとどまらないよう、ときどき大きくパラメータを飛ばすこともできる。
使い方
- このリポジトリをダウンロードして展開し、
/particle_life/bin/フォルダへ移動してからparticle_life.exeをクリックする。
コード
- ソースコードはC++、JavaScript、Pythonで提供されている。
- YouTube動画チュートリアルへのリンクあり。
- C++プログラムに貢献したい場合、コアアルゴリズムは
"/particle_life/src/ofApp.cpp"の最初の100行にある。
- 残りはopenFrameworksライブラリが提供するGUIコンポーネントとレンダリング制御。
- 始めるには、このリポジトリとopenFrameworksライブラリをダウンロードし、openFrameworksのprojectGeneratorを使って
/particle_life/フォルダをプロジェクトに取り込む。
- あるいは、新しいopenFrameworksプロジェクトを作成してofxGuiを追加し、生成されたプロジェクトファイルをここで提供されている
/src/フォルダで置き換える。
- これでC++コードをコンパイルできる。
他の移植版
- Godot、Rust、Go-1、Go-2、Go-3、Python、Lua、QB64-PE、WebGL、Java、C# Winforms、FreeBasicなど、さまざまな言語へ移植された版の一覧あり。
JavaScriptコード例
- JavaScriptコード例と、最適化版である
particle_life.htmlファイルを確認できる。
関連トピック
- 粒子生命シミュレーション、原始スープ - 進化、コンウェイのライフゲーム、セル・オートマトン、自己組織化パターンなどに関する説明。
- このプロジェクトはJeffery VentrellaのClustersに着想を得ており、衝突検知を実装しないことで、数千個の粒子をリアルタイムでシミュレーションできた。
- GUIコントロールを追加し、パラメータをリアルタイムで簡単に微調整・探索できるようにしたことで、非常に単純な関係モデルから、これまで見たことのないパターンが現れるようになった。
- このコードは教育資料として始まり、複雑さが単純さから生まれうることを示すために、非プログラマと一般大衆を対象としている。
やることリスト
- パラメータを保存・読み込みできる機能を追加する(興味深いモデルを人々が簡単に共有できるようにするため)
- より多くの粒子タイプを追加できる機能(現在は4種類の粒子タイプに固定されている)
- 現在最大のボトルネックは、すべての粒子間のペアごとの距離を計算する入れ子のforループであり、計算量は二次的。
- 3番の代案として、ペアごとの距離計算はGPUで計算できるほど並列化しやすい。
- 画面サイズを調整する機能の追加と境界チェックの改善(高速で動く粒子が多数あると、画面境界の外へ出ることがある)。
- パラメータをより細かく制御できる、より直感的なUIの追加。
- ランダムボタンの追加、またはより良い方法として、初期ルールを継続的に変化させる単純なメタルールを持たせ、パターンが局所最大値にとどまらず変化し続けるようにする。
- パラメータの選択と最適化には進化アルゴリズムを使う方がよいが、そのためには適応度関数を書く必要がある。現時点では、このプログラムの領域において適応度関数が何であるべきか分かっていない。
GN⁺の見解
- このプロジェクトは、複雑な生命現象が単純なルールからどのように発生しうるかを視覚的に示す点で大きな価値がある。
- プログラミングや人工生命研究に関心のある初級ソフトウェアエンジニアにとって、興味深い入門資料になりうる。
- さまざまな言語に移植された版があるため、多様なプログラミング言語への理解を広げる助けになる可能性がある。
1件のコメント
Hacker Newsの意見