黒い水槽に、二本の腕を持つSwimbotが無数に泳ぐ。紫・緑・白の個体が中央から右に散らばり、左には餌の緑の点がまばらに浮かぶ。Gene Poolの進化シミュレーションの画面

大学時代に遊んでいた進化シミュレータがある。Jeffrey Ventrella の Gene Pool(Swimbots)。2次元の水槽で「Swimbot」という生き物が泳いで、餌を食べ、近くの個体と交配して進化し、エネルギーが尽きれば死ぬ。当時はこれをかなりの時間PCで動かして、どのようなSwimbotに進化するのか、どのような生存戦略で環境ニッチを構築するのかを観察していた。

当時、遊び尽くして至った不満。毎回違う前提条件で開始しても、最終的にはいつも同じニッチに収束する。

  • 高エネルギー獲得/消費種: 泳ぎが上手で餌を食べ交配しまくる
  • 低エネルギー獲得/消費種: 微動だにせず自分のところに餌と交配相手が来るのを待つ

これはSwimbotの環境に「生殖隔離」がないため、高獲得/消費種が他種との交配機会を独占して遺伝子プールを埋め尽くしてしまうこと、また「動くコスト」が事実上無いため、微動だにせず餌と交配相手を待つだけの低消費種も淘汰されずに居座れること。この二つにより、水槽はいつも同じ二極に落ち着いてしまう、というのが当時の不満だった。

「肉食動物が現れたら低獲得/消費種は淘汰されるのに」「逃げるのが上手な草食動物がニッチとして現れるかも」「逃げるだけでなく防御できても面白いかも」「そういった攻撃手段/防御手段が一気に軍拡競争したのがカンブリア爆発なのでは?」みたいな妄想をしていた。 とはいえ、当時はそれを自分でプログラムできる技術力はなく、ただの妄想に終わっていた。

AIがそれを可能にした

久々に Gene Pool で遊ぼうとサイトを訪れてみると、2025/10にWebブラウザで遊べるようになっており、ソースコードも公開されていた。AIによる Agentic Coding もあるし、今なら夢を叶えられるかも。 公開されているコードをフォークし、Rust/wasm へ移植し、遺伝子をON/OFFしたり設定を変えたりしながら何百回もバッチで回せる実験台にした。

作る前に思っていたのは「捕食・逃避・防御の手段を遺伝子的な選択肢に組み込んであげれば多様なニッチが生まれるだろう」だった。実際にやってみたら、面白かったのはそこではなく、自分の予測が次々に外れることだった。順に書く。進化生物学の専門家ではないので、解釈の粗さは割り引いてくれれば。

「生殖隔離すれば新種になる」 → ならなかった

水槽の中で、生き物は捕食者と被食者の二つの型に分かれる(肉食はたいてい少数派)。では別々の種になるかというと、ならない。交配し続けているので、中立なDNAは毎世代かき混ぜられて、遺伝子プールは一つのまま。分かりやすいのは、肉食型が周期的に滅んでは草食型から生まれ直すこと。草食の親から肉食の子が生まれる、それ自体が「プールは一つ」の証拠。

別種にするには型のあいだの交配を止めればいい。そう思って思いつく手を片っ端から試して、全部、形は違えど同じ壁に当たった。並べてみて初めて分かったのは、同所的に新種を作るには三つが同時に要る、ということだった。二つの型を保つ、型のあいだの交配を切る、小集団を生かす。どの手も、二つを取ると三つ目を必ず手放す(このトリレンマと、最後に三脚を全部押さえて稀に新種を完成させた話は、別稿「進化シミュレータで新種が生まれない理由を追いかけたら、種分化のトリレンマに行き着いた」に詳しく書いた)。「止めればいい」という最初の予測は、ノブの設定の問題ではなく、構造として間違っていた。

「ハイエナを足せばニッチが増える」 → なったが、腐肉食は希少なままだった

死骸を食う腐肉食を足してみた。死んだSwimbotが死骸を落とし、肉食個体がそれも食べる。死骸は死亡率で湧く餌で、食べても供給は減らない(捕食と違って自分で獲り尽くせない)から、捕食者ニッチが安定して集団が増える。狩りと腐肉食を別の遺伝子に分けると、草食・狩人・腐肉食の三つの行動が画面で見分けられる。ここまでは予測どおりだった。

外れたのはその先だ。腐肉食はずっと少数派のままで、餌のエネルギーを増やしても探索範囲を広げても、第三の柱には育たない。死骸は生きた獲物より小さい資源で、それで養える数に上限があるからだった。現実のハゲワシが、対等な栄養段階ではなく希少な特殊者なのと、たぶん同じ理由だ。賑やかにしようとして足した機能から、「なぜ腐肉食は希少なのか」という、足す前には考えていなかった答えが出てきた。

「肉食はだらだらするはず」 → だらだらは出ず、集団が縮んだ

ライオンが一日の大半を寝て過ごすみたいに、満腹で動く理由が無いときは休んで省エネする、という挙動を足した。肉が高カロリーな分、肉食ほど休む方向に進化するはず、と予測した。

外れた。どちらの型が怠けるかは回によってバラバラで、肉食が怠ける、という綺麗な傾向は出ない。代わりに別の力学が出てきた。怠けは個体には得だ。動かなければエネルギーを使わない。だから進化で増えて、長く回すと半分くらいが常に休むようになる。ところが、交配の出会いを作っているのは「うろつくこと」なので、全員が「自分は休んで、動く他人にタダ乗りする」方を選ぶと、出会いそのものが枯れる。繁殖が落ちて、集団が静かに縮んで壊れていく。個体に適応的な怠けが、集団を自滅させる。狙った「肉食はだらだら」は出ず、代わりに共有地の悲劇が出た。

「スケールさせれば新種が増える」 → 増えず、無理に積むと減った

これは機能を足す話ではなく、押す話だ。新種が稀にしか完成しない(三脚が同時に揃った回だけ、16回に1〜2回)のを見て、足りないのは規模なんじゃないか、と思った。大きな言語モデルが計算とデータを増やすほど良くなるように、長く回す・ニッチの次元を増やす・軸を増やす、で完成する回が増えるはず、と予測した。

外れた。長く回すと隔離の指標は途中で飽和して、それ以上は計算を倍にしても動かず、代わりに絶滅だけが増える。資源の種類を増やすと食性の型は増えるけど、また「犬種」が増えるだけで新種にはならない。種分化の仕組みをまるごと別の軸に載せ替えても、完成率は同じ。挙句、二つの軸に同時に仕組みを積むと、集団が細かく割れて、むしろ完成がゼロに落ちた(このスケールの話だけは別稿「進化シミュレータで新種が生まれない理由を追いかけたら、種分化のトリレンマに行き着いた」に数字つきで詰めた)。押して上がったのは「運の良い回の隔離の深さ」だけで、「揃う回の頻度」は最後まで動かなかった。完成率は規模の問題ではなく、構造で決まっている確率そのものだった。

四つとも、当てに行って外れた

入口は「面白くしよう」「賑やかにしよう」、最後の一つは「もう規模で押せるんじゃないか」だった。四つとも、外そうとして外れたんじゃなく、当てに行って外れた。共通しているのは、水槽がこちらの設定をなぞるんじゃなく、別の答えを返してきたことだ。怠けを足せば賑やかなだらだら水槽になるはずが、静かに縮む水槽になった。押せば完成が増えるはずが、頻度は動かず、無理に積むと減った。

入力をなぞるだけのおもちゃなら念じたとおりに動くが、これは動かなかった。裏に本物の構造があり、その構造がこっちの見落としを返してくる。捕食者がなぜ希少か、怠けがなぜ自滅するか、新種がなぜ難しいか、なぜ規模で押せないか。

確実に新種を出す設定は無いし、怠けの話も詰め切れていない。ただ「規模で押せるか」だけは、押してみて押せないと分かった。次に何を予測してどう外れるかは、回してみないと分からない。