life_code - 多くの粒子間の引力/反発力をシミュレートする簡単なプログラム

(A simple program to simulate attraction/reuplsion forces between many particles)

Created at: 2022-08-10 15:28:09
Language: C++
License: MIT

GitHub リポジトリのサイズ GitHub

粒子寿命シミュレーション

原始的な人工生命をシミュレートする単純なプログラムで、原子のような粒子間の引力または反発の単純なルールを使用して、複雑な自己組織化の生命のようなパターンを生成します。GUI 要素を除くと、コードは 1 ページ未満です。ビデオ チュートリアルとウォークスルーは以下から入手できます。

詳細はこちら (YouTube ビデオ チュートリアル):

https://youtu.be/0Kx4Y9TVMGg

インターフェース

結果の例

再現する興味深いパターン:

これらのパターンを再現するために、パラメーターを正確に指定する必要はありません。興味深いパターンを取得する最善の方法は、最初にランダムなパラメーターの調査を試みることです。興味深いパターンを見つけたら、徐々に微調整してみてください。局所的な最大値で動けなくなるのを避けるために、ときどき大きなパラメーター ジャンプを行うことができます。このように面白いパターンがどんどん出てきます。

使用するには:

このレポをダウンロードします。ファイルを解凍し、/particle_life/bin/ フォルダーに移動し、particle_life.exe をクリックします。

コード:

ソース コードは、C++ と JavaScript の両方で利用できます。ウォークスルー チュートリアルについては、この YouTube ビデオをご覧ください: https://youtu.be/0Kx4Y9TVMGg

C++ プログラムに貢献したい場合、コア アルゴリズムは "/particle_life/src/ofApp.cpp" にある最初の 100 行のコードです。残りは、オープンソースで使いやすい画像レンダリング ライブラリである openFrameworks ライブラリによって提供される GUI コンポーネントとレンダリング コントロールです。

まず、このリポジトリをダウンロードしてから、https ://openframeworks.cc/ から openFrameworks ライブラリをダウンロードします。openFramework の projectGenerator を使用して、/particle_life/ フォルダーをプロジェクトにインポートします。

または、新しい openFramework プロジェクトを生成し、ofxGui を追加します。プロジェクト ファイルが生成されたら、/src/ フォルダーをここで提供されているフォルダーに置き換えます。

マシン上で C++ コードをコンパイルできるようになりました。

Todos (時間があれば):

  1. パラメータを保存およびロードする機能の追加 (人々が見つけた興味深いモデルを簡単に共有できるようにするため)
  2. より多くの粒子タイプを追加する機能 (現在、4 つの粒子タイプに固定されています)
  3. 現在、最大のボトルネックは、ネストされた for ループ (すべての粒子間のペ​​アごとの距離を計算する) であり、計算の複雑さを二次的にしています。回避方法が見つかれば素晴らしいことです。
  4. ポイント3の代わりに、ペアワイズ距離の計算は恥ずかしいほど並列であるため、GPUで計算できます。
  5. 画面のサイズを変更する機能を追加し、多くの高速で移動するパーティクルが画面の境界を逃れる可能性があるため、境界チェックを改善します。
  6. より直感的な UI を追加して、パラメーターをより細かく制御できるようにします。
  7. ランダム化ボタンを追加するか、さらに良いことに、最初のルールを継続的かつ再帰的に変更するための単純なメタルールを用意します。このようにして、パターンが極大値にとどまることはなく、変化し続けます!
  8. 微調整するためのより良い方法は、進化的アルゴリズムを使用してパラメーターを選択および最適化することですが、そのためのフィットネス関数を作成する必要があります。私は現在、このプログラムの領域でどのフィットネス機能が対応しているかわかりません。私たちの世界では、フィットネス機能は競争と適者生存です。ただし、ここでは、興味深いパターンを生成するパラメーターを微調整して選択しますが、「興味深い」という言葉は、定義するよりも言う方が簡単です!

JavaScript コードは次のように単純です。

また、より最適化されたバージョンについては、particle_life.html ファイルを参照してください。貢献してくれた方々に感謝します。

<canvas id="life" width="500" height="500"></canvas>
<script>
  //Hunar Ahmad @ brainxyz
  m = document.getElementById("life").getContext("2d");
  draw = (x, y, c, s) => {
    m.fillStyle = c;
    m.fillRect(x, y, s, s);
  };
  atoms = [];
  atom = (x, y, c) => {
    return { x: x, y: y, vx: 0, vy: 0, color: c };
  };
  random = () => {
    return Math.random() * 400 + 50;
  };
  create = (number, color) => {
    group = [];
    for (let i = 0; i < number; i++) {
      group.push(atom(random(), random(), color));
      atoms.push(group[i]);
    }
    return group;
  };
  rule = (atoms1, atoms2, g) => {
    for (let i = 0; i < atoms1.length; i++) {
      fx = 0;
      fy = 0;
      for (let j = 0; j < atoms2.length; j++) {
        a = atoms1[i];
        b = atoms2[j];
        dx = a.x - b.x;
        dy = a.y - b.y;
        d = Math.sqrt(dx * dx + dy * dy);
        if (d > 0 && d < 80) {
          F = (g * 1) / d;
          fx += F * dx;
          fy += F * dy;
        }
      }
      a.vx = (a.vx + fx) * 0.5;
      a.vy = (a.vy + fy) * 0.5;
      a.x += a.vx;
      a.y += a.vy;
      if (a.x <= 0 || a.x >= 500) { a.vx *= -1; }
      if (a.y <= 0 || a.y >= 500) { a.vy *= -1; }
    }
  };
  yellow = create(200, "yellow");
  red = create(200, "red");
  green = create(200, "green");
  update = () => {
    rule(green, green, -0.32);
    rule(green, red, -0.17);
    rule(green, yellow, 0.34);
    rule(red, red, -0.1);
    rule(red, green, -0.34);
    rule(yellow, yellow, 0.15);
    rule(yellow, green, -0.2);
    m.clearRect(0, 0, 500, 500);
    draw(0, 0, "black", 500);
    for (i = 0; i < atoms.length; i++) {
      draw(atoms[i].x, atoms[i].y, atoms[i].color, 5);
    }
    requestAnimationFrame(update);
  };
  update();
</script>

関連トピック: 粒子生命シミュレーション、原始スープ - 進化、コンウェイのライフ ゲーム、セル オートマトン、自己組織化パターン、

このプロジェクトは、以下に触発されました: Jeffery Ventrella の Clusters http://www.ventrella.com/Clusters/. 私は Ventrella のコードにアクセスできませんが、このプロジェクトと他の粒子生命プロジェクトとの主な違いは、衝突検出を実装していないことであり、これにより数千の粒子をリアルタイムでシミュレートできるようになったと思います。また、パラメーターをリアルタイムで変更するための GUI コントロールを追加して、微調整と探索を簡単に行えるようにしました。これにより、非常に単純な関係モデルから、これまでに見たことのないパターンが出現することを発見できました。ここにあるコードは、他のどの人工生命コードよりもおそらく桁違いに単純です。なぜなら、単純さから複雑さが生じるという点を証明するために、非プログラマーや一般聴衆向けの教材としてこのコードを始めたからです。