关于元胞自动机(Cellular Automata, CA)的原理这里就不再叙述了。

以前的学校地理系有用CA做城市发展研究的大牛,无论在课堂上还是在项目中都会用得到CA模型。虽然CA模型本身并不复杂,但是每次从新写起也是十分麻烦,因此一个通用的CA模型框架能够减少很多工作量。幸好对于大多数CA模型的应用来说,其邻域定义大同小异,最主要的不同在于元胞的转换规则会根据问题和方法的不同而有所变化。因此这个通用框架的核心在于,用户可以自行定义元胞的转换规则。

PyCA构建CA模型的流程如下:

  创建转换规则类需要两类参数:

1) 邻域类型和大小

在PyCA中定义了三种类型的邻域: von、moore和custom,分别对应Von Neumann邻域(大小为1时即四邻域)、Moore领域(大小为1时即八邻域)和自定义邻域。

   其中2代表中心元胞。如果需要自定义领域,则需要如上图所示自行定义邻域矩阵,使用1代表有效邻域,2代表中心元胞,其他位置则用0表示。需要注意的是,PyCA没有其他依赖numpy,定义矩阵时必须使用原生的list。

2) 自定义转换规则

在定义转换规则时,用户不需要了解具体的模型运行流程参数。需要处理的参数有三个,包括当前中心元胞的值、有效邻域元胞的值和环境因子,并根据上述参数给出下一次循环时中心元胞的值。因此转换规则的定义如下:

newvlaue = rule(oldvalue, neighborhood, envi)

neighborhood和envi为邻域元胞值和环境参数。这个两个参数会传入和之前定义邻域大小相一致的矩阵,有效邻域中保留对应的元胞或环境参数,无效邻域将赋值为None。由于该框架支持多层环境参数,当输入的环境参数有多个图层时,neighborhood是一个包含每一层邻域的list。

以最简单的生命游戏为例,其元胞转换规则应该如下:

defrule_lifegame(pix, neighborhood, envi):#Replace all the None with 0

for r in range(3):for c in range(3):if neighborhood[r][c] ==None:

neighborhood[r][c]=0#1 means living, and 0 means dead

if pix == 1:#The central cell can not be counted.

live = numpy.sum(neighborhood) - 1

if live < 2:return0elif live <= 3:return 1

else:return0else:

live=numpy.sum(neighborhood)if agent == 3:return 255

else:return 0;

当定义好转换规则时,就可以用rulebuilder类来创建模型规则。rulebuilder类有两种初始化方法,分别对应预定义邻域(von、moore)和自定义领域:

# Predefined neighborhood: 'von' and 'moore'

rulebuilder = PyCA.rulebuilder(rule, ntype, nsize)

# Custome neighborhood:

rulebuilder = PyCA.rulebuilder(rule, neighboorhoodregion)

当新建好rulebuilder类后就可以调用build()方法类创建模型规则,以上面的生命游戏为例:

rulebuilder = PyCA.rulebuilder(rule_lifegame, 'von', 1)

carule= rulebuilder.build()

最后一步是利用CA类来创建CA模型。新建CA类需要三个参数:由rulebuilder.build()生成的模型规则、初始元胞分布、环境参数:

ca = PyCA.CA(envi, initialcells, carule)

然后调用CA类中的evolve()方法来进行迭代:

ca.evolve(time, returnresult, storehistory)

其中time指定迭代次数,默认值为1。returnresult指定在完成所有迭代后是否返回当前元胞分布,默认为False。storehistory指定每次迭代后是否将元胞分布保存到ca.history中,默认值为False。ca.history是一个dict,定义为 ca.history = {time: result of that time}。用户可以在完成迭代后调用ca.history得到每次迭代结果。

至此,一个完整的CA模型创建和运行流程完成。PyCA源码地址:http://pan.baidu.com/s/1mgwjkLE

最后,给出一个完整生命游戏Demo:

importPyCA, numpy, randomfrom PIL importImage#rule for life game

defrule_lifegame(pix, neighborhood, envi):for r in range(3):for c in range(3):if neighborhood[r][c] ==None:

neighborhood[r][c]=0if pix == 255:

live= numpy.sum(neighborhood) - 255

if live < 2 * 255:return0elif live <= 3 * 255:return 255

else:return0else:

live=numpy.sum(neighborhoodn)if agent == 3 * 255:return 255

else:return0;#build initial cell distributioin, randomly pick up 3000 cells as living cells

(row, col) = (100, 100)

cells=numpy.zeros((row, col)).tolist()for i in range(3000):

cells[random.randint(0,99)][random.randint(0, 99)] = 255

#build trasformation rules

rulebuilder = PyCA.rulebuilder(rule_lifegame, 'von', 1)

carule=rulebuilder.build()#create CA model

ca =PyCA.CA(cells, cells, carule)

ca.evolve(50, False, True)#save the array of result as bmp file

for (time, result) inca.history.items():

arr= numpy.array(result, dtype =numpy.uint8)

im=Image.fromarray(arr)

im.save('time_{0}.bmp'.format(time))

P.S: 为避免严重的边界效应,该模型会忽略处于边界的元胞。

如有什么问题欢迎私信讨论。

python元胞转list_[Python练习向] 简易元胞自动机框架相关推荐

  1. Python中的元编程:一个关于修饰器和元类的简单教程

    作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...

  2. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  3. 元类被称为 Python 中的“深奥的巫术“

    ''' 元类被称为 Python 中的"深奥的巫术".尽管你需要用到它的地方极少(除非你基于 zope 编程),可事实上它的基础理论其实令人惊讶地易懂. 一切皆对象 一切都有类型 ...

  4. python中的元类_理解python中的元类

    一,理解类也是对象 在python中类同样也是一种对象,只要使用关键字class,Python解释器在执行的时候就会创建一个对象,这个对象(类)自身拥有创建对象(类实例)的能力,这就是为什么他是一个类 ...

  5. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

  6. python基础教程价格范围_价值18980元的968集Python教程,在此透露给大家!速度来拿哇...

    我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 小白学P ...

  7. 【MATLAB】数据类型 ( 元胞数组 | 单位阵 | 幻方 | 结构体 | 元胞数组值获取 )

    文章目录 一.元胞数组 1.定义元胞数组 2.生成单位阵 3.生成幻方 4.元胞数组元素赋值 5.元胞数组元素赋值 二 二.元胞数组 1.定义结构体 2.小括号获取元胞数组子数组 3.大括号获取元胞数 ...

  8. python入门教程非常详细-Python编程入门教程:从入门到高级,非常详细

    本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧: 这里给初学Python的朋友提供一些建议和指导吧.大神请无视, 俗话说:授人以鱼不如授人以渔.所以我这里只是阐述学习过程,并不会直接详细 ...

  9. python入门编程软件免费-Python编程干货免费领取!!!

    原标题:Python编程干货免费领取!!! 早在18 年,教育部就正式将人工智能.物联网.大数据处理正式划入高中新课标,这就意味着现在的学生16岁就要开始学习编程了! 开发岗位的高薪和人工智能的发展, ...

最新文章

  1. java 二维卡尔曼滤波_卡尔曼滤波(Kalman filtering)算法学习小记
  2. 2017届-应届毕业生-兆芯 GPU architecture design校招在线笔试题
  3. dojo中chart参数
  4. hibernate 映射表_Hibernate多对多映射-连接表
  5. 自适应的设置字体的方式
  6. Think PHP(TP)框架基础知识
  7. IATF16949认证辅导,FMEA和CP的顾客额外批准,对供应链安全的管理(适用时)
  8. php laypage,LayUI分页和LayUI laypage分页区别详解
  9. 有道云笔记Markdown图片链接解决办法
  10. 推荐一个项目管理工具:TAPD
  11. 90-0004Web颜色标准【中英文颜色对照】
  12. nfc卡模式与标准模式_NFC的工作模式有哪些主动模式和被动模式的详细讲解
  13. html修改文本框样式,HTML实用文本框样式
  14. 轻快的java_轻快的Java
  15. 普洱机器人编程_普洱机器人视觉效果怎么样?
  16. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法
  17. CART分类与回归树的原理与实现
  18. Mac下设置zsh的环境变量
  19. 程序员工作三年晒出9月工资条,直言加班太累了
  20. 跟领导谈加薪,聪明的员工都这么说

热门文章

  1. MOCTF-Web-访问限制
  2. android通过c调用shmat函数,编译可在Android上运行的qemu user mode
  3. android 页面标题,Android v4包下的PagerTitleStrip,ViewPager的页面标题
  4. python ljust 库_Python知识精解:str ljust()方法
  5. java返回json格式的状态码数据(二)
  6. CVPR2015深度学习回顾
  7. oracle 怎么拼,ORACLE 简化拼接
  8. 周末,说声php的settergetter(魔术)方法,你们辛苦了
  9. 2016年这些网络新贵或被并购
  10. 没有人会告诉您乘坐飞机时的几个事实 但是您一定要知道