1970년경 영국의 한 수학자는 자신의 "Game of Life"를 만들었습니다. 이 게임은 기본적으로 생물학적 유기체 군체의 혼란스럽지만 패턴화된 성장을 묘사하는 일련의 규칙입니다. "Game of Life"는 "살아있는" 세포와 "죽은" 세포로 구성된 2차원 격자입니다.
인생 게임의 규칙
-
인구 과잉 :세포가 3개 이상의 살아있는 세포에 둘러싸여 있으면 세포가 죽습니다(꺼짐).
-
정적 :세포가 2~3개의 살아있는 세포로 둘러싸여 있으면 세포가 살아(on)합니다.
-
인구 부족 :세포가 2개 미만의 살아있는 세포로 둘러싸여 있으면 세포가 죽습니다(꺼짐).
-
복제 :죽은 세포가 정확히 3개의 세포로 둘러싸여 있으면 세포가 살아있는(켜짐) 상태가 됩니다.
다음 타임스탬프에서 셀이 죽습니다.
다음 타임스탬프에서 셀이 활성화됩니다.
셀이 활성 상태입니다.
셀이 죽었습니다.
위의 규칙을 순차적으로 적용하면 아름답고 예상치 못한 패턴을 얻을 수 있습니다.
구현 단계:
i. Initialise an empty universe ii. Fill the universe with the seed iii. Calculate if the current cell survives to the next timestamps, based on its neighbours iv. Repeat this survival function(like step-iii) over all the cells in the universe neighbours. v. Repeat steps iii-iv for the desired number of generations.
설치:
conways 삶의 게임을 만들려면 matplotlib 및 numpy 배열 라이브러리를 사용할 것입니다. numpy와 matplolib를 설치하려면 pip-
를 사용하세요.$pip install numpy, matplolib
conways 게임 오브 라이프를 구현하는 프로그램:
이제 위의 규칙 세트에 따라 프로그램을 작성할 시간입니다. 아래는 Game of Life를 구현하는 프로그램입니다.
#Import required library import numpy as np import matplotlib.pyplot as plt import argparse import time #------------------------------------------------------------------------- class Board(object): def __init__(self, size, seed = 'Random'): if seed == 'Random': self.state = np.random.randint(2, size = size) self.engine = Engine(self) self.iteration = 0 def animate(self): i = self.iteration im = None plt.title("Conway's Game of Life") while True: if i == 0: plt.ion() im = plt.imshow(self.state, vmin = 0, vmax = 2, cmap = plt.cm.gray) else: im.set_data(self.state) i += 1 self.engine.applyRules() print('Life Cycle: {} Birth: {} Survive: {}'.format(i, self.engine.nBirth, self.engine.nSurvive)) plt.pause(0.01) yield self #------------------------------------------------------------------------- class Engine(object): def __init__(self, board): self.state = board.state def countNeighbors(self): state = self.state n = (state[0:-2,0:-2] + state[0:-2,1:-1] + state[0:-2,2:] + state[1:-1,0:-2] + state[1:-1,2:] + state[2:,0:-2] + state[2:,1:-1] + state[2:,2:]) return n def applyRules(self): n = self.countNeighbors() state = self.state birth = (n == 3) & (state[1:-1,1:-1] == 0) survive = ((n == 2) | (n == 3)) & (state[1:-1,1:-1] == 1) state[...] = 0 state[1:-1,1:-1][birth | survive] = 1 nBirth = np.sum(birth) self.nBirth = nBirth nSurvive = np.sum(survive) self.nSurvive = nSurvive return state #------------------------------------------------------------------------- def main(): ap = argparse.ArgumentParser(add_help = False) # Intilialize Argument Parser ap.add_argument('-h', '--height', help = 'Board Height', default = 256) ap.add_argument('-w', '--width', help = 'Board Width', default = 256) args = vars(ap.parse_args()) # Gather Arguments bHeight = int(args['height']) bWidth = int(args['width']) board = Board((bHeight,bWidth)) for _ in board.animate(): pass #------------------------------------------------------------------------- if __name__ == '__main__': main()
출력
Console: Life Cycle: 1 Birth: 7166 Survive: 10621 Life Cycle: 2 Birth: 7930 Survive: 8409 Life Cycle: 3 Birth: 7574 Survive: 8756 Life Cycle: 4 Birth: 7114 Survive: 8406 Life Cycle: 5 Birth: 7005 Survive: 8126 Life Cycle: 6 Birth: 6644 Survive: 7926 Life Cycle: 7 Birth: 6266 Survive: 7711 Life Cycle: 8 Birth: 6132 Survive: 7427 Life Cycle: 9 Birth: 5957 Survive: 7322 Life Cycle: 10 Birth: 5769 Survive: 7290 Life Cycle: 11 Birth: 5585 Survive: 6937 Life Cycle: 12 Birth: 5381 Survive: 6791 Life Cycle: 13 Birth: 5208 Survive: 6686 Life Cycle: 14 Birth: 5063 Survive: 6563 …. …
위의 결과는 터미널에서 Ctrl-C를 눌러 프로그램을 중지할 때까지 계속 표시됩니다.
그래픽 디스플레이:
세포는 계속 변경되며 매우 아름다운 패턴을 시뮬레이션합니다.
설정을 변경하고 슬라이더 값을 변경하여 위의 서브플롯을 변경할 수 있습니다.