1
0

More than 1 year has passed since last update.

なんとなく1dライフゲーム

Last updated at Posted at 2022-11-11

ライフゲームというのを作ったことがないので作ろうと思ったら、なんとなくかったるかったから、「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
a.png a.png a_15.png

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0