猫抓老鼠仿真的一种实现方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
猫抓老鼠仿真的一种实现方法
【摘要】本文阐述了一种在固定范围内遵照一定规则的猫抓老鼠的仿真实现方法。仿真程序采用c++语言编制,在vc++软件上运行。本文中的仿真模型,按模型的特性划分,是属于离散事件系统仿真;按仿真时钟与实际时钟的比例关系分类上划分,是属于欠实时仿真;按仿真的系统的结构和实现手段上划分,是属于物理仿真。
0 问题
猫抓老鼠。有1个10*10的方格阵,在一些格中会有一些障碍物。猫和老鼠从方格阵内任意位置开始,每单位时间只能走一格,且必须走一格。如果在某一刻两者在同一格中,我们称“猫抓到老鼠”(注意,猫和老鼠交换位置,不算被抓)。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1个单位时间做一个左或右转90度。一开始他们都面向北方。仿真实现猫抓老鼠的过程,同时保证老鼠尽可能地不被猫抓到。
1 系统定义
1.1仿真的边界是在一个10*10方格阵。
1.2 仿真的约束条件是猫和老鼠在规定的时间里按照一定的规则行走:(1)、猫和老鼠每单位间只能走一格,且必须走一格;(2)、猫和老鼠的移动方式相同:平时沿直线走,下一步果会走到障碍物上去或者出界,就用1个单位时间做一个左或右转90度;(3)、老鼠尽可能不被猫抓到。
1.3 仿真的的目的是,展现猫抓老鼠的过程。
2 数学建模
猫抓老鼠的仿真系统,是离散系统仿真。该系统的组成如下:
2.1 实体:(1)、永久实体:10*10方格阵,以及里面的障碍物信息;(2)、临时实体:猫和老鼠的坐标信息,以及方格阵中空格的坐标信息。
2.2 事件:(1)时间是共同的主事件。因为,时间协调了实体之间的同步活动。在某种程度上,也实现了各实体间的信息的传递。(2)猫和老鼠的行进是事件。因为,猫和老鼠的行进改变了系统的状态。
2.3 活动:(1)实体所做的事件。在该模型中,是猫和老鼠的行进;(2)、对实体施加的事件。在该设计中,当猫或老鼠进入一种死循环状态时,需要一个系统检测函数,改变猫或老鼠原有的行进方向。
2.4 进程:猫抓老鼠的整个动态过程。
3 仿真建模
3.1 参数设计:
(1)、10*10的方格阵用一个10*10矩阵存储。方格阵中的不同内容在矩阵中用不同的常数表示。比如,0表示空格,1表示障碍物等等。
(2)、猫和老鼠,分别用一个猫类Cat和鼠类Rat实现。在两个类中,具有共同的成员变量有:各自的坐标信息,上一时刻的行进方向,以及自仿真开始所走过的路径。
3.2 数据结构设计:
仿真程序采用了c++语言。所以,具体的参数设计采用了c++类的
数据类型。它们的具体定义如
下:
typedef struct time{
int x;//走过的次数
int timerecord[10];//走过的时间记录
}time;// cat_count[10][10]、rat_count[10][10]不仅记录了猫或老鼠经过某一点的次数,同时也记录了它们每次经过这一点的时间。
typedef struct node{
int x;//走过的横坐标
int y;//走过的纵坐标
int dir;//方向
}node; //用此数据类型定义的数组cat_stack[]其实是一个栈。
3.3 处理函数设计:
3.3.1 方格阵的处理函数
(1)、方格阵的初始化函数Initlize()。方格阵的初始化可以采用静态初始化或动态初始化两种方式。静态初始化方式是直接对矩阵进行赋初值。这可以采用直接人工赋值,或调用随机函数赋初值。动态初始化,是指当方格阵各单元的信息已经静态初始化之后,还可以对里面的障碍物、猫和老鼠的坐标进行更改,以满足仿真所要求的状态。该设计,就是采用了,动态初始化的方式。
(2)、死锁检测函数Checkcircle(),在该仿真系统中属于系统级的函数。它的功能是防 止猫或老鼠在方格阵中不停地绕圈,而使仿真失去意义。函数的实现原理是,由于该仿真系统有一个共同的主事件——时间。所以,如果猫或老鼠走过某一点的次数过多时,并且最后几次走过的时间间隔是相等的。那么,该检测函数就判定猫或老鼠正在不停地绕圈。处理方案是,如果能改变猫或老鼠的方向,即不是它们此刻不是夹在一个死胡同中,则左转或右转90°。否则,强制Cat_dir 调转180°。
该模型的数据结构中,方格阵对象定义了cat_count[10][10]和rat_count[10][10]两个 矩阵成员变量。它们的作用就是记录猫和老鼠在方格阵中经过每一点的次数,并记录下每次走过的时间。
(3)、方格阵绘图函数。在该仿真程序的设计中,采用VISUAL —C++实现Draw()函数的作图功能。基本原理是,每隔一秒就根据存储方格阵信息的矩阵Table[10][10]来重绘桌面上的窗口。这样可以达到一种类似于动画的动态显示效果。
具体的流程图:
Checkcircle()的流程图是://此处仅仅是列出对猫的检测函数,老鼠的大致类似。
3.3.2 猫的处理函数
猫的成员函数只有一个catroute()。该函数的功能是,每过一秒就为猫选取下一步要走的方向。这是在为猫做一个决策。在该模型的设计中,假设猫可以看到以自己的坐标为中心,上下左右各扩展n个方格的(n+1)*(n+1)范围内的所有信息。那么,猫就可以对这(n+1) *(n+1)小的方格阵进行遍历,然后做出判断,具体决定下一步该如何走。如果从这(n+1)*(n+1) 方格阵中发现了老鼠,就采用一种最短路径走法来改变方向。反之,则仍然按照题目的规定来走。
首先,这个(n+1)*(n+1)的小方格要从对象方格阵中提取成员变量Table[10][10]来获取。其次,在从Table[10][10]中提取(n+1)*(n+1)小方格阵时,要防止数组边界越界。再者,须设置一个变量find_rat,当在(n+1)*(n+1)小方格阵中遍历到了鼠的存在时,就将find_rat这一旗帜变量赋值为正。反之,赋值为反。
该仿真模型中,最短路径走法采用了广度优先遍历算法。本设计之所以选取广度优
先遍历算法是基于一下两点:一、猫是在搜索老鼠,所以这可以用一个搜索类算法来实现;
二、猫应该是要找到一个最短的路径去靠近老鼠。而广度优先遍历便是满足上述两个条件的比较适合的算法。广度优先算法的特点是:在搜索的过程中,广度搜索算法对于节点的搜索,是沿着层次扩展的。如果要遍历第n+1层的节点,必须先遍历完第n层的节点。那么,
对于同一层的节点来说,它们对于问题求解的价值是相同的。所以这种算法一定能保证找到最短的路径。