ライフゲーム
scipy.signal.convolve2d()は使わずにnumpy.convolve()でムーア近傍の和を求めてみる。numpy.convolve()は1次元にしか使えないので次のように計算する。 import numpy as np from scipy.signal import convolve2d def moore(mat): # 現世代排列を取り込んで…
描画の更新が遅いという難点はあるが現時点で固めておく。 import numpy as np import matplotlib.pyplot as plt from scipy.signal import convolve2d from matplotlib.animation import FuncAnimation class LifeGame: # 引数は左から(2次元排列, (表示領…
matplotlib.animation.FuncAnimation()を使ってみる。下の例はライフゲームではない。 #%matplotlib nbagg import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # この函数を一定時間ごとに繰り返し実行す…
import numpy as np import matplotlib.pyplot as plt # この生死排列を表示してみる。 glider = np.array([[0,0,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [0,1,1,1,0,0,0], [0,0,0,0,0,0,0]], dtype=np.uint8) numOfRows, numOfCols = glider.shape …
基本的にはmatplotlib.pyplot.imshow(2次元排列)の1行だけでよい。 import numpy as np import matplotlib.pyplot as plt # この生死排列を表示してみる。 glider = np.array([[0,0,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [0,1,1,1,0,0,0], [0,0,0,…
実質1行だけで現世代から次世代へ変換できる。 import numpy as np from scipy.signal import convolve2d class LifeGame: def __init__(self, mat): self.mat = np.asarray(mat, dtype="uint8") # 現世代排列を取り込んで、念のためndarrayにしておく。 sel…
scipy.signal.convolve2d()のboundary=オプションで境界条件を指定すればわざわざ一回り大きい排列を作る必要はなかった。 import numpy as np from scipy.signal import convolve2d # この排列aを現世代排列とする。 numOfRows, numOfCols = 5, 10 a = np.r…
畳み込み演算の函数がいろいろあるのでそれを利用する。ここではscipy.signal.convolve()を使ってみる。 import numpy as np from scipy.signal import convolve def toTorus(mat, matTorused): mat = np.array(mat , dtype="uint8") matTorused = np.array(…
import numpy as np # この排列をトーラス接続にする numOfRows, numOfCol = 3, 5 a = np.arange(numOfRows * numOfCol).reshape(numOfRows, numOfCol).astype("uint16") # 上下左右をそれぞれスタックし合う方法 def toTorus1(mat): mat = np.array(mat) ma…
ライフ・ゲームの初代行列をフリーハンドで設定する。 local n = 1 -- 世代番号の初期値 local stringPen = "PEN UP" local stringEraser = "ERASER UP" local posX, posY = 0, 0 local posC, posR = 1, 1 local penDown = false local eraserDown = false l…
初代行列をフリーハンドで設定する。 local stringPen = "PEN UP" local stringEraser = "ERASER UP" local posX, posY = 0, 0 local posC, posR = 1, 1 local penDown = false local eraserDown = false -- 行列のサイズを決める。 local rdim, cdim = 7, 7…
212 行 × 212 列: -- 世代番号の初期値 local n = 1 -- セルの一辺の長さを決める。 local sideLen = 1 -- ここに初代行列を入れる。 local mat_now = -- 例: --[[ {{1,1,1}, {1,1,1}, {1,1,1}} --]] --行数、列数を取得する。 local rdim, cdim = #mat_no…
計算手順は変えずに lua だけで実装した。 エミュレーターではかなり速くなったがハンドヘルドではあいかわらず遅い。 100 行 × 100 列(初代行列はここから拝借した): 106 行 × 159 列(初代行列は乱数): 212 行 × 318 列(ハンドヘルド・ビューの 1 画…
nspire で作ったユーザー定義函数と lua とを組み合わせる。 エミュレーターでわずか 23 行 × 35 列を 1 世代を更新するのに 0.1 秒もかかっている。 ハンドヘルド本体では遅すぎて使いものにならない。 こんなアルゴリズムではだめだということである。 Def…
行列の要素の値が 1 だったらその位置に色を塗る。行列は nspire の乱数函数で用意した。 local sideLen = 10 local mat = var.recall("mat") function on.paint(gc) for r = 1, #mat do for c = 1, #mat[1] do if mat[r][c] == 1 then gc:fillRect((c - 1) …
ルール表に従って行列を書き換える。引数は、n 世代行列(mat)とルール行列(mat_rule)。 返値は、n + 1 世代行列。 ルール表: 0 0 0 1 0 0 0 0 0 現在死セルの次の状態 0 0 1 1 0 0 0 0 0 現在生セルの次の状態 0 1 2 3 4 5 6 7 8 ムーア近傍の合計値 グ…
最外周以外のすべてのセルのムーア近傍(Moore neighborhood)の和を求める。 最外周のセルを削除してから返す。 Define moore_sum(mat_torus)= Func :©最外周以外のすべてのセルのムーア近傍の和を求める。 :Local rdim,cdim,mat_temp,r,c,temp : :©ムーア…
境界条件は周期境界条件(torus)とする。 以下のプログラムで上下左右のセルをコピーし合う。 Define conv_to_torus(mat)= Func :©行列の上下左右をつなぐ。 :Local rdim,cdim,mat_top,mat_bottom,mat_temp,mat_left,mat_right : :©上端行を下端行の下に挿…