实例介绍
【实例简介】
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;
}
}
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论