彻底吃透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.

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

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

相关文章

DNS解析与Bond

一、DNS 1、DNS概念 DNS是域名系统的简称:域名和ip地址之间的映射关系互联网中IP地址是通信的唯一标识,逻辑地址访问网站,有域名,ip地址不好记,域名朗朗上口,好记。 域名解析的目的:实现访问…

LeetCode 算法:最大子数组和c++

原题链接🔗:最大子数组和 难度:中等⭐️⭐️ 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 …

JVM之【字节码/Class文件/ClassFile 内容解析】

说在前面的话 Java语言:跨平台的语言(write once,run anywhere) 当Java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的解释器。跨平台似乎已经快成为一门语言…

Vue 3 Teleport:掌控渲染的艺术

title: Vue 3 Teleport:掌控渲染的艺术 date: 2024/6/5 updated: 2024/6/5 description: 这篇文章介绍了Vue3框架中的一个创新特性——Teleport,它允许开发者将组件内容投送到文档对象模型(DOM)中的任意位置,即使这个位…

房地产3d全景数字化看房成为转发的好工具

在短视频盛行的时代,某地产企业为了吸引客流,联合我们深圳VR公司定制了楼盘小区3D全景展示视频,不同于市面上常见的楼盘视频或3D电影,楼盘小区3D全景展示视频让您在小区建成之前,就能提前感受未来的生活场景。 无需昂贵…

C++第三方库【httplib】断点续传

什么是断点续传 上图是我们平时在浏览器下载文件的场景,下载的本质是数据的传输。当出现网络异常,浏览器异常,或者文件源的服务器异常,下载都可能会终止。而当异常解除后,重新下载文件,我们希望从上一次下载…

【技巧】系统语音是英文 影刀如何设置中文-作者:【小可耐教你学影刀RPA】

写在前面 嘿哈! 有些跨境或香港的小伙伴,可能需要使用英文操作界面的影刀 该功能目前还没有现成的可视化按钮🔘 但其实这个效果可以实现~ 1、效果图 2、实现原理 %影刀安装目录%\ShadowBot-版本号\ShadowBot.Shell.dll.confi…

2024050401-重学 Java 设计模式《实战代理模式》

重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」 一、前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不到前进…

机器学习:更多关于元学习

目录 Meta Learning vs Self-supervised Learning 自监督学习——找初始化的参数MAML 自动学出合适的参数 MAML:不断的学初始化参数MAML的初始化参数来自BERT MAML:找出来的初始化参数能在训练任务上表现的很好BERT:自监督目标是不同的下游任…

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…

Angular17(2):angular项目中使用NG-ZORRO

1、使用Angular CLI创建空项目 ng new angular-admin-web --stylescss 2、执行ng add ng-zorro-antd命令安装 &#xff08;1&#xff09;ng add ng-zorro-antd 在angular项目下运行命令 ng add ng-zorro-antd 跟随选项便可完成初始化配置&#xff0c;包括引入国际化文件&…

上位机图像处理和嵌入式模块部署(f407 mcu中的单独上位机烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;stm32有三种烧录方法&#xff0c;一种是st-link v2&#xff0c;一种是dap&#xff0c;一种是j-link。不过我们在实际操作…

C++基础编程100题-004 OpenJudge-1.1-06 空格分隔输出

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0101/06/ 描述 读入一个字符&#xff0c;一个整数&#xff0c;一个单精度浮点数&#xff0c;一个双精度浮点数&#xff0c;然后按顺序输出它们&#xff0c;并且要求在他们之间用一个空格分隔。输出浮点数时保留…

中信证券:A股下半年将迎来年度级别上涨行情的起点

中信证券认为&#xff0c; 过去3年压制A股表现的经济动能转换&#xff0c;资本市场生态&#xff0c;中美战略博弈这三大叙事都将迎来重大拐点&#xff0c;随着政策、价格、外部三类信号逐步验证&#xff0c;2024年下半年A股市场将迎来年度级别上涨行情的起点 过去3年压制A股表…

鸿蒙开发接口安全:【@ohos.userIAM.userAuth (用户认证)】

用户认证 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import userIAM_userAuth from ohos.userIAM.userAuth;完整示例 // API version 6 import userIAM_userAuth from ohos.use…

最小栈、栈的弹出(C++)

1.最小栈 思路分析&#xff1a; 代码&#xff1a; class MinStack { public:MinStack() {}void push(int val) {st.push(val);//两种情况需要更新最小值//1.最小栈为空(就是存最小值的那个栈)//2.插入的值小于或等于最小栈的栈顶元素if(minstack.empty()||minstack.top()>…

C++--DAY3

思维导图 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class …

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器&#xff0c;它们充当客户端和目标服务器之间的中介&#xff0c;但它们的工作方式和应用场景有所不同。 1. SOCKS 代理&#xff1a; 工作原理&#xff1a; SOCKS 代理是一种更底层的代理&#xff0c;…

查看docker中各个容器所占的资源

要查看Docker中的每个容器占用的资源&#xff0c;可以使用docker stats命令。这个命令提供了容器的实时资源使用统计&#xff0c;包括内存使用情况。以下是如何使用docker stats命令的示例&#xff1a; docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsa…

【QT5】<总览三> QT常用控件

文章目录 前言 一、QWidget---界面 二、QPushButton---按钮 三、QRadioButton---单选按钮 四、QCheckBox---多选、三选按钮 五、margin&padding---边距控制 六、QHBoxLayout---水平布局 七、QVBoxLayout---垂直布局 八、QGridLayout---网格布局 九、QSplitter---…