资源下载地址:https://download.csdn.net/download/sheziqiong/85931258
资源下载地址:https://download.csdn.net/download/sheziqiong/85931258

一、启发式搜索

1. 算法原理

启发式搜索又叫有信息的搜索,它利用问题所拥有的启发信息来引导搜索,达到减少搜索范围,降低问题复杂度的目的。对于一个具体的问题,构造一个专用于该领域的启发式函数h(n)h(n)h(n), 该函数用于估计从节点n到达目标节点的成本 ,要求对于所有满足目标条件的节点n有:h(n)=0h(n)=0h(n)=0。

1.1 A*搜索

定义评价函数f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n),其中g(n)g(n)g(n)是从初始节点到达节点n的路径成本,h(n)h(n)h(n)是从nnn节点到达目标节点的成本的启发式估计值。 因此,f(n)f(n)f(n)是经过节点nnn从初始节点到达目标节点的路径成本的估计值。利用节点对应的f(n)f(n)f(n)来对边界上的节点进行排序。

A*搜索往往速度较快,但需要维护开启列表和关闭列表,并且需要反复查询状态,因此空间复杂度是指数级的。其具体步骤为:

  1. 将起点当做待处理点加入开启列表
  2. 搜索所有可以拓展的节点并加入开启列表,计算这些节点的f(x)f(x)f(x)
  3. 将起点从开启列表中移动到关闭列表
  4. 从开启列表中寻找f(x)f(x)f(x)最小的节点,将相邻节点加入开启列表,并将该节点移动到关闭列表。若相邻节点已经在开启列表则更新它的g(x)g(x)g(x)值
  5. 若找到目标节点(找到解)或开启列表为空(无解)则退出,否则重复步骤 4 。

1.2 IDA*算法

IDA* 是迭代加深深度优先搜索算法(IDS)的扩展。因为它不需要去维护表,因此它的空间复杂度远远小于A* 。在搜索图为稀疏有向图的时候,它的性能会比A*更好。在算法迭代的每一步,IDA*都会进行深度优先搜索,在某一步所有可以拓展到的节点对应的最小启发函数值大于某个给定阈值则进行剪枝。具体步骤为:

  1. 给定估价函数f(x)f(x)f(x)值的阈值,并将起点作为开始节点
  2. 计算当前节点所有邻居节点的估价函数,选取最小的一个。大于阈值的直接剪枝。
  3. 如果某个节点的估价函数大于阈值则将其作为下一次迭代的新的阈值
  4. 找到目标节点则返回结果

1.3 启发式函数的设计

  • 可采纳性:假设每个状态转移(每条边)的成本是非负的,而且不能无穷地小,假设h∗(n)h*(n)h∗(n)是从节点n到目标节点的最优路径成本(不连通则为无穷大)。当对于所有的节点nnn,满足h(n)<=h∗(n)h(n)<=h*(n)h(n)<=h∗(n)时,则称h(n)h(n)h(n)是可采纳的。也就是说,可采纳的启发式函数低估了当前节点到达目标节点的成本,使得实际成本最小的最优路径能够被选上。因此,对于任何目标节点g,有h(g)=0h(g)=0h(g)=0
  • 一致性(单调性):对任意节点n1n1n1和n2n2n2有:h(n1)≤cost(n1→n2)+h(n2)h(n1)\leq cost(n1\to n2)+h(n2)h(n1)≤cost(n1→n2)+h(n2)。满足一致性的启发式函数也一定满足可采纳性,大部分的可采纳的启发式函数也满足一致性/单调性。

可采纳性意味着最优性,最优解一定会在所有成本大于最优开销的路径之前被扩展到。因为一致性,搜索第一次扩展到某个状态,就是沿着最小成本的路径进行扩展的 ,而且在遍历节点n时,所有f值小于f(n)的节点都已经被遍历过了 。

也就是说,启发式函数的可采纳性和一致性是启发式搜索完备性和最优性的保证。

2. 流程图和伪代码

流程算法原理部分的步骤基本一致。

启发式搜索的终点在于启发式函数的设计和估价函数的计算:

input: open_list, close_list, g
/* 输入:开放列表、关闭列表、开放列表中每个元素对应的g(x)值 */
output: open_list, close_list, g
/* 输出:上述输入的更新后的结果 */def expandNode(open_list, close_list, g)/* 找到估价函数最小的节点 */for each_node in openlistf(each_node) = h(each_node) + g(each_node)node = 有最小f(x)值的节点/* 拓展该节点 */expand(node)     /* 将该节点移动到关闭列表 */close_list.append(node)open_list.delete(node)

拓展节点的过程和上述的宽度优先搜索基本相同,这里不再赘述。之后的代码展示会详细说明细节部分。

3. 代码展示

迷宫问题中,要求找最短路径,但不能越过障碍。因此可以考虑将启发式函数设计成Lp距离,可以越过障碍。

在初始化时,考虑不再同步存储由起点到每个节点的路径而是存储每个节点的父节点(起点的父节点为None),最终通过父节点一层层回推得到路径。起点的g(x)为0。

open_list = []              # 开启列表
open_parent_node = [None]   # 开启列表中每个节点对应的父节点
g = [0]                     # 开启列表中每个节点对应的 g(x) 值
close_list = []             # 关闭列表
close_parent_node = []      # 关闭列表中每个节点对应的父节点

在起点加入开放列表后,即可开始搜索:

其中在开放列表中寻找可拓展节点的具体函数如下:

然后对开放节点中的每一个节点进行遍历,计算估计函数值。其中h(x)定义为Lp距离,g(x)由列表g给出。同时记录当前的最小估计函数值与节点,方便之后的处理:

找到后对该节点的上下左右的节点进行拓展即可:

最终将该节点加入关闭列表:

拓展新节点的函数如下:

# 判断当前节点是否可以拓展并加入开放列表
def validNode(open_list, open_parent_node, g, x, y, x_expand, y_expand, min_idx):if maze[x_expand][y_expand] == '0' or maze[x_expand][y_expand] == 'E':# 若新节点已经出现在开放列表中if [x_expand, y_expand] in open_list:idx = open_list.index([x_expand, y_expand])if g[idx] < g[min_idx] + 1:g[idx] = g[min_idx] + 1open_parent_node[idx] = [x,y]# 若新节点不存在开放列表中else:open_list.append([x_expand,y_expand])open_parent_node.append([x,y])g.append(g[min_idx]+1)

新节点出现在开放列表中,则不需要将该节点加入开放列表,但是需要更新该节点的状态:若拓展的新节点的g(x)比记录中的小,则去小的那一个并且更新节点的父节点。否则直接将该节点加入开放列表且记录对应的父节点和开销g(x)。开销为父节点的开销 +1 。

需要注意的是,开放列表的节点是下一步可以到达的节点,而不是已经搜索过的节点,因此不需要考虑加入已拓展节点的集合。

最终将终点节点一步步向上回推父节点得到路径,逆序后即为解:

    idx = open_list.index(end_node)last_node = open_parent_node[idx]path = [end_node]while last_node is not None:path.append(last_node)last_node = close_parent_node[close_list.index(last_node)]path = path[::-1]

4. 实验结果及分析

程序最后,输出节点的拓展节点个数、路径长度(路径上的节点个数)、路径的具体步骤:

    print(len(expanded) + 1)print(len(path))print(path)

因为终点在开放列表中,没有算进但是应当算进已经拓展的节点,因此len(expanded)需要加 1 来修正。另外,打印的所谓的“路径长度”其实是路径上节点的个数。实际长度应该减一。

启发式函数h(x)h(x)h(x)和实际的到达终点的开销h∗(x)h^*(x)h∗(x)存在下列关系:

情形 性能
h(n)=0h(n)=0h(n)=0 只有g(n)g(n)g(n)起作用,退化为Dijkstra算法,保证找到最短路径
h(n)≤h∗(n)h(n)\leq h^*(n)h(n)≤h∗(n) 保证找到最短路径
h(n)=h∗(n)h(n)=h^*(n)h(n)=h∗(n) 只走最佳路线,不拓展额外节点。运行最快且保证找到最短路径
h(n)>h∗(n)h(n)>h^*(n)h(n)>h∗(n) 不保证找到最短路径

我尝试不同的启发式函数的结果(包括不合理的启发式函数):

函数 h(x)=0h(x)=0h(x)=0 Lp距离p=1p=1p=1 Lp距离p=2p=2p=2 Lp距离p=3p=3p=3 Lp距离p=∞p=\infinp=∞
拓展节点数 268 222 227 227 228
路径长度 69 69 69 69 69
开放列表最大节点数 9 9 9 9 9

考虑到之前的宽度优先搜索拓展了270个节点,路径长度为69;双向搜索拓展了194个节点,路径长度为69,通过比较可以看出,启发式函数的加入的确相较宽度优先搜索要快(拓展的节点数少了使得计算量减少了)。而无信息搜索的双向搜索优于启发式搜索。在更大的问题规模下或者选取更好的启发式函数可能更能体现启发式搜索的优越性。

另一方面,这几种情况下开放列表最大节点数都为9,在这几种不同的启发式函数下,看不出太大的空间复杂度的区别。在更大规模的问题上可能会有更明显的差别。

下面考虑使用曼哈顿距离(L1距离)的D倍作为启发式函数。D的设计是为了距离衡量单位与启发式函数相匹配,一般取方格间移动的最小代价,在迷宫问题中就是1。为了比较效果,尝试不同的D值:

D 值 0 0.5 1 1.5 2 3 4
拓展节点数 268 242 222 229 220 212 79
路径长度 69 69 69 69 69 69 77
开放列表最大节点数 9 8 9 8 8 8 6

D值和拓展节点数的关系如下:

| 77 |
| 开放列表最大节点数 | 9 | 8 | 9 | 8 | 8 | 8 | 6 |

D值和拓展节点数的关系如下:

在D值较小时,拓展节点数相差不太大,其路径长度都为69可以看出,都找到了最优解。在D达到4时,可以看到拓展节点数大大下降了,从200多直接降到了79,也就是运算效率大大提升了。同时,开放列表最大节点数也有一定的下降,所占内存空间变少了。然而,在这种情况下路径长度却变成了77,也就是说找到的解不是最优解。这就对应了上述启发式函数h(n)>h∗(n)h(n)>h^*(n)h(n)>h∗(n)的情况,启发式函数过大找到的解不是最优的。

资源下载地址:https://download.csdn.net/download/sheziqiong/85931258
资源下载地址:https://download.csdn.net/download/sheziqiong/85931258

Python实现的人工智能启发式搜索相关推荐

  1. python篮球-基于Python/Java的人工智能篮球训练系统的制作方法

    本发明涉及信息技术领域,尤其涉及一种基于Python/Java的人工智能篮球训练系统. 背景技术: 人工智能的发展已经开始渗透到各行各业.经过发明人的研究和检索,发现作为篮球训练,已经有专利申请.其中 ...

  2. python自学平台-Python编程和人工智能平台学习

    <Python编程和人工智能平台学习>教学大纲 课程编号:AI006001 课程名称:Python编程和人工智能平台学习 英文名称:Pythonprogramming and an int ...

  3. Python将是人工智能时代的最佳编程语言

    移动互联网取代PC互联网领跑在互联网时代的最前沿,Android和iOS一度成为移动互联网应用平台的两大霸主,成为移动开发者首选的两门技术,HTML5以其跨平台的优势在移动互联网应用平台占据重要位置, ...

  4. 关于python语言和人工智能哪个说法不正确_在 Windows 7 操作系统中,下列说法错误的是( )。_计算机文化基础答案_学小易找答案...

    [简答题]发布混合碱含量的测定三个锥形瓶的滴定终点颜色 [单选题]串行口工作在方式0时,其波特率:___. [简答题]使用两个数码管显示数字0--99,数字每秒钟自动加1,显示程序使用函数实现,延时在 ...

  5. 关于python语言和人工智能下哪个说法不正确_“在资源管理器”窗口中,文件夹图标左侧有“...

    [单选题]表示串行数据传输速率的指标为:___. [单选题]串行口工作在方式0时,其波特率:___. [简答题]发布混合碱含量的测定三个锥形瓶的滴定终点颜色 [简答题]将自己做的三个锥形瓶的滴定终点颜 ...

  6. 德州python培训_人工智能在多人桌德州扑克比赛中战胜世界顶尖选手

    新华社华盛顿7月11日电(记者周舟)美国卡内基-梅隆大学11日宣布,该校和脸书公司合作开发的人工智能Pluribus在六人桌德州扑克比赛中击败多名世界顶尖选手,成为机器在多人游戏中战胜人类的一个里程碑 ...

  7. 送书 | 一本针对零基础 AI 学习的书:Python入门到人工智能实战

    五月份北京大学出版社新出的一本书<Python入门到人工智能实战>,由吴茂贵等著作.它是一本针对零基础编程学习者编写的教程. 从初学者角度出发,每章以问题为导向,辅以大量的实例,详细地介绍 ...

  8. 三行python代码实现人工智能

    三行python代码实现人工智能 中野独立团团长李云龙 2018-12-25 09:28:05 话不多说直接上代码 while True: a=input() print(a) 有人说人工智能的本质就 ...

  9. python自学路线——人工智能方向

    ☞☞☞点击查看更多优秀Python博客☜☜☜ 人工智能方向 阶段一.Python基础入门.进阶.高级 阶段二.人工智能基础 阶段三.机器深度学习 什么是机器学习? 什么是深度学习? 阶段四.神经网络算 ...

最新文章

  1. 今年最新整理的《高频Java面试题集合》,聪明人已经收藏了!
  2. Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
  3. Python中通过PyPDF2实现PDF合并
  4. 比较两个时间字符串的大小
  5. 基于DirectUI技术开发的发卡系统
  6. 什么可以搜python答案_超星Python程序设计答案章节测试答案免费,能搜索网课答案的公众号...
  7. 莫名奇妙的异常001:Invalid or unexpected token
  8. jasperReport Studio java报表设计(详细)
  9. 欧盟网络安全局发布《供应链攻击威胁全景图》报告(下)
  10. 清晨晓叙:matlab中的矩阵拼接
  11. 学生选课管理系统(Java)
  12. 玩转安卓10源码开发定制(17)编译Windows平台adb和fastboot工具
  13. c语言关于指针的编程题,C语言指针编程题
  14. PSFTP工具的使用教程
  15. 桥接文件中file not found
  16. spurious wakeup -- 多线程之虚假唤醒
  17. VC++ 判断打印机状态
  18. 心路历程(七)-加入微医集团
  19. Vue问题——webpack `Invalid Host/Origin header`
  20. java 判断三角形计算面积

热门文章

  1. Linux云计算架构师成长之路-第一章 计算机硬件基础-1.4 服务器主要部件
  2. android 键盘弹出 监听,奇技淫巧之-Android监听键盘弹出与隐藏事件
  3. 内置虚拟化,自动分层,重复数据删除,固态硬盘,IBM Storwize V7000亮点解析
  4. python 基础二(学习打卡)
  5. Opencv实现图片的油画特效
  6. 关于Python 下载pyecharts 运行下提示报错 cannot import name ‘line‘等问题
  7. 计算机毕业设计Java旅游景点酒店预订网站(源代码+数据库+系统+lw文档)
  8. 率先布局 RWA 赛道,PoseiSwap 成为最具先进性的 DEX
  9. 双十一正式开售,黑科技满满的OPPO R17 Pro今起开启预售
  10. 数据库基础(数据库的由来 + 第一、二、三范式)