元胞自动机(Cellular automaton)

元胞自动机是由元胞组成的网格,每个元胞都根据邻域的状态来选择开或关。所有的元胞都遵循同样的规则,也称为元胞的更新规则,规则根据各元胞邻域的当前状态决定元胞的下一步状态。同自然界的复杂系统一样,元胞自动机也是由大量简单个体(元胞)组成,不存在中央控制,每个个体都只与少量其他个体交互。而且元胞自动机也能表现出非常复杂的行为,它们的行为很难甚至不可能通过其更新规则来预测。元胞自动机有很多种类型,著名的“生命游戏”也是元胞自动机的一种。

初等元胞自动机(Elementary cellular automaton)

初等元胞自动机是一维两状态的元胞自动机,每个元胞仅与两个相邻元胞相连。元胞自动机的时空图表现了元胞自动机的立体构型随时间的变化,最顶上一行是一维元胞自动机的初始状态设置,下面跟着的依次是每一步更新后的状态。

执行“多数分类(Majority classification)”任务的元胞自动机

该元胞自动机要能区分初始状态中是开状态还是关状态占多数。如果是开状态占多数,最后所有元胞就应当都变成开状态。同样,如果是关状态占多数,最后所有元胞就应该都变成关状态。多数分类任务有点类似于选举,是在大家都只知道最近邻居政治观点下预测两个候选人谁会赢。

我们使用一维元胞自动机,每个元胞与相邻的6个元胞相连,这样元胞的邻域中就有7个元胞(包括自己)。一个合理的想法是:“元胞应当变成邻域中当前占多数的状态。”这就好象根据你自己和邻居的多数意见来预测哪个候选人会当选。然而,这个“局部多数投票”元胞自动机并不能完成任务。

我们使用的是梅拉妮·米歇尔(Melanie Mitchell)在《复杂》(Complexity: A Guided Tour)一书第203页给出的规则:

0000010100000110000101011000011100000111000001000001010101

0101110110010001110111000001010000000101111101111111111011

011101111111

第1位是邻域全为0时中间元胞的更新状态,第2位是邻域为0000001时中间元胞的更新状态,依次往后。由于邻域状态有 27 = 128 种可能,因此该规则有128位。但是光看这些数位是看不出这个规则如何运作,也无法知道为何它进行多数分类时适应度很高。

实现该算法的 C# 程序

下面就是相应的 C# 源程序 MainForm.cs:

1 usingSystem;2 usingSystem.Drawing;3 usingSystem.Windows.Forms;4

5 namespaceSkyiv.CellularAutomaton.MajorityClassification6 {7 sealed classMainForm : Form8 {9 static readonly int sizeCellular = 3;10 static readonly int nCellular = 201;11 static readonly int lines =nCellular;12 static readonly Pen pen = newPen(Color.Black, sizeCellular);13 static readonly string strRuler =

14 "0000010100000110000101011000011100000111000001000001010101" +

15 "0101110110010001110111000001010000000101111101111111111011" +

16 "011101111111";17 static readonly bool[] ruler = new bool[strRuler.Length];18

19 Graphics gc;20

21 MainForm()22 {23 Text = "Majority Classification";24 BackColor =Color.White;25 ClientSize = new Size(nCellular * sizeCellular + 1, lines * sizeCellular + 1 + 32);26 for (var i = 0; i < ruler.Length; i++) ruler[i] = strRuler[i] == '1';27 }28

29 protected override voidOnPaint(PaintEventArgs e)30 {31 gc =e.Graphics;32 DrawGrid(true);33 var cellulars =GetInitCellulars();34 DrawCellulars(cellulars, 0);35 DisplayMessage(cellulars);36 for (var i = 1; i < lines; i++)37 {38 StepIt(cellulars);39 DrawCellulars(cellulars, i);40 }41 base.OnPaint(e);42 }43

44 void StepIt(bool[] cellulars)45 {46 var buf = new bool[cellulars.Length];47 for (var i = 0; i < nCellular; i++)48 buf[i] =ruler[GetValue(cellulars, i)];49 Array.Copy(buf, cellulars, cellulars.Length);50 }51

52 int GetValue(bool[] cellulars, intidx)53 {54 var n = 0;55 idx = (idx + 3) %nCellular;56 for (var i = 0; i < 7; i++)57 if (cellulars[(idx - i + nCellular) %nCellular])58 n += 1 <

62 void DrawCellulars(bool[] cellulars, intline)63 {64 for (var i = 0; i < cellulars.Length; i++)65 if(cellulars [i])66 Set(i, line);67 }68

69 void DisplayMessage(bool[] cellulars)70 {71 var blacks = 0;72 foreach (var cellular incellulars)73 if(cellular)74 blacks++;75 Out("Black:{0} White:{1}", blacks, cellulars.Length -blacks);76 }77

78 void Out(string fmt, params object[] args)79 {80 gc.DrawString(string.Format(fmt, args), new Font("Courier New", 10),81 Brushes.Blue, new Point(5, lines * sizeCellular + 9));82 }83

84 bool[] GetInitCellulars()85 {86 var rand = newRandom();87 var cellulars = new bool[nCellular];88 for (var i = 0; i < cellulars.Length; i++)89 cellulars [i] = rand.Next() % 2 == 0;90 returncellulars;91 }92

93 void DrawGrid(boolonlyBorder)94 {95 var pen = new Pen(Color.Red, 1);96 var len = nCellular *sizeCellular;97 for (var i = onlyBorder ? lines : 0; i <= lines; i++)98 {99 var k = i *sizeCellular;100 gc.DrawLine(pen, 0, k, len, k);101 }102 len = lines *sizeCellular;103 for (var i = onlyBorder ? nCellular : 0; i <= nCellular; i++)104 {105 var k = i *sizeCellular;106 gc.DrawLine(pen, k, 0, k, len);107 }108 }109

110 void Set(int x, inty)111 {112 var y2 = y * sizeCellular + sizeCellular / 2;113 gc.DrawLine(pen, x * sizeCellular, y2, (x + 1) *sizeCellular, y2);114 }115

116 static voidMain()117 {118 Application.Run(newMainForm());119 }120 }121 }

简要分析

第9行的静态只读变量 sizeCellular 表示每个元胞方格的边长,必须为奇数。

第10行的静态只读变量 nCellular 表示每行有多少个元胞,最好为奇数,以免在多数分类时出现平局的情况。

第11行的静态只读变量 lines 表示要迭代多少次。

第13行的静态只读变量 strRuler 表示迭代的规则。

主要工作在从第29行到42行的 OnPaint 方法中进行。

第84行到第91行的 GetInitCellulars 方法随机地初始化元胞的初始状态。

第36行到第40行的循环按照指定的规则进行迭代。

第44行到第50行的 StepIt 方法执行具体的迭代步骤。

第52行到第60行的 GetValue 方法计算元胞邻域的值。

运行结果

该程序几次典型的运行结果如下所示:

上图显示白色占优,结果正确。这种情况很常见。

上图显示黑色占优,结果正确。这种情况也很常见。

上图显示白色占优,结果错误。这种情况比较少见。

上图显示黑色占优,结果错误。这个结果错误在于最终的迭代结果不是全黒,而混入了少量的白色元胞。这个程序只迭代 200 步,其实只要再迭代几步后就可以得到正确的结果。这种情况非常的少见。

参考资料

c#元胞自动机_用元胞自动机实现多数分类算法相关推荐

  1. c#元胞自动机_基于元胞自动机模型的行人排队行为模拟

    06 系统工程理论与方法 基于元胞自动机模型的行人排队行为模拟 廖明军 1, 2 , 孙

  2. java元空间扩容_调整元空间metaspace大小

    MaxMetaspaceSize和CompressedClassSpaceSize是控制元空间大小的旋钮 现在,这些参数可能有点混乱.首先,它们有两种,它们有着微妙的不同含义,它们相互影响. 所以让我 ...

  3. python3.x程序设计基础周元哲答案_周元哲

    每章都有用Python实现该章内容的案例. 附录给出了软件考试与软件竞赛.图论相关模块.更多数据类型和习题答案. 传统的数据结构教材"重理论轻代码",往往只是给出伪代码,而本书的代 ...

  4. python决策树分类案例_银行产品销售案例与决策树分类算法

    案例数据集来源于UCI网站.案例是基于一家葡萄牙金融机构的电话销售数据.营销目标是确认客户是否愿意认购银行发行的一款定期储蓄产品.该数据集内包含41188条记录和20个特征变量,和1个分类变量.变量包 ...

  5. 【元胞自动机】基于元胞自动机模拟交通事故道路通行量matlab源码

    一.简介 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法.典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态.变化规则适用于每一个元胞并且同时进行.典型的变化规则 ...

  6. 【元胞自动机】基于元胞自动机模拟HIV传染matlab源码

    一.模型 介绍 元胞自动机就是类似于一个系统,各个单元,即元胞都有联系,但整体的系统又对各个小的单元产生影响,这影响便可定义为规则.而我们的目的就是找到这些规则来进行预测未来系统的发展.(通过计算机的 ...

  7. 【元胞自动机】基于元胞自动机模拟双车道交通流模型含靠右行驶matlab源码

    元胞自动机的初步理解 对元胞自动机的初步认识\ 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法.典型的元\ 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状\ 态.变化规 ...

  8. 【matlab】元胞数组(由元胞数组创建元胞数组)

    元胞数组(由元胞数组创建元胞数组) 语法格式: 元胞数组名(指定索引)={元胞}: 我们来看一段代码:

  9. matlab创建元胞数组对象,MATLAB中胞元数组的用法

    胞元数组(cell Arry)的基本组分是胞元(cell),每个胞元本身在数组中是平等的,只能以下标区分.胞元可以存放任何类型.任何大小的数组,如任意维数值数组.字符串数组.符号对象等,而且同一个胞元 ...

最新文章

  1. 程序员难逃二八法则,如何晋升为头部20%玩家?
  2. python中xpath用法_Python中的xpath基础使用
  3. 计算机技术大神,2017考研:计算机科学与技术学科大神给你的套路
  4. Yii的路由机制分析
  5. 面试官:Redis中的缓冲区了解吗
  6. linux 远程挂载摄像头_linux实现HUB分接两个摄像头读取视频
  7. WAP开发资料站(最新更新)
  8. npm和yarn科学设置淘宝镜像
  9. emWin 2天速成实例教程013_修改BUTTON按钮等控件背景皮肤颜色_SetBkColor
  10. 最新VMware虚拟机安装kali Linux详细教程
  11. OBS直播如何连麦和多人连麦
  12. Bot Chat(聊天机器人) AdaptiveCard的用法(源码)
  13. Flutter访问webservice
  14. 二、对HEVC/H.265视频编解码器进行隐写的基本思路
  15. shui-执行多个window.onload
  16. 淘宝API 淘宝链接获取解析获取商品id
  17. 报表查询条件的正确打开方式,看到最后不禁会心一下
  18. .NET/C# — EXCEL文件内容添加到数据库中
  19. 极进网络将收购斑马技术的无线局域网业务并获蓝筹客户
  20. 「书评」聊聊打CTF的那本书

热门文章

  1. C语言实现【Josephus 问题||热土豆】代码+运行结果
  2. mysql cascade的用法_MySql和Hibernate中关于cascade的用法
  3. chrome截网页全图
  4. C++ 语言命名空间 (namespace) 和 using 声明 (using declaration)
  5. 个人台式计算机常用的操作系统,计算机基本和操作系统
  6. 东北大学和大连理工大学计算机考研分数线,速查!多所院校公布复试线!东北大学和大连理工大学复试线已出...
  7. Winfrom menuStrip添加多级菜单 及递归
  8. 如何建立一个网站?规划、设计、目的、原则、宣传(转)
  9. 私域给企业带来的7大优势
  10. mysql contains 无效_Mysql函数CONTAINS和GEOMFROMTEXT不起作用