Random Note

vmc-pet 実験記録4 — 多チャンネル Lenia の生き物を電子ペットの体にできるか

概要

vmc-pet の体は、1チャンネルの Lenia の場です。 実験記録2 では、体の規則を差し替える候補を試し、多チャンネル Lenia については計算の重さだけを測っていました。

今回は、多チャンネル Lenia の生き物を実際に動かし、ペットの体として使えるかを確かめました。 使った生き物は、Bert Chan 氏が探索で見つけて、GitHub の公開リポジトリにデータとして置いているものです。私たちが新しく見つけた生き物ではありません。 私たちが行ったのは、Rust への移植と、ペットの小さな場に合わせた縮小、ペットの試験への適用です。

結論を先に書くと、次のとおりです。

  • 移植は、Chan 氏の式をそのまま写した参照実装と5〜6桁まで一致した

  • 場を 64×64 に広げれば、72 体中 32 体が形を保ち、そのうち 9 体はペットが体に与える変化に耐えた

  • 耐えた体の中には、弱ったときの見た目の変化が、いまのペットの体より大きいものがある

  • ただし、チャンネルの配分(色の割合)は変化をかけてもほとんど動かず、表情の軸にはならなかった

  • 実際のペットと同じ流れで長く放置しても、合格した 9 体中 7 体は崩壊せず、世話されると元の姿に戻った

多チャンネル Lenia とは

多チャンネル Lenia(Chan 2020, "Lenia and Expanded Universe")は、場をチャンネルの数だけ持ちます。 カーネルごとに「どのチャンネルを読んで、どのチャンネルを育てるか」が決まっていて、たとえば「チャンネル0の様子を見て、チャンネル1を育てる」カーネルがあります。 チャンネルを赤・緑・青に割り当てて描くと、色の違う層が重なった生き物に見えます。

1ステップの更新は、カーネルごとに読むチャンネルを畳み込み、成長関数を通した量を育てるチャンネルへ足し、足したカーネルの重みの合計で割ってから 0〜1 に切り詰めます。

生き物のデータを探す

Chan 氏のリポジトリの Python/animals.json には 614 体の生き物がありますが、すべて1チャンネルでした。 README の「LeniaNDKC.py -c3 -k3 を実行して B を押すと、最も進んだパターンが見られる」という案内から辿ると、多チャンネルの生き物は探索結果の置き場 Python/found/ にありました。 ファイル名は「次元・チャンネル数・自己カーネル数・相互カーネル数」を並べたものです。

ペットの計算量を考え、小さい構成の3つを使いました。

ファイル チャンネル カーネル 生き物

221.json

2

4

40

222.json

2

6

9

231.json

3

9

23

「stable moving」「stable rotating」「with nucleus, individual, mitosis, death」のように名前の付いた生き物もいれば、名前の無い生き物もいます。

移植が合っているか

Chan 氏のプログラムは Python と FFT で畳み込みます。vmc-pet の体は、Rust で生きているセルからだけ畳み込む疎な方式です。 書き方が違うので、Chan 氏の式を numpy でそのまま写した参照実装も作り、同じ生き物のチャンネルごとの総量を突き合わせました。

生き物 ステップ 参照実装(倍精度) Rust(単精度)

corona

100

588.355054 / 766.308113

588.356079 / 766.307495

corona

1000

596.014109 / 769.983520

596.009033 / 769.982056

wandering

300

232.742 / 268.653 / 307.978

232.746 / 268.658 / 307.977

5〜6桁まで一致し、片方のチャンネルが消える生き物や、全部消える生き物(wandering)まで同じ動きをしました。 保存された生き物の中には、見つけた時点では生きていても、長くはもたないものが含まれているようです。

小さな場で生きられるか

Chan 氏の生き物はカーネルの半径 R が 14〜38 と大きく、ペットの 32×32 の場には収まりません。 Chan 氏のプログラムの変換に倣ってパターンを縮め、R を 13(いまのペットの体と同じ)にして試しました。

多チャンネルの生き物の、3つの条件での最後の姿

(各行は左から、元の大きさ・R 13 で 64×64・R 13 で 32×32)

条件 形を保つ 動く 崩壊・膨張・置けない

元の R・128×128

38 / 72

9

20

R 13・64×64

32 / 72

4

27

R 13・32×32(ペットの場)

21 / 72

3

44

R を縮めても、64×64 の場なら多くが元の形のまま小さくなりました。 一方、ペットの 32×32 では、体が場に対して大きすぎて端をまたいで自分に影響し、膨張したり、そもそも場に収まらなかったりしました。 多チャンネルの生き物を体にするなら、場を 64×64 程度に広げるのが前提になります。

ペットの試験にかける

64×64 で形を保った 32 体を、ペットが実際に体に与える変化にかけました。

  • 弱る(成長の強さを 0.85 へ)

  • テンポを ×0.6 と ×1.6 にする

  • 実際のクリックと同じ強さで5回突く

さらに、1つのチャンネルだけ成長を弱めて戻す試験も行いました。チャンネルの配分(色の割合)が変わって戻るなら、色が体の力学から生まれる表情の軸になるからです。

合格した生き物の、変化をかけているときの姿

(行は上から O2u(いまの体)・221-09・221-10・221-22・222-01・231-04。列は左から、基準・弱る・テンポ ×0.6・チャンネルごとに弱る)

  • 9 体が合格しました(4つの試験のすべてで、2回とも崩壊せず元に戻った)

  • 合格しなかった 23 体のうち 18 体は、弱ると崩壊しました。いまのペットでいちばん長く続く「放置されて弱る」変化に、多チャンネルの生き物は弱いようです

  • 合格組には、いまの体より見た目が大きく変わるものがいました。231-04 は弱ったときの見た目の差が 0.59、221-22 は 0.54 で、いまの体(O2u、最大 0.26)を上回ります。輪が小さくなる、三日月の形が変わる、といった大きさと輪郭の変化です

  • チャンネルの配分は、ほとんど動きませんでした。1つのチャンネルだけ弱らせても、戻った体の色の割合の差は 0.03 以下で、目で見ても変わりません。片方を弱らせると両方が一緒に縮み、チャンネルどうしが強く結びついていました

PC 版で見る

合格した 9 体を vmc-pet に同梱し、ペットの仕組みにはつながずに表示するモードを作りました。

cargo run --release -- --list-multichannel
cargo run --release -- --preview-multichannel 231-04

実際に眺めてみて面白かったのは、次の2体でした。

  • 222-01: 2チャンネル・カーネル6本。合格組では速く動く方で、場を移動していく

  • 231-04: 3チャンネル・カーネル9本。ほとんどその場にいるが、赤・緑・青の層が重なった体で、弱ったときの形の変わり方が一番大きい

ペットと同じ流れで放置する

上の試験は、750 ステップで一気に弱める1通りでした。実際のペットは、放っておかれるとエネルギーが約150秒かけて尽き、そのあとがっかりして動きが遅くなります。 合格した 9 体を、この流れのまま 20000 ステップ(約22分)放置し、そのあと世話されて元に戻る流れにかけました。各8回です。

放置して弱りきったときと、戻した後の姿

(左の列は上から O2u・221-00・221-09・221-10・221-12、右の列は上から 221-22・222-01・231-00・231-04。各行は左が弱りきったとき、右が戻した後)

体 崩壊 弱りきったときの見た目の差 元に戻った

O2u(いまの体)

0/8

0.28

8/8

231-04

0/8

0.56

8/8

221-22 fast smear

0/8

0.68

8/8

222-01

1/8

0.47

7/8

221-05

8/8

−

0/8

  • 9 体中 7 体は、8回とも崩壊せず、世話されると元の姿に戻りました

  • 231-04 は、弱りきると同心の輪が小さくなり、戻すと元の大きさに戻りました。見た目の差はいまの体の約2倍です

  • PC 版で面白かった 222-01 は、8回中1回、エネルギーが尽きていく間に崩壊しました

  • 221-05 は、上の試験には合格したのに、長い放置では8回とも崩壊しました。短い試験だけでは分からない弱さがあります

分かったこと

  • 公開されている多チャンネル Lenia の生き物は、Rust の疎な畳み込みでも Chan 氏の式どおりに動かせる

  • ペットの体にするなら、場を 64×64 に広げ、放置されて弱る変化に強い体を選ぶ必要がある。計算は、いまの体の4倍以上になる

  • 多チャンネルで得られるのは、色の配分という表情ではなく、層の重なった見た目と、弱ったときの形の変化の大きさ

  • 色の表情は、いまの vmc-pet のように体とは別の色素として持つ方が扱いやすい

  • 選べば、ゆっくり放置されても崩壊せず戻れて、弱ったときの変化がいまの体の2倍以上になる体がいる(231-04、221-22)。体に選ぶ前には、長い放置の試験が要る

限界

  • 試験の回数は各2回で、場は 64×64・R 13 だけ

  • 放置の試験は各 8 回だけで、8回とも崩壊しなかったことからは「崩壊の起きやすさは約3割未満」としか言えない。世話されて戻る流れも1通り

  • 見た目の特徴は、速さ・脈動・見える点の数・色の割合だけで、輪郭の形は画像でしか見ていない

  • 3チャンネル・15本の構成(954 体)と、M5Stack の場は試していない

記録とコード

  • 実験の記録: docs/experiments/rule-candidates.md(「多チャンネル Lenia の生物を動かす」以降)

  • 多チャンネルの式: crates/vmc-pet-body/src/multichannel.rs

  • 実験の道具: crates/vmc-pet-body/examples/multichannel_trial.rs

出典

  • 生き物のデータ(Python/found/221.json・222.json・231.json)と多チャンネル Lenia の式: Bert Chan 氏の Lenia(MIT License)

  • Bert Chan, "Lenia and Expanded Universe"(ALIFE 2020, arXiv 2005.03742)