「Gene Poolみたいなのを作りたい」と書いた16年後、本家をフォークして夢を回した

genepool.toming.app で動いているのは、Jeffrey Ventrella の Gene Pool(Swimbots)という進化シミュレータ。2次元の水槽に「Swimbot」という生き物が泳いでいて、256個の遺伝子が体の形と行動を決める。餌を食べ、近くの個体と交配し、エネルギーが尽きれば死ぬ。淘汰も交配相手選びも全部その場の物理で決まる、眺めているだけのアクアリウム。
完全な自作ではない。原作者が公開したソースをフォークして、Rust/wasm へ移植し、近代化したもの。ただ、この水槽を自分の手で回したかったのは、16年前から。
2009年末、進化に手が伸びるのは早かった
最初の記録は2009年12月16日のツイート。「Genepoolのようなシミュレータを作りたい。ハードルは高いがw」。社会人になる前、図書館でC言語の入門書を借りて独学を始めたばかりの頃。
進化的アルゴリズムそのものには、早くから手が伸びた。同じ月、大学のC授業の自由課題に出した battles-evo.c。ただしこれは夢の実装ではない。別のゲームのCPU対戦相手が弱すぎたのを、強くするために書いたもの。256体を総当たりで戦わせ、勝った個体が自分を少し変えたコピーで負けた個体を置き換える。性格は8バイトの数列。要するに遺伝的アルゴリズムの車輪の再発明で、5日前には「勝利したCOMは敗者を要素を少し変えた自身のコピーで置き換える…ひたすら繰り返したら強くならんかな」と書いている。目的はゲームのCP強化でも、手は進化の方へ伸びていた。
本命の「泳ぐ生き物」は実装できなかった
ただ、本命はそっちではない。Gene Poolでやりたかったのは、形が進化して、その体で泳ぐ生き物が、生態系の中で淘汰されていく様子。
それを、言語を替えて何度も作り直した。2010年にRubyで植物と草食動物の生態系。2012年にJavaScriptへ移植。会社の研修中にはJavaでも書いた。Scalaに移ってからは、バイト列DNAを256個の関数テーブルとして読む Nature(2011年)。Unityの Genes(2014年)。シグモイドニューロンを積んだ生き物の geneuron(2015年)。自分の設計が欲しくて、2010年には遺伝子構造の設計ノートも書いている(「gene poolにインスパイアされても、同じになったら意味が無い」)。
どれも生態系シミュレーションにはなった。生き物が動いて、食べて、交配して、淘汰される。でも肝心の「泳ぐ」が作れない。形態が進化して、その体の動かし方で進む、というGene Poolのあの泳ぎが実装できず、移動は結局ただの速度ベクトルに落ちた。生態系のシミュレーションではあっても、進化する泳ぐ生き物のシミュレータにはならなかった。
届かない、と本人が書いている
それを当時から書いている。
2012年1月、「任意長のArray[Byte]を遺伝子として評価して人工生命として仮想世界で生存競争させるソフト作りたいな…とずっと思っているが、如何せん自分の実現能力が不足している」。2015年9月、「体と知性を同時に1つのバイト列(遺伝子)で扱えないか以前考えましたが、十分な多様性を実現できるアイデアに出来ませんでした」。
律速は、着想ではなく実装。作りたいものははっきりしていて、それを動く水槽にするだけの腕が足りない。2016年から2024年まで、進化シムの制作はほぼ止まる。関心が消えたわけではないが、手は動かなかった。
2025年、律速が二つ外れた
2025年から2026年にかけて、止めていた律速が二つ外れた。
一つはAI。3DCGも物理エンジンも、以前は構想で止まっていたものを、実際に動くところまで持っていけるようになった。
もう一つは原典の側。2025年10月、Ventrella が Gene Pool のソースを、ブラウザUIだけでなくシミュレーション本体ごと公開した。ライセンスは MIT に Commons Clause を足したもので、「売る」以外は自由。本人が license に「art・education・research・実験的なゲームデザインのために、同じ志を持つ人々が上に作るためのもの」と書いている。README には「シミュレーション全体がいまや開かれた」とある。
16年かけて自分では組めなかった、あの泳ぐ生き物の水槽が、向こうから開かれた。なら、そこから始めればいい。フォークして土台にした。
眺める水槽を、測る装置にする
フォークしてからやったのは、近代化。元は「綺麗だな」で終わる水槽を、同じ条件を何度でも再現できて、何が起きたかを数値で測れる実験台にした。
乱数にseedを刺して、同じseedなら同じ宇宙が再現するようにした。描画から物理を切り離して固定タイムステップに。画面なしで5000ステップ回して状態のハッシュを出すheadlessテストを置き、回帰が出れば気づけるようにした。多様性・行動の二極化・種の数を測る指標を足した。コアを丸ごと Rust に移して、追加機能を全部OFFにすると原典とビットレベルで一致することを担保した。107コミット、2週間。
これで、思いどおりにはならない水槽になった。設定を変えて、バッチで何百回も回して、結果が予測と合うかを突き合わせられる。
できた水槽に、昔の問いを訊いた
そこで訊いたのは、昔の妄想そのものだった。同じ水槽の中で、生き物は本当に別の種に分かれるのか。カンブリア爆発みたいに、二極ではなく多様な型が立つのか。
答えは別の記事に詰めた。捕食者と被食者の二つの型には分かれるのに、それが別種にはならないこと(種分化のトリレンマ)。規模で押せば新種が増えるはず、という予測まで含めて片っ端から外れたこと(予測が片っ端から外れた)。
要点だけ言えば、答えはたいてい「ノー」だった。確実に新種を出す設定は無いし、計算を倍にしても増えなかった。16年前に思い描いた賑やかな多様性は、そう簡単には立たない。
妄想どおりに動くなら、ただのおもちゃ。この水槽は設定をなぞらず、こちらの見落としを返してくる。裏に本物の構造があるから。次に何を訊くかは、まだ決めていない。