基于A星算法解决8数码问题的编程实现基于A*算法解决把数码问题《人工智能》专业:信息与计算科学班级:101001学号:101001102姓名:陈斌指导老师:时华日期:2013年10月14日一、问题描述8数码问题又称9宫问题,与游戏“华容道”类似
意在给定的棋格的8个格子内分别放一个符号,符号之间互不相同,余下的一格为空格
并且通常把8个符号在棋格上的排列顺序称作8数码的状态
开始时,规则给定一个初始状态和一个目标状态,并要求被试者对棋格内的符号经过若干次移动由初始状态达1基于A星算法解决8数码问题的编程实现到目标状态,这个过程中只有空格附近的符号可以朝空格的方向移动,且每次只能移动一个符号
为方便编程和表示,本文中8个格子内的符号分别取1—8的8个数字表示,空格用0表示
并给定8数码的初始状态和目标状态分别如图1、2所示
2基于A星算法解决8数码问题的编程实现图1初始状态图2目标状态则要求以图1为初始状态,通过交换0和0的上、下、左、右四个方位的数字(每次只能和其中一个交换),达到图2所示目标状态
二、算法设计根据任务要求,本文采用A*搜索算法
但要在计算机上通过编程解决该问题还应当解决该问题在计算机上表示的方式,并设计合适的启发函数,以提高搜索效率
①状态的表示在A*算法中,需要用到open表和closed表,特别是在open表中,待扩展节点间有很严格的扩展顺序
因此在表示当前状态的变量中,必须要有能指向下一个扩展节点的指针,以完成对open表中元素的索引
从这一点上看,open表中的元素相互间即构成了一个线性表,因此初步选定使用结构体表示问题的状态
如图3所示,表示问题的结构体包括表示当前节点状态的DATA和指向open表中下一个待扩展节点的指针NEXT
3基于A星算法解决8数码问题的编程实现图3结构体现在进一步考虑DATA中包括的内容:如图1、2所示,8数码问题的提出