人工智能导论——A*算法实验

这篇具有很好参考价值的文章主要介绍了人工智能导论——A*算法实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的:

熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。

二、实验原理:

A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的实际代价以及从节点n到达目标节点的估价代价。

A*算法中,若对所有的x存在h(x)≤h*(x),则称h(x)为的下限,表示某种偏于保守的估计。采用的下限h(x)为启发函数的A算法,称为A*算法,其中限制:h(x)≤h*(x)十分重要,它能保证A*算法找到最优解。在本问题中,g(x)相对容易得到,就是从初始节点到当前节点的路径代价,即当前节点在搜索树中的深度。关键在于启发函数h(x)的选择,A*算法的搜索效率很大程度上取决于估价函数h(x)。一般而言,满足h(x)≤h*(x)前提下,h(x)的值越大越好,说明其携带的启发性信息越多,A*算法搜索时扩展的节点就越少,搜索效率就越高。

传统的BFS是选取当前节点在搜索树中的深度作为g(x),但没有使用启发函数h(x),在找到目标状态之前盲目搜索,生成了过多的节点,因此搜索效率相对较低。

实验分别使用不在位的元素个数和曼哈顿距离作为启发函数h(x)。每次从open表中选取时,优先选取估价函数最小的状态来扩展。

A*算法的估价函数可表示为:

    f'(n) = g'(n) + h'(n) 

这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值(也称为最小耗或最小代价),h'(n)是n到目标的最短路经的启发值。由于这个f'(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:

f(n) = g(n) + h(n) 

其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点

的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。这样必须满足两个条件:

(1)g(n)>=g'(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。

(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)<=h'(n);

二点特别的重要。可以证明应用这样的估价函数是可以找到最短路径的。

具体步骤:从初始状态S_0出发,分别采用不同的操作符作用于生成新的状态x并将其加入open表中(对应到状态空间图中便是根节点生成新的子节点n) ,接着从open表中按照某种限制或策略选择一个状态x使操作符作用于x又生成了新的状态并加入open表中(状态空间图中相应也产生了新的子节点),如此不断重复直到生成目标状态。

对于以上所述的“某种策略”,在图搜索过程中,若该策略是依据进行排序并选取最小的估价值,则称该过程为A算法。

三、实验内容:

1       参考A*算法核心代码(原程序输出如下图1),以8数码问题为例实现A*算法的求解程序,要求设计两种不同的估价函数。

两种启发函数h(x)

不在位的元素个数

int calw(string s)     //计算该状态的不在位数h(n)

{

int re=0;

for(int i=0;i<9;i++) if(s[i]!=t[i]) re++;

return re;

}

曼哈顿距离

int distance(string s) {

int count=0,begin[3][3],end[3][3];           //count记录所有棋子移动到正确位置需要的步数

for(int i = 0; i < 8; i++){

begin[i/3][i%3]=s[i];

end[i/3][i%3]=t[i];

}

for(int i = 0; i < 3; i++)   //检查当前图形的正确度

for(int j = 0; j < 3; j++)

{

if(begin[i][j] == 0)

continue;

else if(begin[i][j] != end[i][j])

{

for(int k=0; k<3; k++)

for(int w=0; w<3; w++)

if(begin[i][j] == end[k][w])

count = count + fabs(i-k*1.0) + fabs(j-w*1.0);

}

}

return count ;

}

人工智能导论——A*算法实验图1 原程序输出

 

2       在求解8数码问题的A*算法程序中,增加初始状态和目标状态逆序对数奇偶性判断,然后设置相同的初始状态和目标状态(如下图2所示),针对不同的估价函数,求得问题的解,并比较它们对搜索算法性能的影响,包括扩展节点数、生成节点数等,参考输出如下图3所示。

计算逆序对:

int  num(string s){

int a = 0;

for (int i = 0; i < 9; i++){

if (s[i] == '0')

continue;

for (int j = i+1; j < 9; j++)

    {

if (s[j] == '0')continue;

if (s[i]>s[j]) a++;}

}

return a;

}

若逆序对的奇偶性不一样,则返回报错(写在solve函数中):

int k1=num(t);

int k2=num(p.s);

if(k1%2 != k2%2)

    {cout<<"有错"<<endl;

    return -1;

 }

目标状态设定:

const string t="123456780";

初始状态:

“486703215”

         人工智能导论——A*算法实验

                                                     初始状态              目标状态

人工智能导论——A*算法实验

人工智能导论——A*算法实验

                                                                  图2

不同启发函数性能比较如表2

表2不同启发函数比较

启发函数h(n)

不在位数

曼哈顿距离

广度优先(0)

初始状态

486703215

486703215

486703215

目标状态

123456780

123456780

123456780

最优解

人工智能导论——A*算法实验

 人工智能导论——A*算法实验

 

人工智能导论——A*算法实验 

 

人工智能导论——A*算法实验

 人工智能导论——A*算法实验

 人工智能导论——A*算法实验

人工智能导论——A*算法实验

 人工智能导论——A*算法实验

 

扩展节点数

10374

2183

102659

生成节点数

15715

3506

123849

运行时间

0.297s

0.159s

1.742s

3  对于8数码问题,设置与上述2相同的初始状态和目标状态,用宽度优先搜索算法(即令估计代价h(n)=0的A*算法)求得问题的解,以及搜索过程中的扩展节点数、生成节点数。

即:h(n)=0

程序设定:p.w=0;

用宽度优先进行搜索的结果如上表。

  1. 参考A*算法核心代码,试修改成能求解15数码问题的代码,15数码问题的初始状态(初始棋局)和目标状态(目标棋局)如下,要求给出问题的解,以及搜索过程中的扩展节点数、生成节点数。

因为两位数的数字输出不太方便,把[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0]改为[

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O],输入依旧以数字输入。

例如:11 9 4 15 1 3 0 12 7 5 8 6 13 2 10 14

5 1 3 4 2 6 7 8 9 10 12 0 13 14 11 15

运行了很久,发现用不在位数做启发函数,运行不出来。

用曼哈顿距离做启发函数,还是比较快的。

试验结果如图4   

                     人工智能导论——A*算法实验

                     人工智能导论——A*算法实验

               

图4 15数码搜索结果

可知:生成节点数为:244266

      扩展节点数为:126723

      搜索时间为:  2.388s

5数码修改的部分代码:

人工智能导论——A*算法实验

 

6提交实验报告和源程序。

四、实验结果 

1        在求解8数码问题的A*算法程序中,增加初始状态和目标状态逆序对数奇偶性判断是否有解,然后设置相同的初始状态和目标状态,针对不同的估价函数,求得问题的解,并比较它们对搜索算法性能的影响,包括扩展节点数、生成节点数等。

在相同输入和目标情况下,结果比较如表3(来源表2)

表3不同估价函数结果比较

估价函数

不在位数

曼哈顿距离

宽度优先

扩展节点数

10374

2183

102659

生成节点数

15715

3506

123849

运行时间

0.297s

0.159s

1.742s

扩展节点为count1,生成节点为count2,实验结果和要求的节点数均在实验内容2中。

输入和目标相同时,可得曼哈顿距离做估价函数比不在位数做估价函数更好,曼哈顿距离做估价函数的生成节点和扩展节点只有两三千,不在位数做估价函数的生成节点和扩展节点都超过了一万,可知搜索空间也少很多,曼哈顿做估价函数的效率高很多。

2        根据宽度优先搜索算法和A*算法,分析启发式搜索的特点。

广度优先搜索法在有解的情形总能保证搜索到最短路经,也就是移动最少步数的路径。但广度优先搜索法的最大问题在于搜索的结点数量太多,因为在广度优先搜索法中,每一个可能扩展出的结点都是搜索的对象。随着结点在搜索树上的深度增大,搜索的结点数会很快增长,并以指数形式扩张,从而所需的存储空间和搜索花费的时间也会成倍增长。

我们可以发现采用A*算法求解八数码问题时间以及搜索的节点数目远远小于采用宽度优先搜索算法,这说明对于八数码问题,选用的启发性信息有利于搜索效率的提高。

3          对比15数码和8数码问题,试分析A*算法求解不同问题规模的性能。

当使用不在位数做估价函数改进8数码代码,程序运行很长时间也没有结果。所以若问题规模过大,使用A星算法时要设计好估价函数,设计的不合适就会使搜索空间太大了,一直没有结果。本实验中采用曼哈顿距离做估价函数,搜索还是很快的,有20多万的生成节点和10多万的扩展节点,使用曼哈顿做估价函数效率很高,时间也只有2s多。

五实验总结:

通过这次实验,使我对启发式搜索算法有了更进一步的理解,尤其是对估价函数的应用和设计上有了一定的体会,一个合适高效的估价函数对于启发式搜索算法来说是十分重要的。文章来源地址https://www.toymoban.com/news/detail-456661.html

到了这里,关于人工智能导论——A*算法实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能导论课堂笔记

    时间:2022年10月19日下午 班级:2022级人工智能应用技术1班 作业问题: Python安装注意事项 1.下载Python3.X的版本,如:3.10, 3.9, 3.8,不推荐下载2.7版本(已经不使用) 2.在命令行中,无法运行path-添加,需要知道安装的路径; Pycharm安装注意: 1.官网下载,推荐下载免费(社区

    2024年02月01日
    浏览(24)
  • 《人工智能及其应用》第4章书后题 | 西电《人工智能导论》作业

    教材对应第6版。答案仅供参考,都是我从网上四处搜索和自己编的。 4-1计算智能的含义是什么?它涉及哪些研究分支? 4-2试述计算智能(CI)、人工智能(AI)和生物智能(BI)的关系。 4-3人工神经网络为什么具有诱人的发展前景和潜在的广泛应用领域? 4-4简述生物神经元

    2024年02月07日
    浏览(21)
  • 【人工智能】实验四:遗传算法求函数最大值实验与基础知识

    实验目的 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传算法求解函数优化问题,理解求解流程并测试主要参数对结果的影响。 实验内容 采用遗传算法求解函数最大值。 实验要求 1. 用遗传算法求解下列函数的最大值,设定求解精度到15位小数。 (1)给出适应度

    2024年02月03日
    浏览(28)
  • 人工智能原理实验4(1)——遗传算法、蚁群算法求解TSP问题

    TSP问题是组合数学中一个古老而又困难的问题,也是一个典型的组合优化问题,现已归入NP完备问题类。NP问题用穷举法不能在有效时间内求解,所以只能使用启发式搜索。遗传算法是求解此类问题比较实用、有效的方法之一。下面给出30个城市的位置信息: 应用遗传算法和蚁

    2024年01月24日
    浏览(31)
  • 【人工智能】实验三 A*算法求解八/十五数码问题实验与基础知识

    熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。 以8数码问题和15数码问题为例实现A*算法的求解程序(编程语言不限)。 设计两种不同的估价函数。 设置相同的初始状态和目标状态,针对不同的估价函数,求得

    2024年02月03日
    浏览(39)
  • 人工智能导论——机器人自动走迷宫&强化学习

    强化学习是机器学习中重要的学习方法之一,与监督学习和非监督学习不同,强化学习并不依赖于数据,并不是数据驱动的学习方法,其旨在与发挥智能体(Agent)的主观能动性,在当前的状态(state)下,通过与环境的交互,通过对应的策略,采用对应的行动(action),获得一定的奖

    2024年02月06日
    浏览(34)
  • 人工智能与大数据技术导论-13011知识点记录

    2024年开始,因自考改革,新增了《人工智能与大数据技术导论》科目(豆瓣链接:https://book.douban.com/subject/30765078/) 下面是我依据考纲整理的知识点: 第1章“人工智能概述” 需要掌握:AI概念和历史发展;AI技术的成熟度;AI与云计算和大数据的关系。 1.1、AI概念: 人工智

    2024年03月24日
    浏览(25)
  • 大数据导论(2)---大数据与云计算、物联网、人工智能

     1. 首先从商业角度给云计算下一个定义:通过网络、以服务的方式为千家万户(包含政府、企业和个人用户)提供非常廉价的IT资源。  2. 云计算是一种全新的技术,包含了虚拟化、分布式存储、分布式计算、多租户等关键技术。云计算实现了通过网络提供可伸缩的、廉价

    2024年01月20日
    浏览(28)
  • 人工智能-实验四

    ​ 了解深度学习的基本原理。能够使用深度学习开源工具。学习使用深度学习算法求解实际问题。 1.深度学习概述 ​ 深度学习源于人工神经网络,本质是构建多层隐藏层的人工神经网络,通过卷积,池化,误差反向传播等手段,进行特征学习,提高分类或预测的准确性。深

    2024年02月08日
    浏览(25)
  • 人工智能 归结原理实验报告

    一、实验目的 加深学生对归结原理进行定理证明过程的理解,掌握基于谓词逻辑的归 结过程中子句变换过程、替换与合一算法即归结策略等重要环节,进一步了解实 现机器自动定理证明的步骤。 二、实验内容 对于任意一阶谓词逻辑描述的定理,给出基于归结原理的证明过

    2023年04月08日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包