启发式搜索(Informed Search)-贪婪算法GBS+A*算法

2024-02-28 06:08

本文主要是介绍启发式搜索(Informed Search)-贪婪算法GBS+A*算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 

写在前面

一、启发式搜索和启发式函数

二、贪婪算法(贪婪最佳优先搜索)greedy best-first search (GBS)

三、A*搜索(结合UCS和GBS)

A*搜索算法结束的条件是什么?

​怎么判证明A* 树搜索的最优性?(这个容易出证明题)

四、怎么选择一个好的启发式函数


写在前面

        我们之前几篇博客都是在讨论无信息搜索,包括深度优先、广度优先、代价一致等。我们这个内容主要讨论什么是启发式搜索和启发式函数,介绍两个比较常见的贪婪算法A*搜索算法。并且告诉大家怎么才可以选择一个更好的启发式函数。最后是图搜索中的应用部分。 

一、启发式搜索和启发式函数

        百科:启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search),它是利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的,这种利用启发信息的搜索过程称为启发式搜索。

        启发式搜索的节点一般是基于f(n)来进行扩展的,我们如果了解无信息搜索中代价一致算法(UCS)的话,UCS中也有一个g(n)。启发式搜索中是通过f(n)被选择性扩展(一般使用优先队列),一致代价搜索中使用g(n)来选择性扩展(也是优先队列)。但是启发式搜索中f(n)含义要比g(n)丰富,g(n)仅仅表示从当前节点到下一个节点的开销,但是f(n)可以表示从当前节点到目标节点的估计

启发式函数(对于大多数最佳优先搜索):h(n)=节点n到目标节点的最小代价路径的代价估计值
启发式搜索:采用了f(n)(即启发式函数)的搜索策略。

二、贪婪算法(贪婪最佳优先搜索)greedy best-first search (GBS)

        贪婪算法的设计目的就是想要从当前节点扩展离目标节点最近的一个节点。这个算法只用到了最简单的启发式函数f(n)=h(n),在罗马尼亚问题中,使用的是当前地点到目的地的直线距离(这个信息不能由问题本身的描述计算得到,而且这个信息是有用的——因为和实际路程相关,所以是一个有用的启发式),在此问题中,GBS搜索代价最小,但是不是最优。

GBS可能陷入死循环,但是它在有限状态空间的图搜索下是完备的,其他情况则不是。其时间和空间复杂度都是O(b^m),其中m是搜索空间的最大深度。

三、A*搜索(结合UCS和GBS)

A*搜索不同于贪婪算法,贪婪算法仅仅利用了启发式函数h(x),A*算法结合了代价一致算法UCS和贪婪算法的优点。A*算法可以看到到达此节点已经花费的代价(  g(x) ),A*搜索的启发式函数变为了f(n)=g(n)+h(n)。整体来说,A*算法既是完备的也是最优的

那么我们可以探讨下,代价一致搜索和A*搜索有啥区别呢?我们通过观察下图可以看出,代价一致搜索在所有方向上是等可能的扩展,而A*搜索方式主要是朝着目标扩展,而且可以保证最优性。启发函数越接近真实的耗散,将扩展越少的节点,但通常会在每个节点计算启发函数本身时有更多的计算。

A*搜索算法结束的条件是什么?

怎么判证明A* 树搜索的最优性?(这个容易出证明题)

四、怎么选择一个好的启发式函数

其实我们最大问题并不是理解启发式函数,而是怎么去想出最好的可采纳的启发函数。通常情况下可采纳启发函数都是松弛问题的解的耗散问题。其实不能被采纳的启发函数也不是一无是处,常常也是非常有用的。

优势可以直接转化为效率:使用ha的A*算法绝不会比使用hc扩展更多的节点。

论证:每个f(n)<C*的节点都会被扩展,那么h(n)<C*-g(n)的节点必将被扩展。ha>=hc,那么每个被使用ha的A*算法扩展的节点必定也会被使用hc的A*所扩展,而hc还可能引起其他节点的扩展。

因此,使用值更高的启发函数总是更好的。前提可采纳的启发函数

 

 

这篇关于启发式搜索(Informed Search)-贪婪算法GBS+A*算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754591

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO