算法描述:
Begin
(1)首先把cell里的信息复制到workcopy里。
(2)载入你想在屏幕上显示的图片,建立虚拟画布。
(3)对绘画区域上的位置逐个进行判断。如果这个位置下一代有而上一代没有的话,就绘制一个图形;如果这个位置下一代没有而上一代有的话,就擦除上面的图形。
End
请看通用模块显示部分算法流程图5
图5 通用模块显示部分算法流程图
总结
这个模块之所以有一定的通用性是因为它的显示不受任何规则的影响,也就是说它是一个独立的函数。绘制的个体也可以多种多样,不一定非要是一个小球,你甚至可以定义一个坦克的小图品,没有问题,只要您的图片是正方形的,而且图片的长度能满足下面这个公式:
600 % 图片长度(像素点) == 0 (因为绘图区域的长度是600个像素点)。这就说明了它的两个组成部分都是独立的。如果您要实现的算法满足我上面列出的三个特征,您可以使用这个通用模块,并添加一些辅助的规则,轻易实现这个算法。
2.2 生命游戏的实现
算法描述(这里,离散个体这个称呼我们改成细胞):;
Begin
(1)初始化。把cell 数组的每一个元素都设置成0.设置相关的变量,如临时变量、记录坐标的变量等。
(2)对cell 数组进行随机赋值,只能是0和1.
(3)备份cell 数组的信息到workcopy 数组里。
(4)对cell 数组的每个元素逐个计算。取得这个细胞上、下、左、右的坐标值。如果数组元素已遍历完,则直接到End.
(5)利用这些坐标值求出生存邻居的个数
(6)结合邻居个数和约束条件,如果细胞是活的,那么当它有2到3个邻居时就可以继续生存下去. 否则只能死亡或者当原来没有细胞生存时,当它的邻居是3时,也可以产生出一个细胞.其他情况一律死亡。把这些信息记录到cell数组上。返回到(4)。
End
收集邻居个数
图6 生命游戏中收集邻居个数的算法流程图
按规则演化
图7 生命游戏中细胞按规则演化的算法流程图
注意:算法流程图中出现的变量名解释:
h_i 是二维矩阵的行号;h_j是二维矩阵的列号; top 存储当前细胞上一行的行号坐标;
bottom 存储当前细胞下一行的行号坐标; left 存储当前细胞前一列的列号坐标;
right 存储当前细胞后一列的列号坐标;z是矩阵的边界
处理了cell数组以后,我们就可以使用通用模块中的Display函数把它的状态绘制出来。至此,完成了生命游戏的程序设计。请看程序运行的截图 图8:
图8 生命游戏
2.3 一维通用细胞自动机(CA)的实现
生命游戏其实是一维细胞自动机的一个特殊的例子。它能实现比一维细胞自动机更生动直观和奇幻的图形。但是,由于一维细胞自动机规则简单、现象直观,故而人们对它进行了深入的研究,而且,沃夫拉姆的四种分类也是建立在一维细胞自动机的基础之上。它的理论基础可参照本范文第一章第二节。所以,有必要实现一维细胞自动机模型。
一维细胞自动机的算法描述:
Begin
(1)随机生成第一代的细胞:先在绘制区域的最后一行,也就是矩阵数组的最后一行进行一次随机生成细胞操作。
(2)从第二行开始,把整个区域往上挪一行
(3)根据一维细胞自动机的规则和上一代的细胞状态,计算出下一代的细胞状态。并放置在cell数组的最后一行里。
根据cell数组的信息,绘制出相应的图形并返回到(2)步骤。
End
在这里,我们有必要对一维细胞自动机的规则作出解释,请先参看第一章第三节对规则的解释,上面是以一维细胞自动机为例的,也详细阐述了其规则的原理。下面简单其规则产生的算法:
一维细胞自动机规则生成算法描述:
Begin
(1)取得使用者给出规则的十进制表达形式。
(2)使用相关的函数把十进制值转化成二进制(具体语言不一样,可参照本文档设计源程序的trun_this_on() 函数)。
(3)把这个二进制值每一位分别拆开,放到数组里以便使用。
End
图9 一维细胞自动机演化规则号转化为二进制值的算法流程图
图10 一维细胞自动机算法流程图
注意:算法流程图中出现的变量名解释:f、k、a和b 是临时变量 ,abc是存放二进制位的一个数组。
完成程序设计工作,请看程序运行截图 图11:
图11 一维细胞自动机
2.4 分子热运动模拟
由于上面的章节没有提到分子热运动,所以这里需要解释一下。我们还是使用原来的通用模块来对分子热运动这个物理现象进行模拟。这里,离散个体的称呼改成小分子。因为分子运动性质和上面的细胞有点区别,每个分子都必须有自己的运动方向和当前以及下一步的坐标,所以使用了一个结构体来存储这些信息。当然,我们对这群分子的状态的显示离不开cell数组,cell 属于通用模块的第一个组成部分。我们可以这样定义这个数据结构:
public struct qiuti
{
public int x; //这个小分子当前的坐标值
public int y;
public int fang; //指示这个小分子当前的的运动方向
}
我们用上面的结构体定义一个结构体数组,来存储所产生的分子的信息(信息指这个分子下一步的坐标和方向)。
public qiuti[] fenzi = new qiuti[15000];
分子随机热运动模拟程序算法描述:
(1)在cell数组上随机生成小分子的坐标和方向。
(2)把这些信息记录在我们定义的结构体数组里。
(3)把 cell 数组的信息复制到 workcopy 数组里去。
(4)对结构体数组的每一个数据项都进行计算,给出分子下一步的方向和坐标。
(5)调用通用模块显示出所有分子的状态,并返回(3)步骤。
图12 分子热运动模拟算法流程图
注意:算法流程图中出现的变量名解释:fenzi是