启发式搜索-A*算法解决八数码问题
2011-04-22 16:05
323 查看
代码如下:
From [Artificial Intelligence: A System Approach]
From [Artificial Intelligence: A System Approach]
/* 用启发式算法——A*搜索来解决八数码问题 */ #include <stdio.h> #define MAX_BOARD 3*3 #define MAX_DEPTH 22 typedef struct BroadNode { int array[MAX_BOARD]; int g; int h; int f; int depth; struct BroadNode *parent; }BNode, *BiNode; /*估计函数h(n)的计算,等于错置的图块数*/ int evaluateBoard(BiNode T) { int i, score; const int test[MAX_BOARD-1]={1,2,3,4,5,6,7,8}; score = 0; for(i=0; i<MAX_BOARD-1; i++) score += (T->array[i] != test[i]); return score; } /*A*搜索,解决八数码问题*/ void astarEightNumber() { int i; BiNode cur_board_p, child_p, temp; while(listEmpty(&openList_p)==false) { /*从OPEN优先队列中,选取第一个,即f(n)最小的结点*/ cur_board_p = getListBest(&openList_p); putList(&closedList_p, cur_board_p); if(cur_board_p->h == 0) /*h(n)==0,则表示找到了目标结点*/ { /*输出路径过程,即从初始结点到目标结点路径上的每个结点*/ showSolution(cur_board_p); return; }else{ /*由于平均22步,就应该能找到解,故h(n)>22,则放弃该结点,继续查看其他的*/ if(cur_board_p->depth > MAX_DEPTH) continue; /*列举从当前状态(结点)出发,所有可能的移动(子结点),最多4种移法*/ for(i=0; i<4; i++) { /*找到下一个子结点*/ child_p = getChildBoard(cur_board_p, i); if(child_p == (BiNode)0) continue; /*如果child_p在CLOSED表中,则抛弃child_p,继续循环*/ if(onList(&closedList_p, child_p->array, NULL)){ nodeFree(child_p); continue; } child_p->depth = cur_board_p->depth+1; child_p->h = evaluateBoard(child_p); child_p->g = child_p->depth; child_p->f = child_p->h + child_p->g; /*如果child_p在OPEN表上,则*/ if(onList(&openList_p, child_p->array, NULL)) { temp = getList(&openLisy_p, child_p->array); if(temp->f < child_p->f) { nodeFree(child_p); putList(&openList_p, temp); continue; } nodeFree(temp); child_p->parent = cur_board_p; putList(&openList_p, child_p); }else { /*child_p既不在CLOSED表上,也不在OPEN表上,则将其插入OPEN表即可*/ child_p->parent = cur_board_p; putList(&openList_p, child_p); } } } }; }
相关文章推荐
- 启发式搜索解决8数码问题
- A*算法解决八数码问题的C++实现
- A*算法解决八数码问题
- A*算法解决八数码问题(C++版本)
- 算法篇-14-A*算法解决八数码问题
- 八数码问题-启发式搜索(A*算法)
- A*算法解决八数码问题 Java语言实现
- A*算法解决十五数码问题
- hdu 1043 A*算法解决八数码问题
- A*算法解决八数码问题 Java语言实现
- 用A*算法解决八数码问题 MATLAB
- A*算法解决八数码(九宫重排)问题
- A*算法解决八数码问题
- A*算法解决八数码问题
- BFS和A*算法分别解决N-数码问题
- A*算法解决八数码问题时,第N步的解空间是多少?
- A*算法解决八数码问题
- 关于八数码问题中的状态判重的三种解决方法(编码、hash、<set>)
- 8数码问题解决方案
- 八数码问题-A*算法