นักคณิตศาสตร์ชาวอังกฤษในราวปี 1970 ได้สร้าง "เกมแห่งชีวิต" ของเขาขึ้น ซึ่งโดยพื้นฐานแล้วเป็นชุดของกฎเกณฑ์ที่พรรณนาถึงความโกลาหลแต่เป็นลวดลายของการเติบโตของอาณานิคมของสิ่งมีชีวิตทางชีววิทยา "เกมแห่งชีวิต" เป็นตารางสองมิติที่ประกอบด้วยเซลล์ "ที่มีชีวิต" และ "เซลล์ที่ตายแล้ว"
กฎของเกมแห่งชีวิต
-
มีประชากรมากเกินไป :เซลล์หนึ่งจะตาย (ปิด) หากถูกล้อมรอบด้วยเซลล์ที่มีชีวิตมากกว่าสามเซลล์
-
คงที่ :เซลล์จะมีชีวิตอยู่ (เปิด) หากถูกล้อมรอบด้วยเซลล์ที่มีชีวิตสองหรือสามเซลล์
-
ประชากรน้อย :เซลล์หนึ่งจะตาย (ปิด) หากเซลล์นั้นล้อมรอบด้วยเซลล์ที่มีชีวิตน้อยกว่า 2 เซลล์
-
การสืบพันธุ์ :เซลล์จะกลายเป็นชีวิต (เปิด) หากเซลล์ที่ตายแล้วล้อมรอบด้วยสามเซลล์เท่านั้น
เซลล์กำลังจะตายในการประทับเวลาถัดไป
เซลล์จะพร้อมใช้งานในการประทับเวลาถัดไป
เซลล์ยังมีชีวิตอยู่
เซลล์ตายแล้ว
เมื่อใช้ชุดของกฎด้านบนตามลำดับ เราจะได้รูปแบบที่สวยงามและคาดไม่ถึง
ขั้นตอนการใช้งาน:
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.
การติดตั้ง:
เพื่อสร้างเกมคอนเวย์แห่งชีวิต เราจะใช้ไลบรารี matplotlib และ numpy arrays ในการติดตั้ง numpy และ matplolib ให้ใช้ pip-
$pip install numpy, matplolib
โปรแกรมที่จะใช้คอนเวย์เกมแห่งชีวิต:
ตอนนี้ได้เวลาเขียนโปรแกรมตามกฎที่เราตั้งไว้ข้างต้นแล้ว ด้านล่างนี้คือโปรแกรมสำหรับใช้งานเกมแห่งชีวิต
#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 ในเทอร์มินัลเพื่อหยุดโปรแกรม
การแสดงผลแบบกราฟิก:
เซลล์จะเปลี่ยนแปลงไปเรื่อยๆ และจะจำลองลวดลายที่สวยงามมาก
คุณสามารถเปลี่ยนโครงเรื่องย่อยด้านบนได้โดยเปลี่ยนการตั้งค่าและแก้ไขค่าตัวเลื่อน: