计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

免费基于细胞自动机的生命活力模拟的实现(一(4)

2013-06-27 01:15
导读:巧,由于画布是黑色的,我们可以制作一个尺寸和个体图片尺寸一样大小的的黑色图片,把它覆盖在原来的区域,就等于把这个个体擦除了。这个方法不需
巧,由于画布是黑色的,我们可以制作一个尺寸和个体图片尺寸一样大小的的黑色图片,把它覆盖在原来的区域,就等于把这个个体擦除了。这个方法不需要刷新整个屏幕,而且,只对小区域的图形进行操作,大大提高了系统的性能。下面是这个想法的算法实现(为了提高系统的性能,我使用了双缓冲技术):
 算法描述:
 Begin
 (1)首先把cell里的信息复制到workcopy里。
 (2)载入你想在屏幕上显示的图片,建立虚拟画布。
 (3)对绘画区域上的位置逐个进行判断。如果这个位置下一代有而上一代没有的话,就绘制一个图形;如果这个位置下一代没有而上一代有的话,就擦除上面的图形。
 End
 请看通用模块显示部分算法流程图5

图5 通用模块显示部分算法流程图
 总结
 这个模块之所以有一定的通用性是因为它的显示不受任何规则的影响,也就是说它是一个独立的函数。绘制的个体也可以多种多样,不一定非要是一个小球,你甚至可以定义一个坦克的小图品,没有问题,只要您的图片是正方形的,而且图片的长度能满足下面这个公式:
 600 % 图片长度(像素点) == 0 (因为绘图区域的长度是600个像素点)。这就说明了它的两个组成部分都是独立的。如果您要实现的算法满足我上面列出的三个特征,您可以使用这个通用模块,并添加一些辅助的规则,轻易实现这个算法。
 2.2 生命游戏的实现
 算法描述(这里,离散个体这个称呼我们改成细胞):;
 Begin
 (1)初始化。把cell 数组的每一个元素都设置成0.设置相关的变量,如临时变量、记录坐标的变量等。
 (2)对cell 数组进行随机赋值,只能是0和1.

(转载自http://zw.nseac.coM科教作文网)

 (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)的实现
 生命游戏其实是一维细胞自动机的一个特殊的例子。它能实现比一维细胞自动机更生动直观和奇幻的图形。但是,由于一维细胞自动机规则简单、现象直观,故而人们对它进行了深入的研究,而且,沃夫拉姆的四种分类也是建立在一维细胞自动机的基础之上。它的理论基础可参照本论文第一章第二节。所以,有必要实现一维细胞自动机模型。
 一维细胞自动机的算法描述: (转载自中国科教评价网www.nseac.com )
 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 属于通用模块的第一个组成部分。我们可以这样定义这个数据结构:

(科教作文网http://zw.ΝsΕAc.Com编辑整理)

 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是

上一篇:免费基于JSP技术的猎头公司管理软件的设计与实 下一篇:没有了