粘菌は凄い!なぜかって、脳がないのに餌までの最短経路を見つけることができる。
これが神経細胞の始まりだとか言われていたり言われていなかったりする
以前から知ってはいたが、調べているとニコ動でこんな動画があった。ちゃんとできている!しかもエクセルで!
おおなんだ、これはすごい!自分でも再現したい!
ということで、自分で作ってみることにした。
アルゴリズムは人工生命的なセルオートマトン的な何かだろうと推測される。
映像を参考にしながら試行錯誤していこう。
まず単純な規則から考えてみる。
セルの状態として考えられるのは、
- エサ
- 粘菌
- かべ
- 空白
そして、基本的な事は
- 道幅は1セル分のみ
- 初期値ではすべての道に粘菌が存在する
- ある規則に基づいて粘菌セルが空白セルに変わる、それ以外は不変
ということだろう。
そして恐らくある規則というのは、
「両隣が粘菌セルかエサであれば粘菌セルは生き残り、それ以外は隣の粘菌セルに吸収される。」
じゃないだろうか。
…なんとなくできそうだ、さっそく実装してみよう。
- ameba.py
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 $ $$$$$$$$$$$$$$$$$
予想通りそれっぽいのができたぞ。
ただ、粘菌は環状になってる経路は最短距離で辿り着くようになってるよね。
実際の粘菌に近づけるにはもっと考えるところがありそう。