版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机程序编程课程设计报告(马尔可夫链算法生成随机可读文本)1、 引言:1、 马尔可夫链的数学背景: 马尔可夫链,因安德烈马尔可夫(a.a.markov,18561922)得名 ,是数学随机过程的一种。 在20实际的初期,由于物理学、通讯与控制、生物学、管理科学等领域的需要,随机过程的理论逐步产生和发展起来。随机过程理论为诸多领域的随机现象提供了数学模型。 随机过程的数学定义:设试验e的样本空间为,t是一个数集(t(-,+),如果对于每一个tt,都有一个定义在样本空间上的随机变量x(,t),则称依赖于t的一族随机变量x(,t),tt为随机过程。 马尔可夫链是一种特殊随机过程。 马尔可夫链的数学
2、定义:设随机序列x(n),n=0,1,2,满足如下条件: (1)对于每一个n(n=0,1,2,),x(n)取整数或它的子集(记为i); (2)对于任意r+1个非负整数n1,n2 ,nr,m(0n1n2nrm)和任意正整数k ,以及状态i1,i2,ir,i,ji,有px(n1)=i1,x(n2)=i2,x(nr)=ir,x(m)=i0,且 px(m+k)=jx(n1)=i1,x(n2)=i2,x(nr)=ir,x(m)=i =px(m+p)=jx(m)=i,则随机序列x(n),n=0,1,2,为马尔可夫链。条件概率px(m+k)=jx(m)=i称为马尔可夫链x(n),n=0,1,2,在时刻m从状
3、态i出发,在时刻m+k转移到状态j的k步转移概率,记作pij(m,m+k),即 pij(m,m+k)=px(m+k)=jx(m)=i.马尔可夫链的性质:对于齐次的马尔可夫链有c-k方程成立,这一方程表明“从状态i出发经k+l步转移到达状态j”这一事件,可以分解为“从状态i出发经k步转移到达中间状态s(si),再从s出发经l步转移到达状态j”这样一些事件的并。对于不同的中间状态s(si),这样的事件是互不相容的。如果马尔可夫链具有遍历性,那么它的直观意义是:不论质点从哪一个状态i出发,当转移步数k充分大时,到达状态j的概率近似于常数j 。如果已求出j 值,则当k充分大时j 可以作为pij(k)(
4、i,ji)的近似值。 如果马尔可夫链具有平稳分布,并取初试概率分布为平稳分布,则它在任意时刻m的概率分布都相同,都等于初始概率分布。2、马尔可夫链的典型应用:物理马尔可夫链通常用来建模排队理论和统计学中的建模,还可作为信号模型用于熵编码技术,如算术编码(著名的lzma数据压缩算法就使用了马尔可夫链与类似于算术编码的区间编码)。马尔可夫链也有众多的生物学应用,特别是人口过程,可以帮助模拟生物人口过程的建模。隐蔽马尔可夫模型还被用于生物信息学,用以编码区域或基因预测。马尔可夫链最近的应用是在地理统计学(geostatistics)中。其中,马尔可夫链用在基于观察数据的二到三维离散变量的随机模拟。这
5、一应用类似于“克里金”地理统计学(kriging geostatistics),被称为是“马尔可夫链地理统计学”。3、 相关图书介绍: 马尔可夫决策过程引论(作者:胡奇英/刘建庸 ) 简介:马尔可夫决策过程是研究马氏型序贯(动态)决策问题的工具。本书提供了处理离散时间、连续时间、半马氏等三类基本马氏决策过程模型的一般化方法。在此基础上,本书研究了状态部分可观察、多目标、带约束条件等一般化马氏决策过程以及处于随机变化环境中的马氏决策过程。 生灭过程与马尔可夫链 (作者:王梓坤 )简介:本书叙述生灭过程与马尔可夫链的基本理论并介绍近年来的一些研究进展第一章概述随机过程的一般概念:第二章至第四章讲述
6、马尔可夫链;第五、六章研究生灭过程的基本理论和构造,主要是用概率方法;第七、八章研究生灭过程和双边生灭过程构造论,主要是用分析的方法。同时还讨论了用两种方法所得结论之间的联系。2、 数据结构设计:本程序的数据结构在用哈希表设计。1、 哈希表介绍:哈希表是一种散列结果,它只通过关键字的特征便可以查找出所需结果,是一种十分便捷的用于查找的数据结构。在记录的存储地址和它的关键字之间建立一个确定的对应关系h,使每个关键字和结构中唯一的一个存储位置相对应。因而在查找时,只要根据这个对应关系h找到给定关键字值k的像h(k),即对应的存储位置。若结构中存在关键字和k相等的记录,则必定在h(k)的存储位置上,
7、因此,不需要进行比较便可直接取得所查记录。2、 哈希表的设计:前缀表设计:struct qianzhuib char *phrasen; struct houzhuib *houzhui;struct qianzhuib *next;struct qianzhuib *qianzhuitablehash;phrase2用于存储前缀struct houzhuib *houzhui用于指向该前缀所跟随的后缀struct qianzhuib *next用于指向具有相同关键字的同义词前缀前缀表是一个很长(长度为hash)的结构体数组后缀表设计:struct houzhuib char *word;st
8、ruct houzhuib *next; char *word用于指向后缀词struct houzhuib *next用于指向同一前缀所跟随的不同后缀对应关系h的设计:对应关系用于确定一个前缀具体存放在前缀表哪一个下标所对应的空间中。我们将前缀词组中每个字母的acsii值乘以37后作和当作对应关系。之所以选择37,是因为这可以将前缀较均匀的分布在散列表上。3、 程序架构介绍:对算法的思考:这个程序运用了马尔可夫链算法。因为文章的结尾两个词是没有后缀的,所以当以这两个词为前缀时文章的输出一定可以结束。如果把这两个词看作一个吸收壁,那么根据数学理论这个马尔可夫链一定是具有遍历性的,也就是说这个输出
9、是可以结束的。这就是马尔可夫链算法的可行性。int hash(char *cn) 该函数表示哈希表的对应关系,它可以计算出前缀在哈希表中的对应位置。调用它时需要输入一个指针数组,这个数组分别指向前缀词组的两个词;它返回的整数值就是前缀在哈希表中的位置。struct qianzhuib * lookout(char *phrasen,int create)该函数用于查找、添加一个前缀。调用它时第一个参数为指向需要添加前缀的指针数组,的二个参数为创建标识符(当create为0时之查找,当create为1时将前缀添加进前缀表);它返回为一个指向所查找或创建的前缀结构体的指针。void add(cha
10、r *phrasen,char *houzhui)该函数用于向指定前缀添加后缀。调用它时第一个参数为需添加后缀的前缀,第二个参数为指向需要添加的后缀的指针。该函数没有返回值。void addhouzhui(struct qianzhuib *p,char *houzhui)该函数是上一函数内部的函数,它用特定的方法添加后缀。int shuchu(char *phrasen)该函数用于输出。调用该函数时参数为指向前缀的指针,函数随机选择一个对应的后缀并将其输出;函数返回一个整型变量,返回1表示继续输出,返回0表示输出结束。在编写c#语言时运用了许多模板库:四、程序调试:1、编译错误:由于本程序涉
11、及函数、变量很多,所以在编写阶段经常把名字打错,导致编译过程中出现众多错误。经过多次修改后这些错误被排除。2、运行错误: (1)文章不能成功输入:使用for(x=0;a!=13;x+)导致文章不能不能输入,正确应为for(x=0;a!=n;x+)。13不是换行符的ascii码。 由于在装入单词时没有在末尾添加0导致文章输入不正确。添加语句wzzcxy=0;后输入正确。 (2)查询函数lookout中遇到问题:lookout函数中有一语句错误for(i=0;i=n;i+)它导致程序无法为同一个前缀建立不同的后缀,改为for(i=0;in;i+)后问题解决。 (3)关于函数中的return:在函数
12、中如果执行了return语句,那么函数便就此结束,不会再执行下面的语句。在lookout函数的编写中曾经出现了这种错误,即函数执行了return后不再向下执行。 五、程序测试:输入文本:a b c a b d a b e a b f a b g a b h.输入前缀:a b输出文本:a b e a b g a b c a b e a b e a b h.输入文本:show your flowchars and conceal your tables and i will be mystified. show your tables and your flowcharts will be obv
13、ious. 输入前缀:show your输出文本:show your tables and your flowcharts will be my stified. show your flowchars and conceal your tables and i will be obvious. 六、语言对比:从代码结构来看,c语言代码长度大结构较为复杂,需要编写者考虑每一个细节。由于长度大结构复杂,c语言程序在编译期和运行期都出现了很多错误,花费了大量时间调试修改。而c#语言采用面向对象设计的方法,编写中运用了大量的类和模板,因此代码紧凑、数据结构清晰,算法使人一目了然。即使发生错误,调试修
14、改也比较容易。从运行时间来看,运用c语言编写的程序效率较高,运行时间较短;c#程序效率没有c语言程序高。7、 程序代码: c语言代码:#define n 2 /*前缀长度*/#define hash 4093 /*散列长度*/#define long 30 /*单词长度*/#define null 0#define lenq sizeof(struct qianzhuib)#define lenh sizeof(struct houzhuib)#include #include #include #include /*后缀表结构*/struct houzhuib char *word;stru
15、ct houzhuib *next; /*前缀散列表*/struct qianzhuib char *phrasen; /*装前缀单词*/struct houzhuib *houzhui;struct qianzhuib *next;struct qianzhuib *qianzhuitablehash;/*计算哈希值*/int hash(char *cn) int h;int i;char *p;h=0;for(i=0;inext)for(i=0;iphrasei)!=0) break;if(n=i) return (p);if(1=create)p=(struct qianzhuib*)
16、malloc(lenq);for(i=0;iphrasei=phrasei;p-houzhui=null;p-next=qianzhuitableh;/*往前插入*/qianzhuitableh=p;return (p); /*添加后缀*/void addhouzhui(struct qianzhuib *p,char *houzhui)struct houzhuib *pp; pp=(struct houzhuib*) malloc(lenh);pp-word=houzhui;pp-next=p-houzhui;p-houzhui=pp; /*添加后缀*/ void add(char *ph
17、rasen,char *houzhui)struct qianzhuib *p;p=lookout(phrase,1);/*创建前缀*/addhouzhui(p,houzhui);/*加入后缀*/memmove(phrase,phrase+1,(n-1)*sizeof(phrase0);/*库函数*/phrasen-1=houzhui; /*输出函数*/int shuchu(char *phrasen)struct qianzhuib *p;struct houzhuib *sp;int match,i;char *w;p=lookout(phrase,0);if(p-houzhui=null
18、) i=0;return (i);else match=0;for(sp=p-houzhui;sp!=null;sp=sp-next)if(rand()%+match=0)w=sp-word;printf(%s40,w);memmove(phrase,phrase+1,(n-1)*sizeof(phrase0);phrasen-1=w;i=1;return (i);void main()char wzzc20030;/*二维数组用于暂存文章*/char w120,w220; char *ppn,*pppn; int x,y,j;int h; char a;/*前缀表初始化为空*/for(h=0
19、;hhash;h+)qianzhuitableh=null; /*输入文章*/printf(请输入一段文章:); a=0;for(x=0;a!=n;x+)/*回车*/for(y=0;(a=getchar()!=32)&(a!=n);y+)/*空格*/wzzcxy=a;wzzcxy=0;/*如此之后x的值便是文章单词长度*/ /*建立前缀表和后缀表*/ppp0=wzzc0;ppp1=wzzc1;for(j=2;jx;j+)add(ppp,wzzcj); /*随机输出*/ printf(请输入一个前缀n); scanf(%s%s,w1,w2); pp0=w1; pp1=w2; while(shuc
20、hu(pp)=1);c#代码:using system;using system.collections.generic;using system.linq;using system.text;namespace mtest class program random random = new random(); static void main(string args) string words = string.empty; program p = new program(); while (1 = 1) /words = console.readline(); words = show your flowchars and conceal your tables and i will be my stified. show your tables and your flowcharts will be obvious.(end); console.readline(); if (words.tolower() = exit) break; console.writeline(p.getstr(words); public string getstr(string words) list templist = new list(); list
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙投资竞业书合同
- 大班数学《坐船去探险》课件
- 手足口病风趣幽默讲解
- 2024房屋修缮合同
- 小学课外活动记录20篇-20211116120635
- 2024新版家政保姆合同样本
- 2024安置房买卖合同范本(标准版)
- 2024离婚合同协议书范本范文有子女
- 2024学校食堂租赁合同
- 2024新版影视剧摄制委托贷款合同
- 八年级上学期校本课程教案
- 自然教育课程的追寻与实践
- 接人待物礼仪培训
- 2024年云南烟草公司招聘笔试参考题库含答案解析
- 2024年中核环保招聘笔试参考题库含答案解析
- 北师大版数学六年级上册单元真题拔高卷 第6单元《比的认识》(参考答案)
- 《学生心理健康教育》课件
- 2022年中国铁路太原局集团有限公司招聘考试真题
- 分解因式-十字相乘法
- 薄荷的栽培技术
- 副食品、蔬菜、水果、肉类配送项目(完整版)投标文件
评论
0/150
提交评论