1 ポイント 投稿者 GN⁺ 2023-12-30 | 1件のコメント | WhatsAppで共有
  • Particle Life Simulation は、原子のような粒子同士の単純な引力・斥力ルールによって、複雑な自己組織化パターンを生み出す原始的な人工生命シミュレーション
  • GUI を除いたコードは 1 ページ未満で、C++ 実装の 中核アルゴリズム/particle_life/src/ofApp.cpp の先頭 100 行にある
  • JavaScript デモは 2D と 3D の両方が提供されており、README には 500x500 キャンバス上で黄色・赤色・緑色の粒子を各 200 個生成し、色グループ間の力のルールを適用する例が含まれている
  • 興味深いパターンは、正確なパラメータ設定よりも ランダム探索 と段階的な微調整によって見つける方法が推奨され、ときどき大きくパラメータを変えて局所最適に閉じ込められるのを避けられる
  • 現在の制約は、すべての粒子ペア間の距離を計算する二重ループのため計算量が 二乗時間 になる点で、GPU 並列計算・パラメータ保存・粒子タイプの拡張・より直感的な UI などが今後の課題として残っている

Particle Life Simulation の目的

  • Particle Life Simulation は、原子のような粒子同士に単純な引力または斥力のルールを適用し、原始的な人工生命パターンをシミュレーションするプログラム
  • 単純なルールだけで、複雑な 自己組織化 や生命らしいパターンが現れることを示すことに焦点を当てている
  • GUI 要素を除けば、コードは 1 ページ未満
  • チュートリアルとウォークスルーは YouTube 動画で提供されている

デモと実行方法

  • JavaScript のオンラインデモが 2D と 3D で提供されている
  • C++ 版はリポジトリをダウンロードして展開し、/particle_life/bin/ フォルダの particle_life.exe を実行する方式
  • README には C++ 版のインターフェース画像とサンプル結果画像が含まれている

パターン探索の方法

  • 興味深いパターンを再現する際、パラメータを正確に合わせる必要はない
  • 最善の方法は、まず ランダムなパラメータ探索 を試し、興味深いパターンが見つかったら徐々に微調整すること
  • 局所最適にはまり込まないよう、ときどき大きなパラメータのジャンプを与えることもできる
  • この方法により、互いに異なる興味深いパターンが次々と現れうる

コードと実装構造

  • ソースコードは C++JavaScriptPython で提供されている
  • C++ プログラムに貢献するには、中核アルゴリズムが /particle_life/src/ofApp.cpp の先頭 100 行にある
    • 残りは GUI コンポーネントとレンダリング制御
    • GUI とレンダリングは openFrameworks ライブラリが提供している
  • C++ のビルド方法
    • リポジトリをダウンロードする
    • openFrameworks をダウンロードする
    • openFrameworks の projectGenerator/particle_life/ フォルダをプロジェクトに取り込む
    • または新しい openFrameworks プロジェクトを作成し、ofxGui を追加したうえで、生成されたプロジェクトの /src/ フォルダをリポジトリの /src/ に置き換える
    • その後、ローカルマシンで C++ コードをコンパイルできる

JavaScript 例の動作方法

  • README の JavaScript 例は 500x500 の canvas 上で動作する
  • atomx, y, vx, vy, color を持つオブジェクトとして作られる
  • create 関数は、指定した数だけ同じ色の粒子グループを作成し、全体の atoms 配列にも追加する
  • rule(atoms1, atoms2, g) は 2 つの粒子グループ間の力を計算する
    • 2 粒子間の距離 d が 0 より大きく 80 より小さい場合にのみ力を適用する
    • 力は (g * 1) / d で計算される
    • g の値が、色グループ間の引力または斥力のルールを決定する
  • 例では黄色、赤色、緑色の粒子をそれぞれ 200 個生成する
  • update は色グループの組み合わせごとのルールを適用した後、画面をクリアし、黒い背景の上に粒子を再描画する
  • requestAnimationFrame(update) でアニメーションループを実行する
  • より最適化されたバージョンは particle_life.html ファイルにある

他の移植版

関連トピックと着想

  • 関連トピックは Particle Life Simulation、Primordial Soup - Evolution、Conway's game of life、Cellular automata、Self organizing patterns
  • このプロジェクトは Jeffery Ventrella の Clusters に着想を得ている
  • Ventrella のコードにはアクセスできなかった
  • 主な違いは、衝突検知を実装していない点だと推測している
    • 衝突検知を省くことで、数千個の粒子をリアルタイムでシミュレーションできたと見られる
  • GUI コントロールを追加し、パラメータをリアルタイムに変更できる
    • この方法により、微調整と探索が容易になる
    • 非常に単純な関係モデルから、これまで見たことのないパターンが現れうる
  • コードは、非プログラマーと一般大衆のための教育資料として始まった
    • 複雑さが単純さから生まれうることを示すのが目的
    • 人工生命コードの中でも、一桁規模でもっと単純である可能性があると見ている

今後の課題

  • パラメータを保存・読み込みする機能を追加し、ユーザーが興味深いモデルを簡単に共有できるようにすること
  • 現在 4 つに固定されている 粒子タイプ をさらに追加できるようにすること
  • すべての粒子ペア間の距離を計算する二重ループが最大のボトルネック
    • 計算量は二乗時間になる
    • これを回避する方法が必要
  • 粒子ペア間距離の計算は並列化しやすいため、GPU 上で計算できる
  • 画面サイズ調整機能と境界チェックの改善が必要
    • 高速で動く多数の粒子が画面境界の外へ出る可能性がある
  • より直感的な UI を追加し、パラメータをより細かく制御できるようにすること
  • ランダム化ボタン、または初期ルールを継続的に再帰変形する単純なメタルールを追加できる
    • パターンが局所最適に閉じ込められず、変化し続けるようにするのが目的
  • パラメータの選択と最適化に、よりよい方法として 進化アルゴリズム を使える可能性がある
    • そのためには適応度関数を書く必要がある
    • このプログラムの領域で適応度関数が何であるかは、現時点ではわからない
    • 現実世界の適応度関数は競争と適者生存である
    • ここではユーザーが興味深いパターンを生み出すパラメータを微調整して選ぶが、「面白さ」は定義が難しい

1件のコメント

 
GN⁺ 2023-12-30
Hacker News の意見
  • 学校で最初に作ったコーディングプロジェクトの一つが Conway のライフゲームだったのですが、白黒だけでは少し退屈だったので RGB の「遺伝子」を入れ、新しく生まれたセルが親の色を混ぜて受け継ぐようにし、ランダムな突然変異も追加しました
    どの「陣営」が盤面を支配するのかを見るのがかなり面白いです
    デモ: https://genetic-life.surge.sh/
    ソース: もともと C++ だったものを Rust/WASM に移植しました https://github.com/franky47/genetic-life
  • 自分が生成した中で一番興味深かったのはこれでした: https://hunar4321.github.io/particle-life/particle_life.html...
    最終的には、大きく不安定な塊一つと安定した塊一つに落ち着き、どちらも動かなくなったのでそこで終わりました
    ただ、その前には物体同士が出会って合体する、期待していた場面を見せてくれました
  • 本当に興味深い。John Conway のライフゲームより複雑なバージョンのように見えます
    こうしたパラメータでは、ごく小さなスケールでも小さな生命体のようなものが簡単に形成されるのが驚きです
    実際の宇宙のパラメータは生命が生まれやすいようにできていると考える人もいますが、むしろ生命形成が難しくなるように調整されているように感じます
    • あれは生命体というより分子に近いです。もちろん、複雑なルール集合が定常状態に近づいていくときに、色を政治体制別に割り当てた遠い恒星帝国のように想像したことはあります
      錯覚させるのは動きです。このシステムには保存則が組み込まれていないため、動きが維持されます。B は A に引かれ、A は B を押しのける A-B ペアを作ると、そのままビューンと飛んでいきます
      エネルギーや運動量保存のような保存則がルールに含まれるよう設計していたなら、はるかに面白みが少なく、Conway のライフゲームでペントミノ爆発が後期に入った姿に近い構造になっていたでしょう
      十分に大きなプロセッサがあれば、これを 3 次元で見てみたいですし、力が r の逆数や r の 3 乗の逆数、あるいは r * log(r) で減衰する場合や、「遠くでは反発し、ごく近くでは引き合う」粒子のような選択肢も入れてみたいです。賢く最適化しても、そういうシステムは止まってしまいそうな気がします
    • だからといって、宇宙で生命が特にまれだと信じる理由もありません
  • 面白い偶然ですが、最近似たものを作りました: https://webgl-particle-life.netlify.app/
    ソース: https://github.com/ath92/particle-life
    このバージョンはすべての処理を WebGL シェーダーで行い、シミュレーション状態をテクスチャと uniforms に保持しています
    そのおかげでより多くの粒子をシミュレーションして描画できますが、サポートが弱い WebGL 拡張を使っているため、すべてのデバイスで動くとは限りません
  • 関連記事:
    Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - 2022年12月、コメント1件
    Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - 2022年11月、コメント1件
    Particle Life - https://news.ycombinator.com/item?id=21875720 - 2019年12月、コメント7件
  • こちらの実装のほうがずっと完成度は高いですが、以前 Godot 4 でコンピュートシェーダーを使って一度作ってみたことがあります
    興味があればここにあります: https://github.com/jasonjmcghee/compute-shaders
  • 以前は考えたことがありませんでしたが、比べてみると Conway のライフゲームは粒子ベースというより波動ベースなのだと気づきました
    つまり CGoL では、ルールはグリッドを横切って移動する物体ではなく、グリッド上の位置に適用されます。このシステムも波動ベースの方法で構成できるのか気になります
    また、このシステムでは毎フレームすべての粒子が距離に関係なく互いに作用するので、光速が無限大のように見えます。一方 CGoL では各セルが毎フレームすぐ隣のセルにしか影響を与えられないため、一種の光速があります
  • 今 3D JS バージョンを見ていますが、元祖 Conway のライフゲームや 90年代の Primordial Life スクリーンセーバー以来、一番気に入ったものかもしれません
    シェーダー対応を追加するつもりはなかったのか気になります。もっと遅くて「塊っぽい」感じのバージョンを全画面で見てみたいです
    たぶん私の Mac を暖房器具にしてしまうでしょうが、今はそれがむしろ利点です ;)
  • Hiroki Sayama の Swarm Chemistryを思い出します
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • この種のものにさらに興味があるなら、Smooth-lifeLenia がおすすめです
    特に Lenia にはより複雑な変種がいくつかあり、この話題に関連するものとしては「Flow Lenia」や「Particle Lenia」が思い浮かびます