8数码问题-S201307154.doc

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8数码问题-S201307154

基于A星算法解决8数码问题的编程实现 1.问题描述 8 数码问题又称9 宫问题与游戏“华容道”类似。意在给定3*3棋格的8个格子内分别放一个符号.符号之间互不相同,余下的一格为空格。并且通常把8 个符号在棋格上的排列顺序称作8 数码的状态。开始时规则给定一个初始状态和一个目标状态并要求被试者对棋格内的符号经过若干次移动由初始状态达到目标状态这个过程中只有空格附近的符号可以朝空格的方向移动且每次只能移动一个符号。 为方便编程和表示,本文中8 个格子内的符号分别取1—8的8 个数字表示.空格用0 表示.并给定8数码的初始状态和和目标状态分别如图1,2所示。 382105764 102843765 图1 初始状态 图二 目标状态 则要求以图1 为初始状态.通过交换0和0的上、下、左、右四个方位的数字(每次只能和其中一个交换),达到图2 所示目标状态。 2.算法设计 2.1启发式图搜索过程* 核心思想:利用所处理问题的启发信息引导搜索 目的:减少搜索范围,降低问题复杂度. 启发式图搜索算法 A 基本思路:定义一个评价函数 f,对当前待搜索状态进行评估(既考虑从起始节点到节点 n 的花费,又考虑从节点 n 到达目标节点的费用),然后找出一个最有希望的节点来扩展. 函数形式为:f (n)= g (n)+ h (n) . n 为被评价的节点。 用此函数值来排列 OPEN 表中节点顺序的图搜索算法称为 A 算法. 函数符号说明: g*(n)、h*(n):表示各部分实际最短路径的耗散值. f*(n) = g*(n) + h*(n):表示从S出发,通过节点n到目标节点 g 的最短路径的耗散值. f (n)、g (n) 和 h (n) 为相应路径耗散值的估计值,是一种预测。 A 算法就是利用这种预测,来达到有效搜索的目的. g(n)可根据搜索历史情况对 g*(n)作出估计,显然有 g(n)= g*(n). h(n)则依赖于启发信息,通常称为启发函数,是要对未来扩展的方向作出估计. 算法的伪代码如下: 1. OPEN:=(s),f(s):=g(s)+h(s); 2. LOOP: IF OPEN=( ) THEN EXIT(FAIL); 3. n:=FIRST(OPEN); 4. IF GOAL (n) THEN EXIT(SUCCESS); 5.??REMOVE (n, OPEN), ADD(n, CLOSED);? 6. EXPAND(n)→ (mi),把mi作为n的后继节点添入G,并计算 f(n-mi)=g(n-mi)+h(mi); ADD (mj, OPEN), ? IF f(n-mk) f(mk) THEN f(mk):=f(n-mk), ? IF f(n-ml) f(ml) THEN f(ml):=f(n-ml), ADD(ml,OPEN); 7. OPEN 中的节点按 f 值从小到大排序; 8.?GO LOOP; 算法的说明: A 算法由一般的图搜索算法改变而成.算法的控制策略是按照 f(n)值递增的顺序对 OPEN 中的元素进行排序,f(n)值小的节点排在前面,大的放在 OPEN 表的后面. 每次扩展节点时,优先选择当前 f(n)值最小的节点来扩展. 2.2八数码问题具体事例 根据任务要求,本文采用A*算法.根据上面A*算法的原理,应该设计合适的启发函数,已经合适的存储结构,以提高效率。 2.2.1存储结构选择 在A*算法中需要用到open表和close表,在A*算法中open表中的结点有严格的顺序,即应按是一个按照f(n)的严格的递增的有序序列,又因为每个结点都要记录当前的状态,以及方便查找到下一个结点,因此我们使用结构体表示问题的状态,同时因为open和close均是一个线性表,而且要便于删除和插入,从而选择链表作为存储结构。 2.2.2结构体中成员变量的选择 因为8数码是用一个3*3的数组表示的,所以这里我们在结构体变量中需要有一个 Cur_S[3][3],来保存当前8数码的状态。为了保证在搜索到目标状态后能够顺利复现寻优路径,我们需要定义一个Prior指针指向该解路径上该节点的父节点。同时因为我们在寻找目标结点的过程中需要对open表进行扩展,从而我们还需要用一个指针Next指针指向扩展结点,当然扩展结点的插入要遵循递增的规则。 为提高程序的运行效率

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档