- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
九宫格的A算法实现.doc
九宫格的A*算法实现
2003级研究生 刘娜
学 号: 2062003007
一、A*算法概述
A*算法是寻找最优路径的搜索算法之一。常见的最优路径搜索算法有大英博物馆过程、分支界限搜索等。与其它搜索算法相比,A*算法具有较高的搜索效率。本质上,A*搜索过程是带低估值的分枝限界搜索过程与动态规划搜索过程的结合。
A*算法的核心是一个估价函数:f(x)=g(x)+h(x),它是对从初始状态S0经过当前状态x到达目标状态S的整个路径的估计长度。其中g(x)是对已走距离的估计函数,h(x)是对当前状态到目标状态距离的估计。在A*搜索过程中,用整个路径的估计长度对部分路径进行排序,每次选择具有最短估计长度的部分路径进行扩展。
如果打分函数f能够准确反映实际路径长度,则能使搜索限定在最短路径上。但是,打分函数是关于路径长度的预期,这种预期值不一定准确。公式的第一部分,是利用已经得到的信息计算出来的,可以认为是准确的;第二部分是对到达目标结点所余下路径长度的估计值,往往不准确。这种误差对搜索选择有很大影响。为了保证能得到最优路径,A*算法要求对长度的估计值低于实际长度。此时,实际长度是打分函数的上限。这样当找到一条到达目标结点的路径时,若它不是最短的,则存在估计长度更小的路径可以扩充。
因此,A*算法要求h(x)≤h*(x),其中h*(x)是当前状态到目标状态距离的准确值。
A*算法的搜索过程可以简单表述为:
1、建立部分路径的队列,该队列的初始值只包含一条由开始结点组成的部分路径;
2、Until 队列为空,或队列的第一条路径到达目标结点:
2a 若队列第一条路径到达目标结点,空操作;
2b 若队列第一条路径没有到达目标结点:
2b1 移出第一条路径;
2b2 将移出的路径扩展一步,形成新路径;
2b3 新路径加入队列;
2b4 按估计长度将队列中的路径排序,最短估计长度的路径在队列之首;
2b5 若两个或多个路径到达一个公共结点,保留最短路径长度的路径,余者从队列中移出。
3、若发现队列的第一条路径到达目标结点,宣布成功,否则宣布失败。
二、九宫格问题的A*算法实现
1、问题描述
九宫格问题可以描述为:将数字1~8随机放到3×3???方格中,每次可将空格进行上移、下移、左移或者右移操作。寻找操作序列,使得数字到达顺序排放的目标状态。用图表描述如下:
85……
62413712345678图1 九宫格问题描述示意图
2、状态表示
我们将一个状态的9个格子按照从上到下,从左到右的顺序进行编号,用一个长度为9的字符串表示九宫格问题的一个状态,第i个位置表示第i个格子,该位置的内容表示格子当中的数字,用0表示空格。这样,图1所示问题的初始状态可以表示成“856204137”;目标状态可以表示成“123456780”。
3、操作定义
我们以空格为参照点,定义了四种操作:空格上移、空格下移、空格左移和空格左移。基于前面介绍的状态表示,假设空格(0)是状态字符串中的第i个字符,四个操作的前提条件和具体操作如表1所示。
操作名称前提条件具体操作空格上移空格不在第一行,即i3将状态字符串的第i个字符(0)和第i-3个字符交换空格下移空格不在第三行,即i7将状态字符串的第i个字符(0)和第i+3个字符交换空格左移空格不在第一列,即(i mod 3)1将状态字符串的第i个字符(0)和第i-1个字符交换空格右移空格不在第三列,即(i mod 3)0将状态字符串的第i个字符(0)和第i+1个字符交换表1 操作定义表
4、启发函数定义
按照老师的提示,我们定义了两个启发函数:f1(x)=g(x)+h1(x)和f2(x)=g(x)+h2(x)。其中g(x)表示状态x在状态空间中的深度,即从初始状态S0到当前状态已走的操作数;h1(x)表示不在目标位置上的数字个数;h2(x)表述所有数字当前位置与目标位置的距离的和。例如,当x为“856204137”时,h1(x)的值为9,即9个数字都不在目标位置上;h2(x)的值为3+1+1+2+2+2+2+3+1=17。
5、问题求解
首先定义数据结构:
type
ptnode=^tnode; //一个九宫格状态的指针
tnode=record //一个九宫格状态
s:string; //0~9组成的字符串,表示状态的具体内容
g,h:integer; //对已走路径(深度)和剩余距离的估价函数
parent,next:ptnode; //父亲节点指针,为建立链表而保留的指向下一个节点的指针
end;
定义了三个链表:Open表、Clo
文档评论(0)