文档介绍:A*算法实验报告
实验目的
熟悉和掌握启发式搜索的定义、估价函数和算法过程
学会利用A*算法求解N数码难题
理解求解流程和搜索顺序
实验原理
A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的 有序搜索,总是选;
while (index != 0)
{
(node_v[index]);
index = node_v[index]. index;
} -
for (int i = () -1; i >= 0; i--)〃输出每一步的探索过程 cout « "Step " « () - i
« endl « rstep_v[i] « endl;
} -
void Swap(int& a, int& b)
{
int t;
t = a;
a = b;
b = t;
}
void Assign(Node& node, int index)
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++)
[i][j] = node_v[index].digit[i][j];
int GetMinNode() //找到最小的节点的位置即最优节点 {
int dist = MAXNUM;
int loc; // the location of minimize node
for (int i = 0; i < (); i++)
{ —
if (node_v[i].dist == MAXNUM)
continue;
else if ((node_v[i].dist + node_v[i].dep) < dist) {
loc = i;
dist = node_v[i].dist + node_v[i].dep;
}
}
return loc;
}
bool isExpandable(Node& node)
{
for (int i = 0; i < (); i++) {
if (isEqual(i, ))
return false;
}
return true;
}
int Distance(Node& node, int digit[][COL])
{
int distance = 0;
bool flag = false;
for(int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++)
for (int k = 0; k < ROW; k++) {
for (int I = 0; I < COL; I++) {
if ([i][j] == digit[k][l]) (
distance += abs(i - k) + abs(j -1);
flag = true;
break;
}
else
flag = false;
}
if (flag)
break;
}
return distance;
}
int MinDistance(int a, int b)
{
return (a < b ? a : b);
}
void ProcessNode(int index)
{
int x, y;
bool flag;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (node_v[index].digit[i][j] == 0)
{
x=i; y = j;
flag = true;
break;
}
else flag = false;
}
if(flag)
break;
}
Node node_up;
Assign(node_up, index);〃向上扩展的节点 int dist_up = MAXDISTANCE;
if (x > 0)
Swap([x][y], [x - l][y]); if (isExpandable(node_up))
dist_up = Distance(node_up, );
= index;
= dist_up;
= node_v[index].dep + 1;