In Silico

シミュレーション・制御・実機

反応拡散で模様を生成する対話デモ(Gray-Scott)

2026/6/29 (更新: 2026/8/5)

二つの仮想化学物質が拡散し、反応する。ルールはたった一つだ。なのに、feed と kill の2つの数字だけで、斑点・迷路・サンゴ・指紋へと世界が分岐する。下のキャンバスで走っているのが、その Gray-Scott 反応拡散だ。各点が二つの濃度をもち、近傍と混ざり合い(拡散)、決まった式で反応する——それを繰り返しているだけである(表示1コマにつき、この更新を8回まとめて回している)。

プリセットで (feed, kill) を切り替え、キャンバスをクリック/ドラッグして種を描いてみてほしい。なお切り替えは数字だけを変え、画面はそのまま引き継ぐ。そのため模様が十分に育ったあとで「斑点」や「サンゴ」に切り替えると、V が消えて真っ黒になることがある——そのときは「消去」してから描き直せばよい。生成そのものは易しい。難しくて、面白くて、価値があるのは——狙った構造を選ぶこと、つまり制御の側である。あなたが、その制御面だ。

feed=0.029, kill=0.057(迷路)— キャンバスをドラッグして種を描く

画面の色は、片方の物質 V の濃さだ。 暗い(ほぼ黒)所は V がほぼ無く、もう一方の物質 U で満たされた「素の土台」。そこに V が増えるほど色が暖かくなる——紫 → 赤 → 橙 → 淡い黄、と明るいほど V が濃い。だから模様の縁で起きているのは、V が土台の U を食べて広がっていく境界の動きである。

画面の模様が従う規則は一つだけだ。二つの物質が違う速さで広がり(拡散)、出会った場所で一方がもう一方を増やす反応が起き、同時に外から一方が供給(feed)され、もう一方が除去(kill)される——この供給と除去の釣り合いが、斑点・虫・迷路・サンゴ・穴・指紋のどれになるかを選ぶ。直感的には、毎フレームこの三段を順に回しているだけだ:

反応拡散(Gray-Scott)の更新三段(概念図)各マスは二つの濃度 U と V をもち、毎フレーム三段で更新する。①拡散:U も V も近傍ににじみ広がるが、U は V の約2倍広がりやすい(拡散係数が2倍)。この広がりやすさの差が模様の骨格を決める。②反応:U と V が居合わせると U+2V→3V が起き、V が U を食べて自分を増やす(自己触媒)。③供給と除去:外から U が割合 F で補充され、V は割合 F+k(kill の k を主とする)で取り除かれる。F と k の釣り合いが、斑点・迷路・指紋のどれになるかを選ぶ。画面の色は V の濃さ(暗い=V無し、明るい暖色=V濃い)。※ 概念図(フロー)U(基質・速く広がる)V(増える側・遅く広がる/画面の色=Vの濃さ)① 拡散:にじみ広がるU は V の約2倍広がりやすい(拡散係数が2倍)。この「広がりの差」が骨格。② 反応:U+2V → 3VU+VVVVVV がある所で U を食べ、V が自分を増やす(自己触媒)。③ 供給と除去U を補充V を除去+F−(F+k)プリセットが変えるのはこの F と k の二つだけ。この三段を毎フレーム繰り返すだけ。F と k の釣り合いが、斑点・迷路・サンゴ・指紋のどれになるかを選ぶ。絵を描く誰かはいない——模様を選んでいるのは、二つの数字と、そこに撒かれた種だ。その二つを選ぶあなたが「制御面」。画面の色 = V の濃さ:暗い=V無し(基質のまま)→ 紫 → 赤 → 橙 → 淡黄=V濃い。
三段を絵にすると——近傍ににじませ(①拡散)、出会えば V が U を食べて増え(②反応 U+2V→3V)、外から U を足し V を抜く(③供給と除去)。これを毎フレーム繰り返すだけで、F と k の組が模様を選ぶ。
※ 概念図(フロー)(作図:AI)
仕組み——どんな規則で動いているか(クリックで展開)

舞台は格子状のマス目で、各マスは二つの濃度 U と V をもつ。この一つの規則は、次の三段からなる。

  1. 拡散——どちらの物質も周囲ににじみ広がる。ただし U のほうが V のおよそ二倍広がりやすい(拡散係数が2倍)。この「広がりやすさの差」が模様の骨格を決める。
  2. 反応——U と V が同じ場所に居合わせると、U + 2V → 3V という反応が起きる。V が一つでもあると、そこの U を食べて V が自分を増やす。だから V は「自己触媒的」に伸びる。
  3. 供給と除去——外から U が一定の割合 F(feed) で補充され、V は k(kill)を主とする割合で取り除かれる(式では F+kF+k)。プリセットで切り替えているのは、この F と k の二つの数字だけである。

V が増えすぎれば U を食べ尽くして自滅し、増えなさすぎれば供給に押し流される。その綱引きが釣り合う細い帯の中で、斑点・虫・迷路・サンゴ・穴・指紋といった模様が立ち上がる。模様の種類を選んでいるのは、絵を描く誰かではなく、F と k の二つの値の組((F,k) 平面上のどこにいるか)と、そこに置かれた種である。(F,k) は比ではなく点そのものが効くが、点だけでは決まらない——同じ点でも、まっさらな土台に小さく撒けば斑点が育ち、すでに模様で埋まった状態から切り替えると V が消えてしまうことがある。この履歴依存——一様な土台はどの (F,k) でも安定で、模様は有限の種を撒いたときにしか立たない——が、この系の性質だ(なお Pearson が「双安定」と呼ぶのは (F,k) 平面の一部の領域を指す)。この平面のどこにどの模様が出るかを体系化したのが Pearson(Science, 1993)だ。反応と拡散が模様を生むという発想は Turing(1952, 形態形成の化学的基礎)に遡るが、機構は別物である。Turing が扱ったのは一様な状態が微小な揺らぎで自発的に崩れる場合で、こちらは一様な状態がどの (F,k) でも安定なまま、有限の大きさの種にだけ応じる。Pearson 自身、ここで使う拡散係数比 2 では安定な Turing パターンは出ないと明記している(安定な Turing パターンに要る比はおよそ 2.8 以上)。「消去」して何も起きないのは、そのためだ。

数式で書けば、各点の時間変化は次の二本で与えられる(2\nabla^2 は近傍との混ざり合い=拡散を表すラプラシアン、DUDVD_U \cdot D_V は拡散の速さ)。

Ut=DU2UUV2+F(1U)\frac{\partial U}{\partial t} = D_U \nabla^2 U - UV^2 + F(1 - U)Vt=DV2V+UV2(F+k)V\frac{\partial V}{\partial t} = D_V \nabla^2 V + UV^2 - (F + k)V

各項の意味はそのまま上の三つの規則に対応する——2\nabla^2 が拡散、UV2UV^2 が反応(V による U の消費・V の増殖)、F(1U)F(1-U) が U の供給、(F+k)V-(F+k)V が V の除去である。このデモでは DU=0.16, DV=0.08D_U=0.16,\ D_V=0.08 と固定し、FFkk だけを動かしている。

更新ルール自体は決定論的だ——更新の式に乱数はどこにも入らない。ただし最初の種は自動でランダムに撒かれるので、読み込むたび模様は変わる。「消去」して自分で描き直せば、そこから先に現れる模様は種とパラメータ——つまりあなたの選択だけで決まる。だからこそ「生成」より「選択」が効く、という話になる。

同じ「ルールは単純、結果は多様、価値は選択の側」という背骨は、AIの生成にもそのまま通じる。模様を出すこと自体は易しい。どの模様を選ぶかを決める制御面こそが、難しくて値打ちのある仕事だ。

この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。