生命游戏代码_生命游戏 the Game of Life
引言
群居性昆虫是一个生命,鱼群、鸟群是一个生命,社会、城市是一个有机体,人类的语言是活的,人类的集体行为也是活的。这些复杂系统是如何设计出来的?世界上最著名的游戏之一,Game of Life生命游戏,为这些最神秘的问题提出了可能的解释——也许再复杂的生命,最初也不过是几条最简单的规则。本文从Game of Life的缘起说起,解释了它这几十年给予数学、计算机、哲学的启发,最后把它作为Python编程的练习。
“匈牙利唯一的天才”——冯诺依曼
我们的故事从上世纪40年代说起。彼时,第一台电子计算机的出现昭示了计算机领域风起云涌的时代,同时也开启了以信息控制技术为核心的人类第三次科技革命。冯诺依曼(John von Neumann)则是这段历史中绕不开的开山鼻祖。
能够作为电子计算机理论和博弈论的奠基者,用“天才”这个词再去形容冯诺依曼显得苍白。他是一个精力智力都充沛的命运宠儿。在他博士论文答辩时,导师们唯一的问题是:你今天的西装真挺括,是哪个裁缝做的?他喜欢在吵杂的环境里工作,在办公室里放进行曲会吵到隔壁的爱因斯坦。普林斯顿研究拜占庭历史的教授说,冯诺依曼在拜占庭史方面比自己更精通。
冯诺依曼以什么著名?一个显示屏可能都放不下(+68More)(来源:维基百科)
人是机器,还是机器是人
随着人工智能技术的发展,人与机器的边界越来越模糊。可以说,人工智能和对于生命边界的探索,从有了计算机这个概念开始就存在。冯诺依曼曾给生命下了一个定义。他认为,生命是一个符合图灵机(Turing Machine)的定义,同时可以复制自身的有机体[1]。他的朋友,同样是位家境殷实的高富帅,乌拉姆(Ulam)觉得这个问题非常有意思,提出了“细胞自动机(cellular automata)”的概念,用程序来模拟生长机制[2]。后来他们又各忙各的了,等到二十多年后,一生都在游戏的数学家约翰-康威(John Conway),以一种更有趣的形式发扬了“细胞自动机”,并阐释了冯诺依曼的定义是正确的。这个模型就是风靡全球的“Game of Life”, 生命游戏。
数学魔术师?♂——约翰-康威
看《科学美国人》《环球科学》的朋友们看到这个名字一定会觉得很亲切,很多人因为康威的“生命游戏”与计算结下了不解之缘。数学家团体对他有这样的评价,“他是一位多才多艺的数学家,他在构建和处理‘非主流’代数结构方面,以完全出乎意料的方式阐明了各种问题。他在有限群理论、结子理论、数理逻辑和博弈论方面做出了杰出的贡献。”不幸的是,在2020年4月11日,他因感染COVID-19与世长辞。而他创造的细胞生物就一直留在了二维方格的世界里。
John Conway
生命游戏 the Game of Life
生命游戏算得上是现在流行的真实世界模拟游戏的鼻祖(也在一定程度上启发了分形数学)。它用特别简单的规则产生出带有真实感的复杂性。康威想要通过这样一个有趣,过程不受外界控制的游戏,弄明白怎么样的结构可以保持稳定不消亡。生命游戏是对于由有机体构成的社会起伏的简化。经过深思熟虑后,康威非常节制地仅给出了四条最基础的游戏设定,以保证有机体的总数变化是变幻莫测的。其余,就看每一次游戏开始后的“造化”。
By Saisundar.s - Own work
生命游戏开始于一张二维的方格纸。初始细胞(有机体)每个占据一个方格。它们各自有活着或死去两种状态(live/dead). 每一个细胞是死是活只取决于周围的环境资源,也就是围绕着它的八个格子。根据规则,就像真实的细胞生长情况,在二维上的这些方格细胞如果太挤或者太稀疏就会死去,在最合适的群体密度时,它们生长得最好[3]。
生命游戏是一代计算机的记忆,就像21世纪的超级计算机的回忆一定有深度学习。生命游戏是世界上被玩得最多的电脑游戏之一。上世纪70年代正是微型计算机蓬勃发展的时候,不过当时的计算机还是不擅长图像处理和储存,于是生命游戏席卷了全球的计算机。在美国因为在工作时间偷偷盯着生命游戏发呆的总损失高达数百万美金。
不难想象为什么这个游戏那么受人欢迎,正如同变幻莫测的恒星轨迹让那么多《三体》书里书外的人惊心动魄:
1. 如此简单的初始条件却可以出现惊人的复杂行为;
2. 达到平衡的结构中有些非常有趣,有些甚至呈现周期性[4];
3. 对于计算机专业的人来说,生命游戏的价值在于它是图灵完备(Turing complete)的,也就是说,任何在计算机上可以由算法做到的,都可以在生命游戏里实现。
史蒂芬·霍金的《大设计》
为什么是我们?宇宙的存在有意义吗?智慧的起源为何?“大设计”曾是一个神学概念,指的是宇宙规律的背后有造物主式的安排。霍金的《大设计》在讨论了这些问题用了生命游戏的模型,“像生命游戏这样规则简单的东西能够创造出高度复杂的特征,智慧甚至可能从中诞生。而我们的脑中就有数千亿的细胞”。科学界的Google创始人Wolfram更是认为宇宙的本质就是计算,是一套简单的规则生成的复杂现象。更有意义的是,就算了解了一切规则,我们也无法提前得知这些规则可以演化成怎样的系统。这对我们有关键的启发,即使在完全绝对论的世界里,我们依然拥有自由意志。
credit to:Mike Zeng
代码实现?
生命游戏的思想上和图像上都有深入浅出特性,我们可以把它当作很好的编程入门问题。像Google这样的企业也会把它作为试题。我们接下来将如何用Python实现这个游戏。⌨️
下图是每一个细胞的生死规则。
入门级:
引入Convolution和Kernel:
SciPy中有一个对于诸如人脸识别等图像处理很重要的功能Convolution(卷积)[5]. Convolution作用在一个细胞和它的邻居上。
这九个方格的状态(location/weight)用kernel(核)来表示。
比如这个kernel表示了在0的周围8个临近的权重都是1。
在生命游戏中,neighborhood指的是细胞周围相邻的8个格子(这种neighborhood也称为Moore Neighborhood)
可以用以下代码替代上述代码:
“滑翔机”Glider?
很多人把滑翔机这个图案作为生命游戏的标示。滑翔机是一种处在稳定的振荡状态,同时会移动的结构。它在1970年被英国数学家Richard Guy发现。与英特网和Unix同时期的诞生使得他在一代黑客心里有着重要的地位。到现在它还会被当做这个团体的图腾。
我们得到如下的图像,这就是一个glider:
By Xerol at en.wikipedia
Father, give us courage to change what must be altered;
serenity to accept what cannot be helped;
and the insight to know the one from the other.
惠我以安宁,忍所当忍;
赐我以勇毅,为所当为;
更赐我以智慧,将两者区分。
雷茵霍尔德·尼布尔(Reinhold Niebuhr)
THE SUN NEWS SYNDICATION
注释
[1]图灵机(Turing Machine)
图灵机是一个真实计算机的模型。图灵机可以完成所有计算机可以完成的任务。
[2]细胞自动机(cellular automata)
细胞自动机(CA)是一种用来思考复杂系统的极简化计算模型。人类对于智慧生物的好奇与仿真的热情源源不断地推动着科学技术的发展,不论是细胞自动机,还是飞机,人工智能,都是从真实的复杂系统中抽象出最核心的要素,再通过一定的逻辑重构。
[3]具体规则
1 “总数过少”:任何活细胞如果活邻居少于2个,则死掉。
2 “正常”:任何活细胞如果活邻居为2个或3个,则继续活。
3 “总数过多”:任何活细胞如果活邻居大于3个,则死掉。
4 “繁殖”:任何死细胞如果活邻居正好是3个,则活过来。
[4]有三种稳定态:静止态(Still Life),震荡态(Oscillator)和以Glider为代表的移动震荡态?
[5] 比如知名的卷积神经网络(Convolutional Neural Network, CNN)的核心概念就是它的人工神经元可以响应一部分覆盖范围内的周围单元(neighborhood),对于大型图像处理有出色表现。
参考文献和衍生阅读
1.这个游戏没有玩家,为何在学术圈火了半个世纪?时间: 2017年01月06日 | 作者: 徐寒易 | 来源: 环球科学
https://huanqiukexue.com/a/qianyan/xinxi__nenyuan/2017/0106/26910.html
2.Introduction to the Theory of Computation3rd - Michael Sipser
3.https://web.stanford.edu/class/sts145/Library/life.pdf
4.https://commons.wikimedia.org/w/index.php?curid=73877448
5.https://leetcode-cn.com/problems/game-of-life
6.斯蒂芬·沃尔夫勒姆(Wolfram):宇宙的本质是计算
https://m.guokr.com/article/126181
7. https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
8. 《The Lives of a Cell》
代码参考:
https://github.com/madison-python/think-complexity/blob/master/game-of-life.ipynb
https://github.com/madison-python/think-complexity/blob/master/thinkcomplexity/game_of_life.py
https://leetcode-cn.com/problems/game-of-life/
生命游戏代码_生命游戏 the Game of Life相关推荐
- lua游戏代码_在游戏中如何使用LUA脚本语言
当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息. 或许你认为这样就足够了,为什 ...
- java猜拳游戏代码_猜拳游戏 - java代码库 - 云代码
[java]代码库public class Computer { String name; int score; public int showfist(){ int quan; quan=(int) ...
- java语言麻将游戏代码_麻将游戏算法深入解析及实现代码
麻将游戏算法深入解析及实现代码 这两天为了工具箱的完善,整理了这些年引擎开发的一些资料,无意中发现06年写的一个麻将算法,编译运行了一下,还是有点意思的,拿出来整理一下分享给大家. 麻将是一种大家最喜 ...
- c语言心形编程代码_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...
经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...
- 50行的python游戏代码_使用50行Python教AI玩运杆游戏
编译:yxy 出品:ATYUN订阅号 嗨,大家好!今天我想展示如何使用50行Python代码教一台机器来平衡杆!我们将使用标准的OpenAI Gym作为我们的测试环境,并只使用numpy创建我们的智能 ...
- css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏
css游戏代码 by kushagra gour 由kushagra gour 介绍CSSBattle-第一个CSS代码搜寻游戏 (Introducing CSSBattle - the first ...
- python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- html游戏代码_实现了代码自动生成,开发效率妥妥的提升,升职加薪跟上
目录 1.应用场景: 2.实战 1.环境搭建 2.代码 3.运行结果 3.官方网站 4.总结: 关注我公众号[香菜聊游戏] 序言:继续接上篇的live template ,idea骚操作虽然好,但是使 ...
- 记事本贪吃蛇游戏代码_如何用Python10分钟绘制贪吃蛇小游戏?
贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩.玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长.随着蛇的身体变长,游戏的难度就会 ...
最新文章
- 分布式事物-2pc和3pc区别
- 转发,脑机接口领域又一重要成果!
- Python高级网络编程系列之第二篇
- 【Qt】QModbusDeviceIdentification类
- python学习-代码调试(通过print调试、通过pdb调试、通过编译器调试(断点调试))
- Java最佳实践–字符串性能和精确字符串匹配
- python3 面向对象编程 下载_Python3(7) Python 面向对象编程
- java 二叉排序_java实现二叉排序树
- 关于SpringMVC中text/plain的编码导致的乱码问题解决方法
- 机器人学导论 二、正运动学,MDH法
- 计算几何的模板(大神整理)
- Express中间件
- 计算机输入法在桌面显示不出来的,电脑开机无法正常显示桌面只能看到输入法如何解决...
- 水果店圈子:水果店坏水果应该怎么处理,水果店卖剩下的水果如何处理
- nexus3.x下载 3.18.1(maven 私服)
- 指针地址左移右移的代码实例
- JDK1.8之前造成HashMap死链问题
- 媒体:中国大学不应培养“精致的利己主义者”
- 关于线的做法T568A与T568B网络故障
- iOS 蓝牙 Corebluetooth
热门文章
- 核新同花顺java开发_核新同花顺数据结构
- eclipse设置字体大小和main快捷键
- 微服务(Microservices)——Martin Flower【翻译】
- electron photobooth.js
- 如何在神箭手上导出数据?
- java中的自动装箱和自动拆箱
- mac下配置svn服务器详解及用户的权限管理(亲测)
- 第九章 动态规划-1262:【例9.6】挖地雷
- JVM致命错误日志(hs_err_pid14268.log)分析
- ExcelHelper 帮助类-可以直接保存到共享文件夹