技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く興味があります。

粘菌に迷路を解かせるシミュレーション

粘菌は凄い!なぜかって、脳がないのに餌までの最短経路を見つけることができる。
これが神経細胞の始まりだとか言われていたり言われていなかったりする



以前から知ってはいたが、調べているとニコ動でこんな動画があった。ちゃんとできている!しかもエクセルで!

おおなんだ、これはすごい!自分でも再現したい!
ということで、自分で作ってみることにした。


アルゴリズムは人工生命的なセルオートマトン的な何かだろうと推測される。
映像を参考にしながら試行錯誤していこう。

まず単純な規則から考えてみる。
セルの状態として考えられるのは、

  • エサ
  • 粘菌
  • かべ
  • 空白

そして、基本的な事は

  1. 道幅は1セル分のみ
  2. 初期値ではすべての道に粘菌が存在する
  3. ある規則に基づいて粘菌セルが空白セルに変わる、それ以外は不変

ということだろう。
そして恐らくある規則というのは、
「両隣が粘菌セルかエサであれば粘菌セルは生き残り、それ以外は隣の粘菌セルに吸収される。」
じゃないだろうか。

…なんとなくできそうだ、さっそく実装してみよう。

import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from copy import deepcopy

colors = {
    "empty":(1, 1, 1),
    "wall":(0, 0, 0),
    "feed":(1, 0, 0),
    "ameba":(1, 0.8, 0.2),
}
symbols = {
    "$":"wall",
    " ":"ameba",
    "s":"feed",
    "t":"feed",
}
stagefile = "stage.txt"


def stage2colors(stage):
    colormap = deepcopy(stage)
    for i in range(len(stage)):
        for j in range(len(stage[0])):
            colormap[i][j] = colors[stage[i][j]]
    return colormap

def update(stage):
    next_stage = deepcopy(stage)
    for i in range(1,len(stage)-1):
        for j in range(1,len(stage)-1):
            next_stage[i][j] = cell_rule(stage, i, j)
    return next_stage

def cell_rule(stage, i, j):
    result = stage[i][j]
    if stage[i][j] == "ameba":
        around_cells = 0
        for x,y in [(-1,0),(1,0),(0,-1),(0,1)]:
            if stage[i+x][j+y] in ["ameba","feed"]:
                around_cells += 1
        result = "ameba" if around_cells > 1 else "empty"
    return result

f = open(stagefile,"r")
lines = f.readlines()
stage = []
for line in lines:
    line = line.replace("\n","")
    line = line.replace("\r","")
    stage.append([symbols[i] for i in line])

ims = []
fig = plt.figure()
plt.axis('off')
for t in range(40):
    stage = update(stage)
    im = plt.imshow(stage2colors(stage), interpolation='none')
    ims.append([im])
ani = animation.ArtistAnimation(fig,ims)
plt.show()
  • stage.txt
$$$$$$$$$$$$$$$$$
$   $   $       $
$ $ $ $ $ $$$$$ $
$ $ $ $ $ $   $ $
$ $ $ $$$ $ $ $ $
$ $ $   $ $ $   $
$ $ $ $ $ $ $$$$$
$ $ $ $ $t$   $ $
$ $$$ $ $$$ $ $ $
$     $  $  $ $ $
$ $$$ $ $$$ $ $ $
$ $   $ $   $   $
$$$ $$$$$ $$$ $ $
$   $         $ $
$ $$$ $$$$$$$$$ $
$   s           $
$$$$$$$$$$$$$$$$$

予想通りそれっぽいのができたぞ。
ただ、粘菌は環状になってる経路は最短距離で辿り着くようになってるよね。
実際の粘菌に近づけるにはもっと考えるところがありそう。