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

下面的博客将主要介绍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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生_K8S系列】Kubernetes 控制器简介

概述 Kubernetes是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。Kubernetes 的核心组件之一是控制器(Controller),它负责确保集群中的实际状态与用户定义的期望状态一致。控制器是 Kubernetes 控制平面的一个重…

GaussDB的数种形态

GaussDB作为一种新兴的关系型数据库产品,似乎有点让人摸不着头脑。有朋友问我GaussDB单机版怎么样,有人说GaussDB是分布式数据库,还有人说它是云数据库,还有人会把GaussDB和华为的数据仓库GaussDB DWS混为一谈。确实,公…

密码学基本概念(补充)

BiBa模型的*特性规则:主体不能修改更高完整级的客体(主题不能向上写) Diffie-Hellman密钥交换协议的安全性基于求解离散对数的困难性,既对于C^d M mod P,在已知C和P的前提下,由d求M很容易,但是…

取代Windows的系统复制粘贴等文件处理

TeraCopy 可以到官网下载也可以通过应用商店下载 主要作用 : 取代Windows的系统复制粘贴等文件处理 常规窗口 点击第一排最左侧的按钮会显示这个窗口, 显示所以文件操作记录 , 这个也是我装这个软件的原因之一, 框选的是当前正在进行的 当执行复制粘贴时会自动出现, 让自行…

从零开始:如何通过美颜SDK构建自己的直播美颜工具

今天,我将详细介绍如何通过美颜SDK从零开始构建自己的直播美颜工具。 一、了解美颜SDK 什么是美颜SDK 开发者可以通过集成SDK,快速在应用中实现这些功能,而无需从头编写复杂的图像处理算法。 选择合适的美颜SDK 选择时可以根据以下几个方…

RAG 高效应用指南 :Query 理解

前言 构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的 PoC(概念验证,Proof of Concept)过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。这主要是因为 RAG 系统涉及多个不同的组件,…

使用Nginx正向代理让内网主机通过外网主机访问互联网

目录 环境概述 流程说明 在外网服务器上安装部署nginx 安装前准备 下载nginx 编译安装nginx 开始配置正向代理 创建systemd服务单元文件,用于管理Nginx服务的启动、停止和重新加载 启动nginx 代理服务器本地验证 内网服务器验证 将代理地址添加到环境变量中…

38. 【Java教程】日期和时间处理

本小节我们将学习 Java 中的日期和时间,日期和时间在我们的实际开发中非常常用,例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习,你将了解到什么是日期、什么是时间、什么是时区,Ja…

查看云是基于openstack是哪一个版本开发的?

进入版本发行网站: OpenStack Releases: OpenStack Releases 进入云的后台,查看例如nova的版本号 rpm -qa | grep nova 查看到nova的版本号是21版本,点开releases中例如Ussuri查看nova的版本号,是21,则该云是基于U…

数据分析技术---对比K-means,密度分析和层次聚类性能

一、数据集选择: Iris数据集。 二、实验代码: #对比k-means、密度聚类和层次聚类性能import matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.cluster import KMeans, DBSCAN, AgglomerativeClusteringfrom sklearn.preprocessing i…

STM32自己从零开始实操04:显示电路原理图

一、TFT-LCD 屏接口 1.1指路 以下是该部分的设计出来后的实物图,我觉得看到实物图可能更方便理解这部分的设计。 图1 实物图 这部分设计的是一个屏幕的接口,很简单。使用的屏幕是:2.8inch 16BIT Module MRB2801。 1.2数据手册 &#xff0…

metasploit上线之后可以使用的命令

1. 通用控制命令 meterpreter > essions -k 1 # 通过ID号杀死一个会话 meterpreter > background # 将会话放入后台 meterpreter > getuid/getpid # 查询用户权限与PID meterpreter > sysinfo # 查看目标…

智慧校园教学模式的崛起:优化学习体验

在当今数字化时代,智慧校园教学模式正在成为教育界的热门话题。随着科技的不断发展,传统的教学方式已经无法满足现代学生的需求。智慧校园教学模式以其灵活性、互动性和个性化的特点,正逐渐改变着教育的面貌。 首先,智慧校园教学模…

R_AARCH64_ADR_PREL_PG_HI21问题说明

目录 问题现象: 问题原因 问题机理 问题现象: 客户现场加载out文件出现如下问题: 打印“Relocation of type ‘R_AARCH64_ADR_PREL_PG_HI22…..’”,明确是ARDP指令引起的问题 问题原因 ARDP的寻址范围是4GB范围,加载的位置…

Tomcat概述及部署

目录 一、Tomcat概述 1.Tomcat的简介 2.Tomcat 核心的三个组件 3.应用场景 4.Tomcat 请求过程 二、部署安装Tomcat 三、Tomcat 虚拟主机配置 四、Tomcat多实例部署 一、Tomcat概述 1.Tomcat的简介 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开…

经验分享,超声波车位引导系统和视频车位引导系统有哪些区别

随着城市化进程的加速和汽车保有量的持续增长,停车难已成为城市交通管理的一大挑战。车位引导系统作为解决这一问题的有效工具,其重要性日益凸显。它不仅能够提升停车场的运营效率,还能显著改善驾驶者的停车体验。目前市场上主要有两种车位引…

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

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

mac M1下安装PySide2

在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…

使用pexpect检查SSH上的文件是否存在

使用 pexpect 模块可以在 Python 中执行命令并检查其输出。你可以使用 ssh 命令连接到远程服务器,并执行 ls 命令检查文件是否存在。下面我就列举几个我经常遇到的几个错误并做个详细的解决方案。 1、问题背景 用户需要编写一个 Python 脚本,以检查一个…

编制教师违约金一般是多少钱

老师们,你们在签订合同时,对合同中提到的违约金条款感到疑惑?那么,编制教师的违约金一般是多少呢?可能很多老师在签订合同时都没有一个明确的答案。 违约金的设定是为了保障双方的权益,当一方违反合同约定时…