嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的实际代价g(n)以及从节点n到达目标节点的估价代价h(n),且,为节点到目的结点的最优路径的代价。
八数码问题是在3×3的九宫格棋盘上,摆有8个刻有1~8数码的将牌。棋盘中有一个空格,允许紧邻空格的某一将牌可以移到空格中,这样通过平移将牌可以将某一将牌布局变换为另一布局。针对给定的一种初始布局或结构(目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。如下图表示了一个具体的八数码问题求解。
void move(node*head, int goalpos[9])
{
if (ifhistory(head))
return;
node *origin = new node;
if (ifsame(head,goalpos))//成功找到一条路,溯回并打印路径
{
cout << "根据A*算法,最佳路径如下:"<< endl;
head->next = NULL;
origin = head;
while (origin->last)
origin = origin->last;
drawnum(origin);
return;
}
node*temp = new node;
head->next = temp;
temp->last = head;
copynodedata( head,temp);
temp->depth = head->depth;
temp->depth = 1;
switch (head->position[0])//表示head节点中0的位置(1到9)
{
case 1:
{
int f[2];
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 1, 4);
updatef(temp, goalpos);
f[1] = getf(temp);
if (f[1] <f[0])
move(temp, goalpos);
else if (f[1] >f[0])
{
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
else
{
move(temp, goalpos);
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 2:
{
int f[3];
exchangestate(temp, 2, 1);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 2, 3);
updatef(temp, goalpos);
f[1] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 2, 5);
updatef(temp, goalpos);
f[2] = getf(temp);
int min = f[0];
for (int i = 0; i < 3; i )
{
if (f[i] <= min)
min = f[i];
}
if(min==f[2])
move(temp, goalpos);
if (min == f[0])
{
copynodedata(head, temp);
exchangestate(temp, 2,1);
updatef(temp, goalpos);
move(temp, goalpos);
}
if(min == f[1])
{
copynodedata(head, temp);
exchangestate(temp, 2, 3);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 3:
{
int f[2];
exchangestate(temp,3,2);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 3,6);
updatef(temp, goalpos);
f[1] = getf(temp);
if (f[1] <f[0])
move(temp, goalpos);
else if (f[1] >f[0])
{
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
else
{
move(temp, goalpos);
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 4:
{
int f[3];
exchangestate(temp, 4,1);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp,4,5);
updatef(temp, goalpos);
f[1] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 4,7);
updatef(temp, goalpos);
f[2] = getf(temp);
int min = f[0];
for (int i = 0; i < 3; i )
{
if (f[i] <= min)
min = f[i];
}
if (min == f[2])
move(temp, goalpos);
if (min == f[0])
{
copynodedata(head, temp);
exchangestate(temp, 4,1);
updatef(temp, goalpos);
move(temp, goalpos);
}
if (min == f[1])
{
copynodedata(head, temp);
exchangestate(temp, 4,5);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 5:
{
int f[4];
exchangestate(temp, 5,2);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp,5,4);
updatef(temp, goalpos);
f[1] = getf(temp);
copynodedata(head, temp);
exchangestate(temp,5,6);
updatef(temp, goalpos);
f[2] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 5,8);
updatef(temp, goalpos);
f[3] = getf(temp);
int min = f[0];
for (int i = 0; i <4; i )
{
if (f[i] <= min)
min = f[i];
}
if (min == f[3])
move(temp, goalpos);
if (min == f[0])
{
copynodedata(head, temp);
exchangestate(temp, 5,2);
updatef(temp, goalpos);
move(temp, goalpos);
}
if(min==f[1])
{
copynodedata(head, temp);
exchangestate(temp, 5,4);
updatef(temp, goalpos);
move(temp, goalpos);
}
if (min == f[2])
{
copynodedata(head, temp);
exchangestate(temp, 5,6);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 6:
{
int f[3];
exchangestate(temp,6,3);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 6,5);
updatef(temp, goalpos);
f[1] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 6,9);
updatef(temp, goalpos);
f[2] = getf(temp);
int min = f[0];
for (int i = 0; i < 3; i )
{
if (f[i] <= min)
min = f[i];
}
if (min == f[2])
move(temp, goalpos);
if (min == f[0])
{
copynodedata(head, temp);
exchangestate(temp, 6,3);
updatef(temp, goalpos);
move(temp, goalpos);
}
if (min == f[1])
{
copynodedata(head, temp);
exchangestate(temp,6,5);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 7:
{
int f[2];
exchangestate(temp, 7,4);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp,7,8);
updatef(temp, goalpos);
f[1] = getf(temp);
if (f[1] <f[0])
move(temp, goalpos);
else if (f[1] >f[0])
{
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
else
{
move(temp, goalpos);
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 8:
{
int f[3];
exchangestate(temp,8,7);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp,8,5);
updatef(temp, goalpos);
f[1] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 8,9);
updatef(temp, goalpos);
f[2] = getf(temp);
int min = f[0];
for (int i = 0; i < 3; i )
{
if (f[i] <= min)
min = f[i];
}
if (min == f[2])
move(temp, goalpos);
if (min == f[0])
{
copynodedata(head, temp);
exchangestate(temp, 8,7);
updatef(temp, goalpos);
move(temp, goalpos);
}
if (min == f[1])
{
copynodedata(head, temp);
exchangestate(temp,8,5);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
case 9:
{
int f[2];
exchangestate(temp, 9, 6);
updatef(temp, goalpos);
f[0] = getf(temp);
copynodedata(head, temp);
exchangestate(temp, 9, 8);
updatef(temp, goalpos);
f[1] = getf(temp);
if (f[1] <f[0])
move(temp, goalpos);
else if (f[1] >f[0])
{
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
else
{
move(temp, goalpos);
copynodedata(head, temp);
exchangestate(temp, 1, 2);
updatef(temp, goalpos);
move(temp, goalpos);
}
}break;
default:
{
;
}break;
}
}