Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
约翰·康威、生命游戏与涌现
中文
notebook
python
中文notebookpython
Roger
发布于 2023-07-30
推荐镜像 :bohrium-notebook:05-31
推荐机型 :c2_m4_cpu
赞 12
1
约翰·康威和《生命游戏》
涌现
动手实现一个康威生命游戏
结语
参考资料

©️ Copyright 2023 @ Authors
作者: 罗杰📨
日期:2023-07-30
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:点击上方的 开始连接 按钮即可开始。

Open In Bohrium
代码
文本

约翰·康威和《生命游戏》

代码
文本

约翰·康威(John H. Conway), 英国著名数学家,一生发明创造极多,其中最著名的是他在1970年缔造的《生命游戏》。它是如此令人着迷和发人深思。

代码
文本

在一个N乘N的方格矩阵中,每一个方格都是一个细胞。每个细胞有两种状态:存活或死亡。每个细胞的状态取决于周围细胞的状态。其规则非常简单,而且与自然界很多底层规则类似:

  • 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
  • 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
  • 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
  • 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)
代码
文本

涌现

代码
文本

《生命游戏》这个计算机程序之所以如此知名和耐人寻味,原因之一是它模拟了和揭示了涌现现象。

涌现无疑是复杂系统诸多现象中最神秘莫测的一个。从鸟群聚集、萤火虫同步、蚁群生活、蜜蜂舞蹈,到意识产生,生命进化,经济系统,乃至宇宙起源。我们生活在一个“涌现”的世界中。所谓的涌现,是指复杂系统在宏观所展现出来的,无法归约到微观的特性或规律。新兴的因果涌现理论有望为量化多尺度复杂系统中的涌现现象提供强大工具。这个游戏底层的逻辑简单到任何目的性和指向性。 但是这些没有任何意识的细胞,在这个规则的指引下,展现出了指向性。比如其中有一个最简单的组合,叫滑翔机。经过多次简单规则下的迭代,程序会出现由四个基本形状组成的稳定循环,并且一直朝着一个方向前进的现象。 形似一个滑翔机。你稍后可以在本 Notebook 代码中,将 glider 参数设为 True 来观察。也可以将 gosper 设为 True,去观察滑翔机的诞生过程。

代码
文本

滑翔机的例子虽然简单,但是已经表现出典型的涌现特性。滑翔机并不是由稳定的若干个细胞组成,组成的细胞实际上不断地被创建和死亡,但滑翔机的形态却相当地的稳定。如果关注康威生命游戏,你就会知道,世界上还有许多人依然在迭代着不同的生命游戏图像。包括:

  • 飞船(Spaceship),飞船是在生命游戏中移动的、不断发生形变的结构。它最早由约翰·康威发现,并且有许多种不同大小的飞船。
  • 炮台(Gosper Glider Gun):炮台是一种可以不断产生滑翔机(Glider)的结构。这种结构由比尔·高斯帕发明,它可以产生几乎任何其他的生命游戏结构。
  • 异常学者(Acorn):异常学者是一种可以自我修复并能够繁殖的结构。它最早由查尔斯·C·克莱恩发现,由它演变出许多其他的结构。
  • 蜂窝(Honeycomb):蜂窝是一种由相邻的六边形构成的结构。它非常稳定,并且可以用它来构建其他的生命游戏结构。
  • 枪手(Gun):枪手是一种可以发射滑翔机的结构。它可以由不同种类的结构构成,如简单的轻型飞船和蜂窝等。
  • 五十步炮(Fifty Guns):五十步炮是一种可以发射Gosper Glider Gun的结构。它最早由Bill Gosper 发现,并且用于生成其他结构。
  • 模拟器(Simkin Glider Gun):模拟器是一种可以自我复制并且还可以发射滑翔机的结构。它得名于发明者的女儿Simone Kissner。
  • 银河(Galaxies):银河是一种随机生成的结构,在其中有很多滑翔机和其他的生命游戏结构。
  • 海马(Seahorse):海马是一种可以移动的结构,并且可以被用作其他生命游戏的组件。
  • 红蓝鱼雷(Red and Blue Fishhook):红蓝鱼雷是一种可以发射两种不同类型的滑翔机的结构。它得名于其形状类似于鱼钩的外形。

现在著名的生命游戏图形数不胜数,这仅仅是其中最著名的一小部分。这些形状可以相互组合并不断演变。这使得生命游戏成为了研究自组织、自复制和自我修复的理想模型。每个微观粒子只根据周围8个粒子的情况,做非常简单的决定,却诞生出纷繁复杂的形态。

生命游戏也出现了很多变种,也就是修改了其中的规则,但依然保持了规则的简单性。微观遵循简单的逻辑,而宏观上会表现出更加纷繁复杂的现象。

下面我们动手实现一个生命游戏。

代码
文本

动手实现一个康威生命游戏

代码
文本

导入必要的程序包

代码
文本
[ ]
# Python code to implement Conway's Game Of Life
from ipywidgets import interact,widgets
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import os
from IPython.display import Image
from IPython.display import display
import time


# setting up the values for the grid
ON = 255
OFF = 0
vals = [ON, OFF]
# Since Bohrium Notebook cannot display animation
# We use a gif file to display the result
gif=f'gameoflife.gif'

代码
文本

根据输入的游戏二位网格大小,生成一个随机数网格

代码
文本
[2]
def randomGrid(N):
"""returns a grid of NxN random values"""
return np.random.choice(vals, N*N, p=[0.2, 0.8]).reshape(N, N)
代码
文本

设置滑翔机图案作为生命游戏的开始图案

代码
文本
[3]
def addGlider(i, j, grid):
"""adds a glider with top left cell at (i, j)"""
glider = np.array([[0, 0, 255],
[255, 0, 255],
[0, 255, 255]])
grid[i:i+3, j:j+3] = glider
代码
文本

设置Gosper滑翔机图案,该图案能够稳定的产生滑翔机

代码
文本
[4]
def addGosperGliderGun(i, j, grid):
"""adds a Gosper Glider Gun with top left
cell at (i, j)"""
gun = np.zeros(11*38).reshape(11, 38)
gun[5][1] = gun[5][2] = ON
gun[6][1] = gun[6][2] = ON
gun[3][13] = gun[3][14] = ON
gun[4][12] = gun[4][16] = ON
gun[5][11] = gun[5][17] = ON
gun[6][11] = gun[6][15] = gun[6][17] = gun[6][18] = ON
gun[7][11] = gun[7][17] = ON
gun[8][12] = gun[8][16] = ON
gun[9][13] = gun[9][14] = ON
gun[1][25] = ON
gun[2][23] = gun[2][25] = ON
gun[3][21] = gun[3][22] = ON
gun[4][21] = gun[4][22] = ON
gun[5][21] = gun[5][22] = ON
gun[6][23] = gun[6][25] = ON
gun[7][25] = ON
gun[3][35] = gun[3][36] = ON
gun[4][35] = gun[4][36] = ON
grid[i:i+11, j:j+38] = gun
代码
文本

这是实施康威生命游戏规则的关键函数,既两个时间上相邻图案的变化量

代码
文本
[5]
def update(frameNum,img, grid, N):
# copy grid since we require 8 neighbors
# for calculation and we go line by line
newGrid = grid.copy()
for i in range(N):
for j in range(N):
# compute 8-neighbor sum
# using toroidal boundary conditions - x and y wrap around
# so that the simulation takes place on a toroidal surface.
total = int((grid[i, (j-1)%N] + grid[i, (j+1)%N] +
grid[(i-1)%N, j] + grid[(i+1)%N, j] +
grid[(i-1)%N, (j-1)%N] + grid[(i-1)%N, (j+1)%N] +
grid[(i+1)%N, (j-1)%N] + grid[(i+1)%N, (j+1)%N])/255)
# apply Conway's rules
if grid[i, j] == ON:
if (total < 2) or (total > 3):
newGrid[i, j] = OFF
else:
if total == 3:
newGrid[i, j] = ON
# update data
img.set_data(newGrid)
grid[:] = newGrid[:]
return img
代码
文本

康威生命游戏的主函数

代码
文本
[6]
#conway() function
def conway(size,glider=False,gosper=False,updateInterval=50,frames=500):
# set grid size
N = size

# declare grid
grid = np.array([])
# check if "glider" demo flag is specified
if glider:
grid = np.zeros(N*N).reshape(N, N)
addGlider(1, 1, grid)
elif gosper:
grid = np.zeros(N*N).reshape(N, N)
addGosperGliderGun(10, 10, grid)
else: # populate grid with random on/off -
# more off than on
grid = randomGrid(N)
# set up animation
fig, ax = plt.subplots()
img = ax.imshow(grid, interpolation='nearest')
anim = animation.FuncAnimation(fig, update, fargs=(img, grid, N),
frames=frames,
interval=updateInterval)
t1 = time.time()
print("Saving gif file. It may take 1 or 2 minutes...")
# set output file

if os.path.exists(gif):
os.remove(gif)
anim.save(gif, fps=30)
t2 = time.time()
# display GIF image
print("Time spent: {:.2f} seconds".format(t2 - t1))
display(Image(gif))
# plt.show() # Displaying animation is not supported in Bohrium notebook so far
代码
文本
[7]
conway(size=100, # the size of the life game
glider=False, # if specify a glider pattern
gosper=False, # if specify a gosper pattern
updateInterval=50, # the update interval between two frame
frames=500) # how many frames will be saved in the gif files, the bigger the longer
MovieWriter ffmpeg unavailable; using Pillow instead.
Saving gif file. It may take 1 or 2 minutes...
Time Spent: 53.17 Seconds
代码
文本

结语

希望读到此篇Notebook的读者,能够从康威的生命游戏中,了解到涌现过程在我们的周围无时无刻不在发生。借用约翰·霍兰德在著作《涌现:从混沌到秩序》一书中对涌现总结的八个要点,再加深一下认识:

  • 涌现现象出现在生成系统之中
  • 在这样的生成系统之中,整体大于各部分之和
  • 生成系统中,一种典型的涌现现象是,组成部分不断改变的稳定模式
  • 涌现现象不断出来的功能是由其所处的环境决定的
  • 随着稳定模式的增加,模式间的相互作用带来的约束和检验使得系统的功能也在增强
  • 稳定模式通常满足宏观规律
  • 存在差别的稳定性是那些产生了涌现现象的规律的典型结果
  • 更高层次的生成过程可以由稳定性的强化而产生

对涌现的认识和理解,不但有利于科技专家找寻正确的技术创新方法,也有利于管理人员设定正确的宏观经济发展战略,还有利于企业经营者和创业者摸索正确的企业发展之路。

代码
文本

参考资料

  1. https://playgameoflife.com/
  2. 约翰·霍兰德《涌现:从混沌到秩序》,2006,上海世纪出版集团
  3. 肯尼斯·斯坦利,乔尔·雷曼 《为什么伟大不能被计划》,2023,中译出版社
代码
文本
中文
notebook
python
中文notebookpython
已赞12
本文被以下合集收录
测试合集文章列表100篇
xingyanshi@dp.tech很长的名字xingyanshi@dp.tech很长的名字很长的
更新于 2024-08-04
104 篇2 人关注
physics
sai_xu
更新于 2024-03-16
10 篇0 人关注
推荐阅读
公开
一篇带你了解 Bohrium Notebook 的使用
Bohrium 帮助文档
Bohrium 帮助文档
Hui_Zhou
发布于 2023-11-24
3 赞
公开
Play Around RNA Secondary Structure: Prediction and Visualization of RNA
RNA
RNA
Bohrium小助手
发布于 2023-09-26
1 转存文件