LoginSignup
3
3

More than 3 years have passed since last update.

一次元セルオートマトン

Posted at

一次元セルオートマトンの実装

セルオートマトンを調べる機会があり、ちょっと実装してみました。
備忘録として

その際に参考にしたサイトがこちら

pygameを使用して描画したりと、コードを部分的に変更しています。
ソースコードは以下の通りです。

cellular_automaton.py
# coding:utf-8
import pygame


def dec2bin(n):
    # 10進数を2進数の01リストに変換
    bit_list = []
    for i in range(8):
        bit_list.append(n % 2)
        n = int(n // 2)

    return bit_list


def ca(width, height, rulenum):
    # 1次元セルオートマトンの図を描画
    results = []

    # 初期状態設定
    first_row = [0] * width
    list_id = int(width // 2)
    first_row[list_id] = 1
    results.append(first_row)

    # ルールの番号を2進数に変換
    rule = dec2bin(rulenum)

    for i in range(height - 1):
        old_row = results[-1]
        new_row = []
        for j in range(width):
            # 前後のインデックスの状態を参照し次のループの状態を決定する。
            n = int(4 * old_row[(j-1) % width] + 2 * old_row[j] + old_row[(j+1) % width])
            new_row.append(rule[n])
        results.append(new_row)
    return results


if __name__ == "__main__":
    width = 300
    height = 100
    rule_num = 150  # ここのルールを255までの値で指定することで様々なパターンが出力されます。
    pygame.init()
    screen = pygame.display.set_mode((width*2, height*2))
    pygame.display.set_caption("Cellular Automaton {}".format(rule_num))

    results = ca(width, height, rule_num)

    screen.fill((0, 0, 0,))
    for i in range(len(results)):
        for j in range(len(results[i])):
            if results[i][j] == 0:
                pygame.draw.rect(screen, (255, 255, 255), (j*2, i*2, 2, 2))
            else:
                pass
        pygame.display.update()

    # 一時的に処理を停止する。
    pygame.time.wait(10000)

    # 制作したイメージをPNGに変換し保存。cellular_automaton.pyと同じディレクトリにimgが出力される。
    pygame.image.save(screen, 'pic.png')

pic.png

このように出力されます。
今後は二次元、三次元も実装していこうと考えてます。

3
3
2

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
3
3