Một nhà toán học người Anh vào khoảng năm 1970 đã tạo ra "Trò chơi của cuộc sống" - về cơ bản là một tập hợp các quy tắc mô tả sự phát triển hỗn loạn nhưng có khuôn mẫu của một quần thể sinh vật. "Trò chơi của cuộc sống" là một lưới hai chiều bao gồm các ô "sống" và "chết".
Quy tắc trò chơi của cuộc sống
-
Dân số quá đông :Một tế bào chết (tắt) nếu xung quanh nó có nhiều hơn ba tế bào sống.
-
Tĩnh :Một tế bào sống (bật) nếu nó được bao quanh bởi hai hoặc ba tế bào sống.
-
Dân số thấp :Một tế bào chết (tắt) nếu xung quanh nó có ít hơn hai tế bào sống.
-
Sao chép :Một ô trở nên sống (bật) nếu một ô chết được bao quanh bởi chính xác ba ô.
Tế bào sẽ chết trong dấu thời gian tiếp theo
Ô sẽ tồn tại trong dấu thời gian tiếp theo
Ô còn sống
Tế bào đã chết
Bằng cách áp dụng bộ quy tắc trên theo các bước tuần tự, chúng tôi sẽ có được những mẫu đẹp và bất ngờ.
Các bước thực hiện:
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.
Cài đặt:
Để tạo ra trò chơi conways của cuộc sống, chúng tôi sẽ sử dụng thư viện mảng matplotlib và numpy. Để cài đặt numpy và matplolib, hãy sử dụng pip-
$pip install numpy, matplolib
Chương trình thực hiện trò chơi conways của cuộc sống:
Bây giờ đã đến lúc viết chương trình theo bộ quy tắc ở trên của chúng tôi. Dưới đây là chương trình thực hiện trò chơi của cuộc sống,
#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()
Đầu ra
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 …. …
Các kết quả trên sẽ tiếp tục xuất hiện cho đến khi chúng ta nhấn Ctrl-C trong thiết bị đầu cuối để dừng chương trình.
Hiển thị đồ họa:
Các ô sẽ tiếp tục thay đổi và sẽ mô phỏng các mô hình rất đẹp.
Bạn có thể thay đổi ô con ở trên bằng cách thay đổi cài đặt và thay đổi giá trị thanh trượt: