彻底吃透A*算法的最优性

news2025/3/18 10:17:02

下面的博客将主要介绍A*算法在扩展结点(这对于寻路时间很重要)和总代价(这对于保证最后解的最优性很重要)上的最优性,并将淡化对A *完备性的介绍。

A* 算法流程

A*算法的流程如下[1]:

在这里插入图片描述

并定义 f ( n ) f(n) f(n) g ( n ) g(n) g(n):
在这里插入图片描述

open和closed表中的重要结论

下面是给出引理1:

(引理1)对于任意不在closed表中的结点 n n n 以及对于任意从起点 s s s n n n的最优路径 P P P,存在一个在open表中的结点 n ′ n^{'} n,其在 P P P上,即 g ^ ( n ′ ) = g ( n ′ ) \hat{g}(n^{'})=g(n^{'}) g^(n)=g(n)

Proof. 设 P = ( s = n 0 , n 1 , n 2 , . . . n k = n ) P=(s=n_0,n_1,n_2,...n_k=n) P=(s=n0,n1,n2,...nk=n),当 s s s在open表中时,那么 n ′ = s n^{'}=s n=s必然满足条件,因为 g ^ ( s ′ ) = g ( s ′ ) = 0 \hat{g}(s^{'})=g(s^{'})=0 g^(s)=g(s)=0;当 s s s在closed表中时,令 Δ \Delta Δ P P P上的,所有在closed表中的结点 n i n_i ni,其满足 g ^ ( n i ) = g ( n i ) \hat{g}(n_i)=g(n_i) g^(ni)=g(ni)的集合:
Δ = { n i ∈ c l o s e d ∣ g ^ ( n i ) = g ( n i ) ( n i ∈ P ) } \Delta=\{n_i\in closed|\hat{g}(n_i)=g(n_i)(n_i\in P)\} Δ={niclosedg^(ni)=g(ni)(niP)}
很显然 Δ ≠ ϕ \Delta\ne\phi Δ=ϕ,这是因为假设 Δ \Delta Δ至少包含一个 s s s。令 n ∗ n^* n Δ \Delta Δ中索引最高的元素,那么很明显 n ∗ ≠ n n^*\ne n n=n,这是因为 n n n不在closed表中。令 n ′ n^{'} n n ∗ n^* n P P P上的后继结点(successor), n ′ ∈ o p e n n^{'}\in open nopen,这里很有可能 n ′ = n n^{'}=n n=n,此时情况特殊,算法结束。现在由于算法Step4中 g ^ \hat{g} g^的定义有:
g ^ ( n ′ ) ≤ g ^ ( n ∗ ) + c n ∗ , n ′ \hat{g}(n^{'})\leq\hat{g}(n^*)+c_{n^*,n^{'}} g^(n)g^(n)+cn,n
同样由于 n ∗ ∈ Δ n^*\in\Delta nΔ g ^ ( n ∗ ) = g ( n ∗ ) \hat{g}(n^*)=g(n^*) g^(n)=g(n),且由于 n ∗ ∈ P n^*\in P nP g ( n ′ ) = g ( n ∗ ) + c n ∗ , n ′ g(n^{'})=g(n^*)+c_{n^*,n^{'}} g(n)=g(n)+cn,n。因此可以得到:
g ^ ( n ′ ) ≤ g ^ ( n ∗ ) + c n ∗ , n ′ ≤ g ( n ∗ ) + c n ∗ , n ′ ≤ g ( n ′ ) \hat{g}(n^{'}) \leq \hat{g}(n^*)+c_{n^*,n^{'}} \\ \leq g(n^*)+c_{n^*,n^{'}} \\ \leq g(n^{'}) g^(n)g^(n)+cn,ng(n)+cn,ng(n)
而实际上,对于任意一个后继结点 n ′ n^{'} n而言其距离起点 s s s的累计长度肯定大于最优路径,即 g ^ ( n ′ ) ≥ g ( n ′ ) \hat{g}(n^{'})\geq g(n^{'}) g^(n)g(n)。因此综上有, g ( n ′ ) = g ^ ( n ′ ) g(n^{'})=\hat{g}(n^{'}) g(n)=g^(n),说明 n ′ ∈ P n^{'}\in P nP

(推论)假设对于任意 n n n h ^ ( n ) ≤ h ( n ) \hat{h}(n)\leq h(n) h^(n)h(n),且 A ∗ A^* A没有结束。那么对于任意从 s s s到其目标点的最优路径 P P P,存在open表中的 n ′ ∈ P n^{'} \in P nP,满足 f ^ ( n ′ ) ≤ f ( s ) \hat{f}(n^{'})\leq f(s) f^(n)f(s)

Proof. 由引理1有,存在open表中的结点 n ′ ∈ P n^{'} \in P nP ,即 g ^ ( n ′ ) = g ( n ′ ) \hat{g}(n^{'})=g(n^{'}) g^(n)=g(n)。因此由定义:
f ^ ( n ′ ) = g ^ ( n ′ ) + h ^ ( n ′ ) = g ( n ′ ) + h ^ ( n ′ ) ≤ g ( n ′ ) + h ( n ′ ) = f ( n ′ ) \hat{f}(n^{'})=\hat{g}(n^{'}) + \hat{h}(n^{'})\\ =g(n^{'}) + \hat{h}(n^{'}) \\ \leq g(n^{'}) + h(n^{'}) \\ = f(n^{'}) f^(n)=g^(n)+h^(n)=g(n)+h^(n)g(n)+h(n)=f(n)
下面先不证明A*算法的完备性,下面先假设在A * 算法完备的情况下,证明其最优性。

在证明最优性之前,这里需要给出一个概念叫一致性假设(Consistency Assumption)。假设如下:
h ( m , n ) + h ^ ( n ) ≥ h ^ ( m ) h(m,n)+\hat{h}(n)\geq \hat{h}(m) h(m,n)+h^(n)h^(m)
这里的 h ( m , n ) h(m,n) h(m,n)表示从 m m m n n n所需要的最优代价。在有了上面的一致性假设的前提下,下面的引理可以证明A * 算法的最优性。

(引理2)在 h ^ \hat{h} h^满足一致性假设的前提下,在A*算法所得到的 c l o s e d closed closed中的结点 n n n必定满足 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n)

Proof. 采用反证法对上面的结果进行证明。假设 g ^ ( n ) > g ( n ) \hat{g}(n) > g(n) g^(n)>g(n),现在存在从 s s s n n n的最优路径 P P P。由于 g ^ ( n ) > g ( n ) \hat{g}(n) > g(n) g^(n)>g(n),这说明A算法并没有找到最优路径 P P P。而由引理1,在open表中必然存在 n ′ ∈ P n^{'}\in P nP,满足 g ( n ′ ) = g ^ ( n ′ ) g(n^{'})=\hat{g}(n^{'}) g(n)=g^(n)。当 n ′ = n n^{'}= n n=n 时,结论成立;当 n ′ ≠ n n^{'}\ne n n=n 时,很明显有:
g ( n ) = g ( n ′ ) + h ( n ′ , n ) = g ^ ( n ′ ) + h ( n ′ , n ) g(n)=g(n^{'})+h(n^{'},n)\\ = \hat{g}(n^{'}) +h(n^{'},n) g(n)=g(n)+h(n,n)=g^(n)+h(n,n)
综合有: g ^ ( n ) > g ^ ( n ′ ) + h ( n ′ , n ) \hat{g}(n) > \hat{g}(n^{'})+h(n^{'},n) g^(n)>g^(n)+h(n,n),两边同时加上 h ^ ( n ) \hat{h}(n) h^(n)有:
h ^ ( n ) + g ^ ( n ) > h ^ ( n ) + h ( n ′ , n ) + g ^ ( n ′ ) ≥ h ^ ( n ′ ) + g ^ ( n ′ ) \hat{h}(n) + \hat{g}(n) > \hat{h}(n) + h(n^{'},n) + \hat{g}(n^{'}) \\ \geq \hat{h}{(n^{'})} + \hat{g}(n^{'}) h^(n)+g^(n)>h^(n)+h(n,n)+g^(n)h^(n)+g^(n)
这说明 f ^ ( n ) > f ^ ( n ′ ) \hat{f}(n)>\hat{f}(n^{'}) f^(n)>f^(n),那么在算法Step2中,A
应该弹出更小的 n ′ n^{'} n作为扩展结点进入closed表中,这与终止条件,弹出 n n n进入在closed表的结果矛盾。因此可以说明, g ^ ( n ) ≤ g ( n ) \hat{g}(n)\leq g(n) g^(n)g(n),又因为 g ^ ( n ) ≥ g ( n ) \hat{g}(n) \geq g(n) g^(n)g(n),因此 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n)

上面的引理是重要的,这是因为引理2不仅仅为A*算法的最优性证明提供了条件,更说明对于closed表中的结点,其已经在最优路径上了,没必要在其再次被扩展到的时候,继续放到open表里面了。

(引理3)作为A*算法扩展出的closed表中的结点序列 ( n 1 , n 2 , . . . , n t ) (n_1,n_2,...,n_t) (n1,n2,...,nt),当满足一致性假设条件时,若 p ≤ q p\leq q pq,则有 f ^ ( n p ) ≤ f ^ ( n q ) \hat{f}(n_p)\leq \hat{f}(n_q) f^(np)f^(nq)

Proof. 假设结点 n n n是A* 算法在将 m m m放入closed表中后的下一个closed结点。首先假设到 n n n的最优路径 P P P并不经过 m m m,哪么 m m m在被放入closed表中后, n n n再被放入时,肯定有 f ^ ( m ) = f ( m ) = f ( n ) ≤ f ^ ( n ) \hat{f}(m)=f(m)= f(n)\leq \hat{f}(n) f^(m)=f(m)=f(n)f^(n),因此引理成立。再假设到 n n n的最优路径经过 m m m,由引理2有 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n) g ^ ( m ) = g ( m ) \hat{g}(m)=g(m) g^(m)=g(m),那么由 g ( n ) = g ( m ) + h ( m , n ) g(n)=g(m)+h(m,n) g(n)=g(m)+h(m,n)就有:
f ^ ( n ) = g ^ ( n ) + h ^ ( n ) = g ( n ) + h ^ ( n ) = g ( m ) + h ( m , n ) + h ^ ( n ) ≥ g ( m ) + h ^ ( m ) = g ^ ( m ) + h ^ ( m ) = f ^ ( m ) \hat{f}(n)=\hat{g}(n) + \hat{h}(n) \\ = g(n) + \hat{h}(n) \\= g(m) + h(m,n) + \hat{h}(n) \\ \geq g(m) + \hat{h}(m) \\ = \hat{g}(m) + \hat{h}(m) \\ = \hat{f}(m) f^(n)=g^(n)+h^(n)=g(n)+h^(n)=g(m)+h(m,n)+h^(n)g(m)+h^(m)=g^(m)+h^(m)=f^(m)

上面的引理说明在一致性条件满足的情况下,closed表中的结点随着不断的加入,其估计值 f ^ \hat{f} f^是单调递增的。

(推论)在引理3的条件下, c l o s e d closed closed表中的结点 n n n必然满足 f ^ ( n ) ≤ f ( s ) \hat{f}(n)\leq f(s) f^(n)f(s)

Proof. 证明是简单的,假设在A*算法中起始结点 s s s开始寻找到的最终结点是 t t t,此时由引理3,有 f ^ ( n ) ≤ f ^ ( t ) = f ( t ) = f ( s ) \hat{f}(n) \leq \hat{f}(t)=f(t)=f(s) f^(n)f^(t)=f(t)=f(s)

这个推论说明了一个很特殊的情况,当closed表中的结点足够多时,由单调有界原理,closed表中的 f ^ \hat{f} f^值将收敛,由于 f ( s ) f(s) f(s) f ^ \hat{f} f^的上确界,因此 f ^ → f ( s ) \hat{f}\rightarrow f(s) f^f(s)。 这个证明是简单的,因为假设 f ^ → c \hat{f} \rightarrow c f^c,由推论, c = sup ⁡ { f ^ } ≤ f ( s ) c=\sup\{\hat{f}\} \leq f(s) c=sup{f^}f(s),另外对于任意的 n n n c ≥ f ^ ( n ) ≥ f ( s ) c\geq \hat{f}(n)\geq f(s) cf^(n)f(s)必然成立,因此说明 c = f ( s ) c=f(s) c=f(s)

事实上,这里最重要的假设条件是一致性假设条件和启发项 h ^ ≤ h \hat{h} \leq h h^h假设,当这两个条件满足时,可以认为在A * 搜索算法的框架下,closed表中结点的 f ^ \hat{f} f^值必然会单调收敛到最优的代价 f f f上。这样,我们就可以通过在终止结点上的回溯找到完整的最优路径的信息。

换一种思路,博客[2]则是采用反证法结合数学归纳法巧妙地证明了A*算法在图节点搜索中必然可以找到一条最优路径。而博客[3]也是直接采用反证法证明了其最优性。

A*算法在扩展结点数目上的优势

在文献[1]中, Hart P E 还证明了A*算法在扩展结点上相比于任何完备算法在某些条件下有更少的结点扩展:

  • 对于任意的完备性算法A而言,当满足一致性假设条件以及A算法“no more informed than”A*算法时,若结点被A *算法所扩展,哪么该结点必定同样被A算法所扩展(见 Theorem 2);
  • 在满足Theorem 2的条件下,在 δ \delta δ G s G_s Gs中,A算法总共扩展的结点数目不大于A算法总共所扩展的结点数目,即 N ( A ∗ , G s ) ≤ N ( A , G s ) N(A^{ *},G_s)\leq N(A,G_s) N(A,Gs)N(A,Gs)(见Theorem 2* 的Corollary);
  • 当open表中出现相同的 f ^ \hat{f} f^值时,上述定理和推论依旧成立(Theorem 3, Corollary 1, Corollary 2)。

文献指出,如果出现A算法比A*算法扩展更少的结点时,哪通常只是因为运气好,且在图上有更多可以利用的一致性信息导致A算法提前结束,事实上A *算法搜索的结点数是要少于A算法的。

参考文献

[1] Hart P E , Nilsson N J , Raphael B .A Formal Basis for the Heuristic Determination of Minimum Cost Paths[J].IEEE Transactions on Systems Science & Cybernetics, 1972, 4(2):28-29.DOI:10.1145/1056777.1056779.

[2] Veritaswhs, A*算法证明与详解-CSDN博客, CSDN, 2020: https://blog.csdn.net/weixin_43398590.

[3] DeadPool loves Star, 算法导论——A*算法易懂的证明, CSDN, 2020.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译openjdk12-33

编译环境 ubuntu20 Ubuntu里用户可以自行选择安装GCC或CLang来进行编译,但必须确保最低的版本为GCC 4.8或者CLang 3.2以上,官方推荐使用GCC 7.8或者CLang 9.1来完成编译。 源码 https://github.com/openjdk/jdk/tree/jdk-12%2B33 安装gcc sudo apt…

喜讯丨泰迪智能科技实力中标“健康大数据与人工智能实验室建设”项目

泰迪智能科技以健康数据分析与应用为主题的实验中心,为学校大健康产业大数据与人工智能应用人才培养提供载体,并基于培养中心根据学生专业的不同,提供不同的健康大数据学习资源,实现健康大数据技术和数据分析应用能力培养普遍提升…

nginx隐藏版本号、错误信息页面隐藏nginx软件、修改 HTTP 头信息中的connection 字段,防止回显具体版本号、curl命令

目录 安装之后隐藏 配置文件 源代码配置安装之前隐藏 修改nginx.h文件中的 13、14行 修改 HTTP 头信息中的connection 字段,防止回显具体版本号 配置文件49行 错误页面程序返回版本号、nginx隐藏 配置文件36行 ​编辑 安装nginx 相关选项说明 curl命令测试…

Spring Security 注册过滤器关键点与最佳实践

在 Spring Security 框架中,注册过滤器是实现身份验证和授权的关键组件。正确配置和使用注册过滤器对于确保应用程序的安全性至关重要。以下是一些关于 Spring Security 注册过滤器的注意事项和最佳实践。 过滤器链顺序: 注册过滤器通常位于过滤器链的末…

医用腕带朔源用的条形码与二维码如何选择

在医疗环境中的医用腕带作为患者身份识别和管理的重要工具,做为条形码和二维码腕带上的溯源技术,更是为患者信息快速获取、准确传递的保障,实现更加高效和准确的患者身份识别和管理,这种技术可以大大提高医疗服务的效率和质量&…

Linux 多线程 生产者消费者 问题

在 Linux 系统中,生产者和消费者问题是一个经典的多线程同步问题,用于描述如何在多线程环境中协调多个线程对共享资源的访问。这个问题通常涉及两个类型的线程:生产者线程和消费者线程。生产者线程负责生成数据并将其放入缓冲区,而…

2024年端午节放假通知

致尊敬的客户以及全体同仁: 2024年端午节将至,根据国务院办公厅通知精神,结合公司的实际情况,现将放假事宜通知如下: 2024年6月8日(星期六)至6月10日(星期一)&#xff…

一个简单的方式看看MySQL的锁

突然发现半个月没写了。最近事情太多了。 在日常工作的处理问题的过程中,我发现了一个简单的论证锁的问题,以前我讲的有点复杂,看来应该去改改之前的讲法了。 首先构造一个无主键无索引的表。并且初始化5条数据。 场景A: RR隔离…

颠沛流离学二叉树(完结撒花篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

[机器学习] 低代码机器学习工具PyCaret库使用指北

PyCaret是一个开源、低代码Python机器学习库,能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率。PyCaret本质上是围绕几个机器学习库和框架(如scikit-learn、XGBoost、L…

【Kubernetes】k8s集群的污点、容忍、驱逐 以及排障思路

污点和容忍以及驱逐 一、污点(Taint) 污点介绍 节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 Pod。 Taint 和 Tol…

【ai】livekit服务本地开发模式1:example app信令交互详细流程

文档要安装git lfs 下载当前最新版本1.6.1windows版本:启动dev模式 服务器启动 (.venv) PS D:\XTRANS\pythonProject\LIVEKIT> cd .

python实现——分类类型数据挖掘任务(图形识别分类任务)

分类类型数据挖掘任务 基于卷积神经网络(CNN)的岩石图像分类。有一岩石图片数据集,共300张岩石图片,图片尺寸224x224。岩石种类有砾岩(Conglomerate)、安山岩(Andesite)、花岗岩&am…

【笔记】Sturctured Streaming笔记总结(Python版)

目录 相关资料 一、概述 1.1 基本概念 1.2 两种处理模型 (1)微批处理 (2)持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 三、输入源 3.1 File源 &a…

python-题库篇-为什么数组下标从0 开始而不是 1

为什么很多编程语言要把 0 作为第一个下标索引,而不是直观的 1 呢? 这个问题 Dijkstra 已经解答过了,没错,就是你知道的 Dijkstra,Dijkstra 最短路径算法,荷兰语全名是 Edsger Wybe Dijkstra,于…

linux查看磁盘类型命令

在Linux中,有多种方法可以查看磁盘是固态硬盘(SSD)还是机械硬盘(HDD)。以下是一些常用的方法: 查看/sys/block/目录 /sys/block/目录包含了系统中所有块设备的信息。你可以查看这个目录中的设备属性来判断…

保姆级教程:Redis 主从复制原理及集群搭建

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

LabVIEW在高校电力电子实验中的应用

概述:本文介绍了如何利用LabVIEW优化高校电力电子实验,通过图形化编程实现参数调节、实时数据监控与存储,并与Simulink联动,提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时,通常使用…

文献解读-肿瘤测序-第五期|《局部晚期或转移性儿童及青少年分化型甲状腺癌的基因特征与临床特征及131I疗效的关系》

关键词:应用遗传流行病学;群体测序;肿瘤测序; 文献简介 标题(英文):The relationship between genetic characteristics and clinical characteristics and the efficacy of 131I therapy in c…

opencv笔记(13)—— 停车场车位识别

一、所需数据介绍 car1.h5 是训练后保存的模型 class_directionary 是0,1的分类 二、图像数据预处理 对输入图片进行过滤: def select_rgb_white_yellow(self,image): #过滤掉背景lower np.uint8([120, 120, 120])upper np.uint8([255, 255, 255])#…