ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:278.85KB ,
资源ID:6573014      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6573014.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(西电人工智能大作业.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

西电人工智能大作业.docx

1、西电人工智能大作业人工智能大作业学生:021151* 021151*时间:2013年12月4号一启发式搜索解决八数码问题1.实验目的问题描述:现有一个3*3的棋盘,其中有0-8一共9个数字,0表示空格,其他的数字可以和0交换位置(只能上下左右移动)。给定一个初始状态和一个目标状态,找出从初始状态到目标状态的最短路径的问题就称为八数码问题。例如:实验问题为283104765123804765到目标状态:从初始状态: 要求编程解决这个问题,给出解决这个问题的搜索树以及从初始节点到目标节点的最短路径。2.实验设备及软件环境利用计算机编程软件Visual C+ 6.0,用C语言编程解决该问题。3.实验

2、方法(1).算法描述:.把初始节点S放到OPEN表中,计算,并把其值与节点S联系起来。.如果OPEN表是个空表,则失败退出,无解。.从OPEN表中选择一个值最小的节点。结果有几个节点合格,当其中有一个为目标节点时,则选择此目标节点,否则就选择其中任一节点作为节点。.把节点从OPEN表中移出,并把它放入CLOSED的扩展节点表中。.如果是目标节点,则成功退出,求得一个解。.扩展节点,生成其全部后继节点。对于的每一个后继节点: a.计算。 b.如果既不在OPEN表中,也不在CLOSED表中,则用估价函数把它添加入OPEN表。从加一指向其父辈节点的指针,以便一旦找到目标节点时记住一个解答路径。 c.

3、如果已在OPEN表或CLOSED表上,则比较刚刚对计算过的值和前面计算过的该节点在表中的值。如果新的值较小,则 I.以此新值取代旧值。 II.从指向,而不是指向它的父辈节点。 III.如果节点在CLOSED表中,则把它移回OPEN表。 转向,即GO TO 。 (2).流程图描述: (3).程序源代码:#include #includestruct node int number33;/用二维数组存放8数码 int W;/W表示与目标状态相比错放的数码数 int Depth;/记录当前节点的深度 struct node *parent;/指向父节点的指针 struct node *next;/指

4、向链表中下一个节点的指针;int CounterW(int Number33)/函数说明:计算当前状态与目标状态的W值 int i,j; int W=0; int Desnode33=1,2,3,8,0,4,7,6,5; for(i=0; i3; i+) for(j=0; j3; j+) if(Numberij != Desnodeij) W+; return W;void PrintNode(node *A) int i,j; for(i=0; i3; i+) for(j=0; jnumberij); printf(n); printf(n); int CheckNode(node *ope

5、n, node *close, int a33)/检验该节点状态是否出现过的子程序 int CheckFlag=0; int flag1,flag2; node *p=open; node *q=close; while(p != NULL) flag1=0; for(int i=0; i3; i+) for(int j=0; jnumberij) flag1+; if(flag1 = 9) break; else p=p-next; while(q != NULL) flag2=0; for(int i=0; i3; i+) for(int j=0; jnumberij) flag2+; i

6、f(flag2 = 9) break; else q=q-next; if(flag1=9) | (flag2=9) CheckFlag=1;/如果出现过,置标志位为1 return CheckFlag;struct node *FindNextNode(node *Prenode, node *open, node *close) /扩展Prenode指向的节点,并将扩展所得结点组成一条单链表 int i,j,m,n; /循环变量 int temp; /临时替换变量 int flag=0; int a33;/临时存放二维数组 struct node *p, *q, *head; head=(

7、node *)malloc(sizeof(node);/head指向该链表首结点,并且作为返回值 p=head; q=head; head-next=NULL;/初始化 for(i=0;i3;i+)/找到二维数组中0的位置 for(j=0;jnumberij=0) flag=1; break; if(flag=1) break; /根据0的位置的不同,对a进行相应的变换 for(m=0;mnumber赋给a for(n=0;nnumbermn; if(i+1=2)/情况1,0向下移 temp=aij; aij=ai+1j; ai+1j=temp; int CheckNum=CheckNode(

8、open, close, a); if(CheckNum = 0)/若该结点未出现过则执行下面的操作 q=(node *)malloc(sizeof(node); for(m=0;mnumber for(n=0;nnumbermn=amn; PrintNode(q); q-parent=Prenode; q-Depth=q-parent-Depth+1;/子结点的深度等于其父结点深度加1 q-W=CounterW(q-number); q-next=NULL; p-next=q;/扩展节点插入head链表 p=p-next; for(m=0;mnumber重新赋给a for(n=0;nnumb

9、ermn; if(i-1=0)/情况2,0向上移 temp=aij; aij=ai-1j; ai-1j=temp; int CheckNum=CheckNode(open, close, a); if(CheckNum = 0)/若该结点未出现过则执行下面的操作 q=(node *)malloc(sizeof(node); for(m=0;mnumber for(n=0;nnumbermn=amn; PrintNode(q); q-parent=Prenode; q-Depth=q-parent-Depth+1; q-W=CounterW(q-number); q-next=NULL; p-n

10、ext=q; p=p-next; for(m=0; m3; m+) for(n=0; nnumbermn; if(j-1=0)/情况3,0向左移 temp=aij; aij=aij-1; aij-1=temp; int CheckNum=CheckNode(open, close, a); if(CheckNum = 0)/若该结点未出现过则执行下面的操作 q=(node *)malloc(sizeof(node); for(m=0; mnumber for(n=0; nnumbermn=amn; PrintNode(q); q-parent=Prenode; q-Depth=q-parent

11、-Depth+1; q-W=CounterW(q-number); q-next=NULL; p-next=q; p=p-next; for(m=0;m3;m+) for(n=0;nnumbermn; if(j+1=2)/情况4,0向右移 temp=aij; aij=aij+1; aij+1=temp; int CheckNum=CheckNode(open, close, a); if(CheckNum = 0)/若该结点未出现过则执行下面的操作 q=(node *)malloc(sizeof(node); for(m=0; mnumber for(n=0; nnumbermn=amn; P

12、rintNode(q); q-parent=Prenode; q-Depth=q-parent-Depth+1; q-W=CounterW(q-number); q-next=NULL; p-next=q; p=p-next; head=head-next; return head; node *insert(node *open,node *head) /将head链表的结点依次插入到open链表相应的位置, /使open表中的结点按从小到大排序。函数返回open指针 node *p,*q;/p、q均指向open表中的结点,p指向q所指的前一个结点 int flag=0; if(open=N

13、ULL) & (head != NULL)/初始状态,open表为空 /首先将head表第一个结点直接放入open表中 open=head; q=head; head=head-next; q-next=NULL; if(open != NULL) & (open-next=NULL) &(head != NULL) /open表中只有一个元素 q=open; if(head-W + head-Depth) W + open-Depth) /若后一结点的f值小于首结点,则将它插入到首结点位置 open=head; head=head-next; open-next=q; else/或者第二个结

14、点的位置 q-next=head; head=head-next; q=q-next; q-next=NULL; p=open; while(head!=NULL) q=open; if(head-W + head-Depth) W + open-Depth) /插入到表头 open=head; head=head-next; open-next=q; continue; else q=q-next; p=open; /否则,q指像第二个结点,p指向q前一个结点 while(q-next!=NULL) /将head的一个结点插入到链表中(非表尾的位置) if(q-W W) q=q-next;

15、p=p-next; else p-next=head; head=head-next; p-next-next=q; break; if(q-next=NULL)/将head的一个结点插入到表尾或倒数第二个位置 if(q-W + q-Depth) W + head-Depth) q-next=head; head=head-next; q-next-next=NULL; else p-next=head; head=head-next; p-next-next=q; return open; void main() int i,j; int key=0; node FirstNode; nod

16、e *open, *close; node *p, *r; node *NodeList; printf(请输入初始状态的8数码(按每行从左往右依次输入,用0表示空格):n); for(i=0; i3; i+) for(j=0; j3; j+) scanf(%d,&FirstNode.numberij); printf(n); printf(搜索树为:n); for(i=0; i3; i+) for(j=0; jW = 0)/该结点的状态与目标结点相同 printf(该结点已为目标结点状态!n); return; r=&FirstNode; close=&FirstNode; r-next=N

17、ULL; open=NULL; NodeList=FindNextNode(r,open,close);/NodeList指向新扩展出来的链表 open=insert(open,NodeList);/将扩展出来的结点插入到open表中 while(open != NULL) r-next=open;/将open表的第一个元素加到close表,r始终指向close表的最后一个元素 open=open-next; r=r-next; r-next=NULL; if(r-W = 0) key=1; printf(n启发式搜索成功!n); break; NodeList=FindNextNode(r,

18、open,close);/对close表最后一个结点进行扩展,扩展得到的链表接到head表 open=insert(open,NodeList);/将扩展的结点按顺序插入到open表中 if(key = 1) p=close; printf(最优搜索过程如下:n); printf(结点深度为:%dn,FirstNode.Depth); printf(-n); while(p!=NULL) for(i=0; i3; i+) for(j=0; jnumberij); printf(n); printf(n); p=p-next; if(p != NULL) printf(结点深度为:%dn,p-D

19、epth); printf(-n); else printf(查找失败,该问题无解!n); 4.实验结果搜索树为:最短路径为:5.实验分析本次实验采用启发式搜索,利用C语言编写程序实现八数码问题的求解。采用简单的估价函数: 其中是搜索树中节点的深度;用来计算对应于节点的数据库中错放的棋子个数。例如初始节点的估价函数值为3。 估价函数能够提供一个评定候选扩展节点的方法,以便确定哪个节点时最有可能在通向目标的最佳路径上。这样选择正确的估价函数,可以减少扩展节点个数,对于实验所给的初始节点和估价函数,只用扩展11个节点就能找到目标节点;相比于盲目搜索可以减少被扩展的节点数,减少很多空间占用和时间损耗

20、。 利用启发信息来决定哪一个是下一步要扩展的节点,这种搜索总是选择“最有希望”的节点作为下一步被扩展的节点。这实际上是通过估价函数值的大小重排OPEN表,小的一直排在OPEN表的前面。每次取OPEN表的第一个节点放到CLOSED表中进行扩展,这样一步步靠近目标节点,直到最后找到目标节点,停止扩展。6.结论正确选择估价函数对确定搜索结果具有决定性作用。使用不能识别某些节点真是希望的估价函数会形成非最小代价路径;而使用一个过多地估计了全部节点希望的估价函数,又会扩展过多的节点。在选对估价函数的前提下,启发式搜索能准确识别有希望和没有希望的节点,从而很快扩展到目标节点,找到最短路径。在本次实验中如果

21、选择估价函数值为(用来计算对应于节点的数据库中错放的棋子个数),将会扩展更少的节点,更加快的找到到达目标节点的最短路径。二英文期刊翻译Adaptive Evolutionary Artificial NeuralNetworks for Pattern Classification自适应进化人工神经网络模式分类摘要:这篇文章提出了一种新的进化方法称为混合进化人工神经网络(HEANN),同时提出进化人工神经网络(ANNs)拓扑结构和权重。进化算法(EAs)具有较强的全局搜索能力且很可能指向最有前途的领域。然而,在搜索空间局部微调时,他们效率较低。HEANN强调全局搜索的平衡和局部搜索的进化过程,

22、通过调整变异概率和步长扰动的权值。这是区别于大多数以前的研究,那些研究整合EA来搜索网络拓扑和梯度学习来进行权值更新。四个基准函数被用来测试的HEANN进化框架。此外,HEANN测试了七个分类基准问题的UCI机器学习库。实验结果表明在少数几代算法中,HEANN在微调网络复杂性的性能是优越的。同时,他还保留了相对于其他算法的泛化性能。简介:人工神经网络(ANNs)已经成为一种强大的工具被用于模式分类1,2。ANN拓扑优化和连接权重训练经常被单独处理。这样一个分治算法产生一个不精确的评价选择的神经网络拓扑结构。事实上,这两个任务都是相互依存的且应当同时解决以达到最佳结果。 一个模式分类的关键任务是

23、设计一个紧凑和广义ANN拓扑。为特定的问题选择一个适当的ANN拓扑是至关重要的,由于ANN泛化相关性信息处理能力和ANN拓扑的强关联能力。过度的小型网络的大小表明问题不能学得很好,而一个特别大的网络规模将导致过度学习和差的推广性能。耗时的实验训练方法和爬山建设性或修剪算法3-7用于设计一个ANN架构,对于一个给定的任务只有探索小型建筑子集,或往往是停在结构局部最优解。相关的神经网络是一个流行的8建设性算法而用于构造有多个维层的ANN拓扑。新的隐藏节点一个接一个的被添加进来且都与每一个现有的隐藏节点在当前的网络连接。因此,网络可以被视为拥有多个可以形成一个级联结构的集中度值层。然而,网络是倾向于

24、结构局部最优解由于它具有建设性的行为。设计一个ANN拓扑使用进化算法(EAs)已经成为一种流行的方法来克服建设性或修剪方法9-13的缺点。它有很强的全局搜索能力,可以有效地搜索通过接近完整的ANN拓扑类。许多工作已经致力于进化神经网络ANN拓扑结构。两个主要的方法来发展ANN拓扑的文献报告是没有重权值和ANN拓扑同步进化的两个拓扑和权重。演化的一个无权值得ANN拓扑,必须从一组随机的初始权重训练评估其适应性。姚和刘11指出,这个适应性评价方法很嘈杂因为一个显性型的适应性是用来代表隐形型的适应性。虽然的进化ANN拓扑的适应性可以通过运行多个不同的随机初始权重而得到的平均结果来估计,为适应性计算评价时间是急剧增加。因此,只有小ANN拓扑在14和15中被演化。同时进化的ANN拓扑和权重,权重信息拓扑和编码在每个个体是独立的。因此嘈杂的适应性评价问题可以被缓解。一个突出的工作称为EPNet被姚和刘11引入,那是一个同时进化ANN拓扑和权重例子。姚和刘用混合训练来进化ANN权重测试。梯度学习和模拟退火都纳入进化过程演变的ANN权重。Martnez-Estudillo等人在最好的独立

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1