《经典图论算法》A*搜索算法比雪夫启发式dijkstra

4.2欧几里得距离(EuclideanDistance)

4.3切比雪夫距离(ChebyshevDistance)

5,A*算法代码实现

A*搜索算法(A*searchalgorithm)又称A*算法(A-starAlgorithm),是比较流行的启发式搜索算法之一,被广泛应用于路径优化领域。

A*算法结合了Dijkstra算法的优点(即保证找到最短路径)和贪心算法最佳优先搜索的优点(通过启发式函数引导搜索方向),在大多数情况下能高效地找到最优路径。

举个例子,我们知道BFS搜索基本上是处于盲搜,它不知道目标值的大概方向,每次都是搜索离它最近的点。

如下图所示,如果使用BFS从起始点到目标点找一条最短的路径,可以看到红色框内的位置离目标点是越来越远,我们没必要提前搜索,先搜索离目标点最近的点即可。

离目标点位置越来越远的点是否可以舍弃,答案肯定是不行的,如下图所示,离目标点越来越近的点被墙挡住了,只能沿着离目标点远的点继续搜索。

A*算法搜索的时候,我们需要确定当前位置到目标点的距离,要始终沿着离目标点最近的位置开始搜索,怎么确定这个距离呢?这里就涉及到了启发式函数的定义。

A*算法是使用一个启发式函数h(n)来估计从位置n到目标点的代价(可以是距离,花费等),并结合已知的从起始点到位置n的代价g(n),综合考虑这两个值来选择搜索路径。其核心公式为:f(n)=g(n)+h(n):

1,g(n):从起点到位置n的代价。

2,h(n):从位置n到目标点的估计代价(启发式函数)。

3,f(n):从起点经过位置n到目标点的总估计代价。

下面对这个公式进行展开讨论:

1,h(n)=0:即启发式函数值为零,即只计算从起始点到位置n的代价,不需要启发函数,此时A*算法退化为Dijkstra算法,可以找到最短路径,但效率较低,因为失去了启发式搜索的优势。

2,h(n)<实际代价:启发式函数的预估代价小于实际代价,A*算法能保证找到最短路径,但可能需要扩展更多的节点,运行较慢,并且h(n)越小,需要扩展的点就越多,运行就越慢,效率就越差。

3,h(n)=实际代价:启发式函数的预估代价恰好等于实际代价,A*算法将只扩展必要的节点,运行非常快,效率也是最高的。但在实际情况中,很难完全准确的预估。

4,h(n)>实际代价:启发式函数的预估代价大于实际代价,运行速度比较快,但找到的不一定是最优解。

5,g(n)=0:不考虑从起始点到位置n的代价,只计算从位置n到目标点的代价,这个就是纯贪心算法,速度也是最快的,但找到的解不一定是最优的。

A*算法和Dijistra区别

A*算法通过启发式搜索策略,利用启发式函数来估算从当前节点到目标节点的成本,从而加速寻路过程。如果启发式选择得当,A*算法通常比Dijkstra算法更快,效率更高,搜索范围更小,因为它可以更直接地朝向目标节点前进。

1,创建一个空的开放列表(openlist),并把起始点放入其中,开放列表一般使用优先队列,节点按照f(n)的值进行排序,以确保优先查找f(n)值最小的节点。

2,创建一个空的关闭列表(closedlist),用于记录已经被探索过的节点,以避免重复探索。

3,从开放列表中取出f(n)值最小的节点n。

3.1,如果n是目标点,则终止并返回路径,否则,将n节点移到关闭列表中。

3.2,访问n的每个邻居节点m:

3.2.1,如果m已在关闭列表中,则忽略它。

3.2.2,如果m不在开放列表中,计算g(m)、h(m)和f(m),并将它添加到开放列表中。

3.2.3,如果m已在开放列表中,并且通过n到达m的路径更短,则更新g(m)、h(m)和f(m),并设置m的父节点为n。

4,重复上面的步骤3,如果找到目标节点,即可通过回溯父节点来找到最短路径。如果遍历结束后仍未找到终点,说明不存在从起点到终点的路径。

A*算法的步骤是它的核心部分,主要是在第三步,一定要完全掌握。可以参考下我们前面讲的,开放列表相当于BFS中的队列,关闭列表相当于BFS中的visited数组,记录哪些点被访问过了,避免重复访问。

上面我们讲了A*搜索算法的原理以及实现步骤,其中关于距离的启发式函数没有介绍,A*算法的性能高度依赖于启发式函数的选择,一个好的启发式函数可以显著提高搜索效率。

启发式函数比较多,常见的有曼哈顿距离,欧几里得距离,切比雪夫距离。

4.1曼哈顿距离(ManhattanDistance)

曼哈顿距离适用于只能沿水平或垂直方向移动的网格,如城市街道,也称为城市街区距离。对于二维平面上的两个点(x1,y1)和(x2,y2),曼哈顿距离为|x1-x2|+|y1-y2|。

例如,点(1,3)和(4,6)的曼哈顿距离为|1-4|+|3-6|=3+3=6。

4.2欧几里得距离(EuclideanDistance)

欧几里得距离是两点之间的直线距离,对于二维平面上的两个点(x1,y1)和(x2,y2),欧几里得距离为sqrt((x1-x2)^2+(y1-y2)^2)。

例如,点(1,1)和(4,5)的欧几里得距离为sqrt((1-4)^2+(1-5)^2)=sqrt(9+16)=5。

4.3切比雪夫距离(ChebyshevDistance)

切比雪夫距离是两点之间的最大水平和垂直距离,对于二维平面上的两个点(x1,y1)和(x2,y2),切比雪夫距离为max(|x1-x2|,|y1-y2|)。

例如,点(1,1)和(4,5)的切比雪夫距离为max(|1-4|,|1-5|)=4。

A*算法可以看作是BFS的增强版,它根据启发式函数的引导,慢慢朝着目标点移动,我们用下面这个图来看下它怎么搜索的。

因为每次搜索的时候都会计算当前位置的上下左右四个方向,如果搜索的顺序改变可能会导致路径不同,如下图所示两张图,分别是按照右下左上和上下左右顺序搜索的两张图,其中关闭列表中的顶点包含最短路径的顶点。

THE END
1.欧几里得小传与《几何原本》英国著名的物理学家和数学家牛顿(Isaac Newton,1643年~1727年)也曾如此评价《几何原本》:“能够从如此少的原理中取得如此多的成就,这是几何学的荣耀。” 当然,欧几里得在《几何原本》开篇的定义中不少都是语意模糊,有着各种逻辑上的缺陷,其中的命题证明也存在一些遗漏和错误https://mp.weixin.qq.com/s?__biz=MzAxNzg3MTE3Ng==&mid=2247516658&idx=1&sn=1f2096724c1f151901d7f698c2fbce51&chksm=9a858cf935bbe468ef32b17cea529ef732e08e73a1eacdc8c6e06ff41ed531e489fd71af709a&scene=27
2.急欧几里得算法是什么原理啊?我知道怎么算的,不过谁来告诉我急 欧几里得算法是什么原理啊?我知道怎么算的,不过谁来告诉我为什么可以这样算,那样记着公式没用我想弄清为什么!我要问为什么这么推可以推出最大公约数!https://www.zybang.com/question/e651ba879662c4335c6f96fba8f7de51.html
3.python欧几里得算法求逆元mob649e815ecee0的技术博客欧几里得算法是一种用来计算两个整数的最大公约数的方法,也被称为辗转相除法。在数论中,求逆元是一个非常重要的概念,它可以帮助我们解决很多关于模运算的问题。本文将介绍欧几里得算法的原理以及如何使用Python来实现求逆元的方法。 欧几里得算法原理 欧几里得算法基于以下定理:对于两个整数a和b,它们的最大公约数等于ahttps://blog.51cto.com/u_16175477/10704995
4.密码学基础1:RSA算法原理全面解析网上写 RSA 算法原理的文章不少,但是基本上要么忽略了数学原理的说明,要么缺少实际的可运行的例子,为此特写了此文,将 RSA 需要用到的数学概念和定理都总结了一番,并基于算法原理使用 python 实现了 RSA 密钥生成和加解密的demo,希望对大家深入了解 RSA 算法有所帮助。本文第 1 节为 RSA 相关的数论基础,第 2https://www.jianshu.com/p/6aa7b59be872
5.探秘欧几里得算法的奥秘欧里几得算法,又称辗转相除法,是一种用于计算两个正整数最大公约数的古老而有效的算法。这一算法的历史可以追溯到古希腊数学家欧几里得,被记载在其著作《几何原本》中。欧里几得算法的基本原理是通过连续进行除法,直到余数为零,此时的除数即为两数的最大公约数。这个算法简单且直观,但其背后的数学原理却深刻而有https://localsite.baidu.com/article-detail.html?articleId=23744227&ucid=PjbzPHbvrj6&categoryLv1=%E6%95%99%E8%82%B2%E5%9F%B9%E8%AE%AD&ch=54&srcid=10004
6.欧几里德算法Theorem 1.3.2 (The Euclidean Algorithm) 假设 a,b 且 a > b. 由除法原理我们知存在 h0,r0 使得 欧几里得算法a = bh0 + r0,其中 r0 < b. 若r0 > 0,则存在 h1,r1 使得 b = r0h1 + r1,其中 0r1 < r0. 若r1 > 0,则存在 h2,r2 使得 https://baike.sogou.com/v294857.htm
7.多元思维模型5.1奥卡姆剃刀原理奥卡姆剃刀原理是 “如无必要,勿增实体”(Entities should not be multiplied unnecessarily)。即切勿浪费较多东西,去做用较少的东西,同样可以做好的事情。 拉丁文原文如下: Numquam ponenda est pluralitas sine necessitate.(避重趋轻) Pluralitas non est ponenda sine necessitate.(避繁逐简) https://zhuanlan.zhihu.com/p/430460297
8.欧几里得原理及扩展欧几里得原理(EuclideanTheoryandExtendedEuclid本文详细介绍了欧几里得原理,用于求解两正整数的最大公约数,以及扩展欧几里得原理在求解二元一次不定方程整数解的应用。通过递归实现的欧几里得原理,结合算法代码展示,阐述了如何从简单不定方程到一般不定方程的解法。 摘要由CSDN通过智能技术生成 题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想https://blog.csdn.net/rising_fallmoon/article/details/10724239
9.欧几里得算法.pptx欧几里得算法数学算法 01算法简介算法原理算法版本计算证明程序设计目基本信息欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。 算法简介 算法简介欧几里得算法是https://max.book118.com/html/2023/0622/5204004141010232.shtm
10.RSA算法原理(二)这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。 至此所有计算完成。 第六步,将n和e封装成公钥,n和d封装成私钥。 在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。 https://xxzx.cusx.edu.cn/info/1038/1854.htm
11.python辗转相除法求最大公约数和最小公倍数的实现python这篇文章主要介绍了python辗转相除法求最大公约数和最小公倍数的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 + 目录 辗转相除法求最大公约数和最小公倍数 辗转相除法数学原理 辗转相除法也称欧几里得算法,是用来求两个正整数的最大公约数的算法。接下来我们用实例来https://www.jb51.net/article/255650.htm
12.裴蜀定理扩展欧几里得算法及其证明腾讯云开发者社区裴蜀定理、扩展欧几里得算法及其证明 定理 裴蜀定理(贝祖定理)是一个关于最大公约数的定理。 裴蜀定理说明了对任何整数a,b和它们的最大公约数d,关于未知数x和y的线性不定方程:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别的,一定存在整数x,y使ax+by=d成立。https://cloud.tencent.com/developer/article/2088866
13.GitHubfindneo/RSA欧几里得算法是求最大公约数的算法, 也就是中学学的辗转相除法。记gcd(a,b)为a和b的最大公约数,欧几里得算法的基本原理是gcd(a,b)==gcd(b,a%b),(b!=0)和gcd(a,0)==a。 Python实现如下: # 递归版defgcd(a,b):returnaifnotbelsegcd(b,a%b)# 迭代版defgcd2(a,b):whileb:a,b=b,a%bretuhttps://github.com/findneo/RSA-ATTACK