- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(SG13011402汪伟人工智能八数码实验
八数码问题实验(启发式搜索算法)
姓名:汪伟 学号:S实验目的:
熟练掌握启发式搜索A* 算法。
实验内容:
使用启发式搜索算法求解8数码问题。
编制程序实现求解8 数码问题A*算法,采用估价函数发函数
f(n) = d(n) + w(n)
f(n) = d(n) + p(n)
其中:d(n)是搜索树中结点n的深度,表示讨论单位耗散的情况;w(n)表示以“不在位”的将牌个数作为启发函数的度量。P(n)定义为每一个将牌与其目标位置之间距离(不考虑夹在其间的将牌)的总和。
分析上述⑴中两种估价函数求解8 数码问题的效率差别,给出一个是 p(n)的上界的h(n)?的定义,并测试使用该估价函数是否使算法失去可采纳性。
实验原理:
1. 问题描述:
在3×3 的棋盘,摆有八个棋子,每个棋子上标有1 至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格(以数字0 来表示),与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。
2. 算法思想
启发式搜索算法A(简称为A算法)的基本思想是:定义一个评价函数f,对当前的搜索状态进行评估,找出一个最有希望的节点来扩展。
评价函数的形式如下:
f(n)=g(n)+h(n),其中n是被评价的节点。
定义:
– g*(n):表示从初始节点s到节点n的最短路径的耗散值;
– h*(n):表示从节点n到目标节点g的最短路径的耗散值;
– f*(n)=g*(n)+h*(n):表示从初始节点s经过节点n到目标节点g的最短路径的耗散值。
? f(n)、g(n)和h(n)分别是对f*(n)、g*(n)和h*(n)三个函数值的估计值,是一种预测。
A算法就是利用这种预测来达到有效搜索。它每次按照f(n)值的大小对待扩展的节点进行排序,f值小的节点放在前面,而f值大的节点则被放在后面,每次扩展节点时都是选择当前f值最小的节点来优先扩展。
本实验中我们使用函数 p(n),其值是节点 n与目标状态节点相比较,每个错位棋牌在
假设不受阻拦的情况下,移动到目标状态相应位置所需走步(移动次数)的总和。显然 p(n)
比w(n)更接近于h*(n),因为p(n)不仅考虑了错位因素,还考虑了错位的距离。
3. 算法伪代码描述
① OPEN:=(s),f(s):=g(s)+h(s);
② LOOP:IF OPEN=( )THEN EXIT(FAIL);
③ n:=FIRST(OPEN);
④ IF GOAL(n)THEN EXIT(SUCCESS);
⑤ REMOVE(n,OPEN),ADD(n,CLOSED);
⑥ EXPAND(n)→{mi},计算f(n,mi)=g(n,mi)+h(mi);g(n,mi)是从s通过n到mi的耗散值,f(n,mi)是从s通过n、mi到目标节点耗散值的估计。
? ADD(mj,OPEN),标记mj到n的指针。
? IF f(n,mk)f(mk)THEN f(mk):=f(n,mk),标记mk到n的指针;比较f(n,mk)和f(mk),f(mk)是扩展n之前计算的耗散值。
? IF f(n,ml)f(ml)THEN f(ml):=f(n,ml),标记ml到n的指针,ADD(ml,OPEN);当f(n,ml)f(ml)时,把ml重放回OPEN中,不必考虑修改到其子节点的指针。
⑦ OPEN中的节点按f值从小到大排序;
⑧ GO LOOP;
实验程序及其说明:
1)int goal[N][N],struct Chessboard:
试验中我定义goal 数组为目标状态——{1,2,3,8,0,4,7,6,5}。结构体Chessboard 记录棋盘信息,其中变量pos 数组坐标记录每个数码a 的位置,其值为数码a。d 表示该棋盘的深度,f 为启发函数值,move 为父节点移动到该节点的方式,以便在输出时告诉用户该如何移动棋子知道目标状态。
2)struct LNode:
定义节点LNode 结构体,存放该节点状态时的棋盘信息board,和指向父节点、下一节点的指针(*parent,*next),以及标记量flag——值为true 时表示该节点是最佳路径上的节点。
3)int* Findzero(LNode* Node):
为方便找到空格,我设计了找到该函数Findzero(*Node),以便找到当前节点空格所在位置以利于接下来的程序执行。返回值为空格所在的行和列。
4)int Wrong(LNode *Node)和int pick(LNode *Node):
分别为函数?(n)和 p(n)。
5)LNode* extend(LNode
原创力文档


文档评论(0)