您的位置:首页 > 其它

启发式搜索-A*算法解决八数码问题

2011-04-22 16:05 323 查看
代码如下:

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);
}
}
}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: