セル・オートマトン


プログラム


  1. 隣接セルの生命数

    def count_neighbor(data,i,j):
      count = 0
      for k in range(i-1,i+2):
        for l in range(j-1, j+2):
          if (0 <= k < len(data) and          # k が適切な範囲にある
              0 <= l < len(data[k])):         # l も適切な範囲にある
            count = count + data[k][l]
      return count - data[i][j]               # 自分を引く
    
  2. 1セルでの挙動

    def lg_rule(cur, neighbor):               # 1セルの挙動
                                              # cur: 現在の状況,neighbor: 隣接生命数
      if cur == 0:                            # 現在空白
        if neighbor == 3: 
          return 1                            # 誕生
        else:
          return 0
      else:                                   # 現在生命有り
        if neighbor == 2 or neighbor == 3:
          return 1                            # 生存
        else:
          return 0                            # 過疎か過密で死滅
    
  3. ライフゲーム1世代分

    import ita
    
    def lifegame_step(data):                  # ライフゲーム一世代分
      n = len(data)
      m = len(data[0])
      next = ita.array.make2d(n,m)            # 次世代
      for i in range(0,n):
        for j in range(0,m):
          c = count_neighbor(data,i,j)
          next[i][j] = lg_rule(data[i][j],c)  # 各点でルールに従い次世代を計算
      return next
    
  4. ライフゲーム複数世代

    def lifegame(data, n):                    # ライフゲームn世代分
      for i in range(0, n):
        data = lifegame_step(data)            # 1ステップずつ更新
      return data
    
  5. 世代変化をアニメで見よう

    def lifegame(data,steps):
      results = ita.array.make1d(steps)       # アニメ用の画像の列を用意
      for i in range(0,steps):
        results[i] = data                     # 各ステップの結果を格納
        data = lifegame_step(data)
      return results
    

2021年10月31日作成
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2021. All rights reserved.