ライフゲームというのを作ったことがないので作ろうと思ったら、なんとなくかったるかったから、「1dならかったるさが少ない」と思って書いた。(これをライフゲームと言うのかすら不明)
tldr
カオスは多様性を生む。
ルール
- 状態数は30
- それぞれのセルは初期状態15を持つ。
- ユニバーサル確率Pがある。
- Pは時間を追うごとに標準偏差が増加する。
- Pの中心は、そのセルがこれまでにとってきた状態の平均をまず出し、window sizeの範囲の周囲のセルの平均を取る。
コード
import numpy as np
import pandas as pd
from PIL import Image, ImageDraw
from tqdm import tqdm
import matplotlib.pyplot as plt
images = []
width = 500
height = 10
init = 0.1
k = 30
step = 1000
ws = 1
length = width//height
colors = [x*(255//k)for x in range(k)]
prevs = [[k//2 for _ in range(length)]]
large_image = []
for i in tqdm(range(step)):
x = [int(a) for a in np.mean(prevs, axis=0)]
y = [abs(int(np.random.normal(np.mean(x[max(0,j-ws):j+(ws+1)]), scale=init*np.log(i+1)))) %k for j in range(length)]
prevs.append(y)
large_image.append([colors[y[i]] for i in range(length)])
images = []
for x in tqdm(prevs):
im = Image.new('RGB', (width, height), (255,255,255))
im = np.asarray(im)
for i in range(length):
im[:, i*height:(i+1)*height] = colors[x[i]]
img = Image.fromarray(np.uint8(im))
images.append(img)
images[0].save('test.gif', save_all=True, append_images=images, optimize=False, duration=40, loop=0)
a = np.array(large_image)
im = Image.fromarray(np.uint8(a))
im.save("a.png")
plt.plot(np.array(prevs)[:, 1])
plt.savefig("plot.png")
print(np.mean(pd.DataFrame(prevs).corr()))
2次元化
時間軸をつなげて全てが同時に起こっているように1次元を2次元化すると以下になる。(縦軸が時間)
コミュニケーションを行わせるセルの範囲でギザギザのパターンが変化する。
ws=1 | ws=3 | ws=15 |
---|---|---|