生命游戏和细胞自动机的学习笔记

Last updated: 23rd. July, 2012

野比 2012 版权所有

(本文为学习笔记,知识浅薄。我会将学习中的实验记录和心得记录在此。)

欢迎对这方面感兴趣的爱好者一起研究。

寻求技术指导。

联系QQ:1429013154

我一直对人工智能很感兴趣,苦于数学基础太差,很多理论方面的东西理解起来十分吃力。最近又翻出以前的学习目标:人工生命。名字挺悬乎,其实很多人都曾和它有过交集,就算没有用到它进化出的好物种——智能机器人,至少也应该听过甚至中过它进化的恶劣物种——蠕虫病毒。

说起人工生命和计算机,就要从计算机历史的最开始说起。因为计算机之父冯·诺依曼和他的小组成员勃克斯分别撰写过题为《自我繁衍的自动机理论》和《细胞自动机论文集》的文章,堪称人工生命最初的狂人。

背景故事就不说了,记在这里。

人工生命之父——Chris Langton

生命游戏百科

框架搭建

目前框架已搭建好。C#编写,.NET 2.0,世界大小30x40。

我的架构和经典架构不同。下面把世界法则对比一下。

经典世界法则如下:

  • 生命视野为1(8格)
  • 生命承受力为3
  • 生命在3时复活
  • 生命在2时不变
  • 其余情况死亡

如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变。在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)。

我的世界法则如下:

  • 生命只有上帝创建
  • 生命视野为1(8格)
  • 生命承受力3(否则死亡)
  • 生命不可复活

由于经典法则中所有生命都有机会复活,所以在网上下载的经典实现和绝大部分爱好者实现里,世界都是被填满了生命的,通过颜色等「隐藏」死亡的生命,使之「看起来」消失了。我打算设计的是一个模仿真实的世界法则,所以世界里该空白的地方就不能有生命存在。

这是框架截图。

下一步的工作

  • 自然随机数(natrual simulation)
  • 研究并修改世界法则
  • 增加食物概念,生命存活由健康度决定
  • 邻居可以「杀死」受害者
  • 每个生命增加动态属性列表
  • 属性相近的生命有类似的行为
  • 属性相近的生命会互相靠拢
  • 修改框架,使法则脚本化

需要请教和研究的知识点

  • 怎么实现记忆(先实现1bit)
  • 怎么引入进化(最简单的神经网络学习)
  • 怎么实现脚本机制(纠结C#还是Lua)
  • 简单易行的插件机制(SD架构?MEF?)
  • Rule Engine

网上的资源

一个用C#实现的标准规则生命游戏([email protected])

Langton蚂蚁的一个粗略实现([email protected])

进展情况

28 May, 2012

1.今天尝试将世界地图封装为控件,失败了。功能上实现了,但原来2~4%的CPU负荷直接飙升到了25~30%,开销相当大。具体原因似乎是嵌套调用和太多参数传递的问题。而且地图控件的架构设计也很浪费资源,为每个地图点缓存了一个Color。此问题留待以后解决。

2.在生物逻辑上加入了自然老化、休息和饥饿捕食的规则。使用了仿真自然随机数发生器来模拟一切和自然概率(不像System.Random那么突变)有关的现象,如攻击判定、进攻或逃跑等。

图中Legend如下

健康

亚健康

饥饿

Starving

濒死

迈向生命的第一缕曙光

在增加了健康因素,实验体会主动觅食,接近并攻击较弱的实验体。

在进化的过程中,出现了一些有意思的现象。

有的细胞在非常健康(HP>80+)的时候,也会追着弱小的实验体「咬」,杀死实验体后,HP增加不到5点,而代码中,标称值是在HP<70时才开始觅食,且会整个吃掉尸体。

有的实验体甚至有了那么一点点的「智力」(或者说仅仅是种本能),比如这个第6392代的家伙,它只要吃饱了,就会「绕场一周」,而且总是往墙上撞,企图逃跑。

随机数和记忆的加入,立刻让世界变得绚丽,变化多端。

23rd. July, 2012更新

CSDN网友nanqi0506(神棍,QQ:275096967)制作了一个他的版本:《LifeGame》。简要摘录如下,详情请查阅原文

细胞属性

暂时只使用基本的力量、敏捷、智力,属性影响细胞各个方面。

细胞动作

细胞大多时间在漫步(Wander),但是在有其他细胞攻击自身时,细胞会出于本能的进行反击,由于没有智商(能力),经常会看到两个细胞致死不休的相互攻击。当然细胞也会在周围有其他细胞时主动出击,或者细胞懒得动(休息)。

细胞视野

细胞所谓的周围(视野)已经不局限与周围8个方格,而是由于时间(白天还是黑夜),自身属性(敏捷影响视野)去决定。例如下面是一个视野为3的细胞。

细胞能力

可以理解为智商。但是感觉更像是游戏中的技能。例如说细胞在攻击时发现击中要害更致命,那么它以后攻击的时候都会向要害攻击(学会【击中要害】)。

这里为了让游戏更有意思,对思考类能力做了特殊处理,比如说细胞学会了【谋而后动】,那么它会在每次行动前,考虑自身、对手、周围细胞等各个因素,然后做一个判断,决定这次应该做什么。学会【走为上策】细胞会在自己自身不利情况逃跑。更甚者学会【知己知彼】还会考虑对手情况。

细胞状态

标准的如战斗中、逃跑、濒死,战斗状态如被拌摔等(与能力有关)

能力中使用位运算

首先在设计状态的时候使用了位运算判断,这也是一个很经典的学习案例:

我为了给每个技能增加【稀有度】,提出一个能力最大值的概念,其实我承认很大程度上是因为我发现智力有点废柴。

每个能力并不全是只有一个1(二进制),如上例中的【击中要害】二进制就有3个1。

这里需要说明一下,本身是没有能力类型的(如上面的共计类型),但是发现由于攻击类的能力稀有度低(原本的【奋力一击】是0x00000001【击中要害】是0x01000002),很多细胞同时拥有【奋力一击】和【击中要害】,所以提出了能力类型这个概念,同一个能力类型每个细胞只能拥有两个(不排除给一些思考类能力增加判断替换能力的功能)。

当你获得一个新技能的时候,剩余能力值(能力最大值减去已有能力值)不足,则无法获得该技能,这样保证了高智力细胞的优势。

判断能力值的方法来源经典的判断整数二进制中1的个数,也算学有所用。其实完全可以写一个类的,这我知道,而且在能力中暴露出来的问题(比如说通过0x00000001获得【奋力一击】这个能力的名字),也让我考虑将能力封装一个类。但是这都是后话。

判断视野

这真是经验不足了。

虽然很喜欢游戏,但是对于游戏编程还是没有过多接触。

本来很简单的一个问题,但是实现的时候还是出了不少问题,最后写下如下代码:

Within方法

野比的话

首先感谢nanqi0506和大家分享创作的经验和乐趣。其文尚未完成,本人会持续关注。《LifeGame》一文源代码下载:点击下载

(未完待续)

野比 2012 版权所有

时间: 2024-11-05 13:48:32

生命游戏和细胞自动机的学习笔记的相关文章

生命游戏&amp;一维细胞自动机 笔记

de 生命游戏是一种简单的聚合模型,展示了事物是如何聚合的,是自动机(CA)模型的一种.由剑桥大学约翰康威发明,其规则为: 1. 每个细胞拥有八个邻居,细胞状态只有存活(黑)和死亡(白)两种: 2.处于死亡状态的细胞可以在有三个存活邻居的情况下复活: 3.存活状态的细胞在相邻有2个一下或三个以上存活细胞的情况下会死去,2-3个相邻细胞存活时会继续存活: 从而产生了信号灯.闪光灯.滑翔机.警示灯等经典的变换. 遵循简单规则的简单图像聚合一起可以形成复杂图像,甚至如活物一般能进行空间平移(自组织模型

lua游戏开发实践指南学习笔记1

本文是根据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1.  语言定义: 在lua语言中,标识符有很大的灵活性(变量和函数名),不过用户不呢个以数字作为起始符,也要避免下划线(_)接大写字母,因为这种格式为lua自身保留如_Start. 建议用户使用如下格式和命名规则来定义变量.常量和函数名: ①  常量用全大写和下划线,例如:MY_CONSTANT ②  变量第一个字母小写,例如:myVariable ③  全角变量第一个字母用小写g表示,例如:gMyG

lua游戏开发实践指南学习笔记2

深入学习Lua 本人学习lua游戏开发实践指南的学习笔记,主要记录书中的一些知识点. 1.  函数 函数是划分游戏脚本功能的主要工具,它是通过标识符(事实上是一个变量)调用的lua代码块,可以执行某种处理.返回值,或者二者都有. 简单的函数定义如下: Function Wow() print(" ") print(Wow ,that wasaawesome:) print(" ") end 函数定义以function关键字开始,后面是函数名称,然后是传递给函数的参数

游戏引擎Egret Engine学习笔记(一)

Egret是基于TypeScrpt语言的开发引擎,可以说是目前最易上手,而且执行效率也很高的游戏开发引擎了.最初接触Egret是在腾讯课堂里,当时老师使用命令行进行讲解,我也跟着在自己的电脑上试了试,安装了Egret Engine——就和安装其他应用程序一样选择好路径点击开始安装就行了,而且Egret很小,很快就装好了.安装好之后便验证是否安装成功,打开cmd,输入Egret然后按回车键,看是否出现command列表,出现就说明安装好了.如下图: 安装好之后当然要拿来使用了,我们立刻就拿这个工具

Cocos2d-x游戏开发之Lua学习笔记

下载链接 什么是Cocos2d-x 一个开源的移动2D游戏框架,MIT许可证下发布. 可以利用C++.Lua及Javascript来进行部署. 跨平台:iOS,Android,Blackberry,Tizen等. 使用Cocos开发的应用 版权声明:本文原创,转载请注明出处:http://blog.csdn.net/zhoumushui

生命游戏的三种玩法

生命游戏 每个细胞有两种状态--存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动. 当细胞为死亡状态,若周围有3个存活细胞,则该细胞变成存活状态(模拟繁殖) 当细胞为存活状态,若周围有2个或3个存活细胞,保持原样 若周围有3个以上存活细胞,该细胞变成死亡(模拟极度拥挤) 若周围有低于2个一下存活细胞,该细胞死亡(模拟人口稀疏) 这个游戏也叫康威生命游戏.细胞自动机.元胞自动机等. 图案介绍 "脉冲星":它周期为3,看起来像一颗爆发的星星 "滑翔者":每4个回合

关于康威生命游戏的学习

 康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它最初于1970年10月在<科学美国人>杂志上马丁·葛登能的"数学游戏"专栏出现. 一个偶然机会发现了这个美妙的生命游戏.于是开始写程序来实现它,其实实现是很简单的,我现在还只能做到这个而已,不过还会继续深究下去的.先用Random来生成随机数,这样就可以在初始的时候在随机位置设定生死细胞了.输出的时候用2个for循环就是了.昨天做的时候遇到的问题是不知道最后该怎么判断了,因为判断

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来

【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera0: GameObject; private var Camera1: GameObject; private var Camera2: GameObject; private var Camera: GameObject; function Start() { //获取摄像机对象 Camera =