セルオートマトンは、セル、セル状態、および状態更新ルールで構成されるオートマトンです。最も有名なセルオートマトンは、1970年に英国の数学者ジョンによって提案された生命のゲームです。そのルールは次のとおりです。
- 周囲のセルが0または1の場合、その状態は無効になります。
- 生き残った細胞が2つある場合は、そのままにしておきます。
- 周囲に3つの生き残った細胞があるとき、その状態は生きています。
- 生き残った細胞が4つあると、その状態は死んでしまいます。
簡単な例:
下の図に示すセルでは、各セルの色が異なる状態を示しています(黄色は生きており、他のセルは死んでいます)。
反復後、次のようになります(これは標準化されたQRコードであり、トレースしてそれが何であるかを確認できます)。
上記の手順は次のとおりです。
import cv2
img = cv2.imread("/home/toby/Pictures/gol.png",cv2.IMREAD_GRAYSCALE)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
rimg = cv2.resize(thresh1, (27,27))
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
nimg = np.array(rimg/255)
def round_sum(i,j):
start_i = max(0, i-1)
end_i = min(27, i+2)
start_j = max(0, j-1)
end_j = min(27, j+2)
s = np.sum(nimg[start_i:end_i,start_j:end_j]) - nimg[i,j]
return s
plt.imshow(nimg)
plt.show()
temp_nimg = np.zeros((27,27))
for i in range(27):
for j in range(27):
s = round_sum(i,j)
if s >= 4:
temp_nimg[i,j] = 0
if s == 3:
temp_nimg[i,j] = 1
if s == 2:
temp_nimg[i,j] = nimg[i,j]
if s < 2:
temp_nimg[i,j] = 0
plt.imshow(temp_nimg)
plt.show()