Dijkstra算法的思想和数学归纳法

简介:

ospf协议很多人都知道,很多人也会配置而且很熟练,但是很少有人懂得其背后的思想是什么,Dijkstra算法是求解单源最短路径的绝妙算法之一,我打心眼里头喜欢这个算法,真想把之一去掉。Dijkstra算法是一种贪心算法,贪心算法的本质就是最值的和还是最值,也就是说人们相信我只要在点滴当中尽自己最大的努力,那么最后的结果就是最好的,可能你会说不一定,但是你敢说如果有一个环节你没有尽最大的努力,最后的结果会更好吗?你不能,我也不能,因为现实总是很残酷,事后诸葛亮只能出现在理想状态,事情已经发生,那么你就不能说更好的结果需要什么条件,正所谓“证明一件事是错的很容易,但是证明一件事正确根本不可能!”,因此贪心算法的证明非常复杂,可是Dijkstra算法确实是正确的,为什么?不是因为它不是纯粹的贪心算法,正是因为它的条件里面存在的信息很少,我们可以利用另一把利器来证明之,这把利器就是“数学归纳法”。

数学归纳法是一种艺术,玩过多米诺骨牌的都知道,要使得任意数量的所有牌全部翻掉需要两个条件而且只需要两个条件,一个就是任意两张牌间隔足够近,另一个条件就是你必须推到第一张牌,就是这么简单。于是如果你往这个游戏靠拢你会发现,牌的倒掉和牌的数量以及牌上的内容没有任何关系,那么任何可以归结到这个游戏的数学模型都可以用这个原理进行求解,多米诺骨牌游戏的数学模型就是数学归纳法,数学归纳法进行的证明需要两点,第一就是初始条件(推到第一张牌),第二就是假设n成立证明n+1成立(两张牌间隔足够近),贪心算法是一个步骤问题,如果我们可以证明贪心算法的第一部很显然正确并且在归纳假设的情况下证明归纳假设的系一个步骤也正确的话,那么贪心算法的局部最优解结合成的全局解一定是全局最优解,这是一定的。

Dijkstra算法是一个贪心算法,那么我们可以通过数学归纳法证明其正确性,关键就是如何建立数学模型。Dijkstra算法的步骤是显然的,是简单的,我们只需要证明这个算法产生的路径就是最短的就可以了,于是模型就有了,很多书上都用open-set作为“外面”的点,将close-set作为加入到“里面”的点,那么我们就证明每通过Dijkstra算法加入到close-set的点到原点的距离就是到原点距离的最短距离,这样我们就证明了算法本身的正确性,因此开始用数学归纳法证明吧,当close-set中除了原点只有一个点的时候,这个点p离原点s的距离一定是最短的,因为如果s先到x再到p的距离比s直接到p还短,那么s到x会更短,算法就不会选中p而会选中x,与假设矛盾,这里已经证明了初始条件,下面开始归纳假设,设close-set中有k个点时,所有close-set中的k个点根据算法算出的距离都是最短的距离,那么我们考虑加入第k+1个点加入时的情形,只要能证明k+1个点按照算法加入进close-set从而算出的距离也是最短距离的话,那么问题得证,这个问题也是很好证明的,同样用反证法,假设不是靠算法加入的,那么路径中一定除了终点p之外还有一个点在open-set中,如果这样的话,根本就不可选中终点p而会选中那个经过的点,也是矛盾的,由此问题得证。在上面额证明中,所有在close-set中和p相连的点都会参与最后的最短距离竞争,因此就在它们当中选一条路径最为结果就是问题的答案,而这正是算法的行为。

这里可以看到有时候贪心算法可以用数学归纳法来证明,但是有的时候不能,不能的原因就在于约束条件太多,要么就是因为初始条件无法被证明但是归纳假设却正确,其实千万不要过度怀疑贪心算法,我们人做事的时候不是也都是在用贪心算法吗?如果有谁在做事之前来个全局证明或者必须证明其严密性的话,那么这个人最终会因为理智过度要么被社会淘汰,要么成为划时代的思想家。贪心算法来自于一个事实,那就是爆炸,爆炸波的包络面总是呈球面向外扩撒,球面刚接触到一个点的时候,这个点到爆炸源的距离肯定最短,这不是废话吗?这个点到爆炸源的连线不是一条线段吗?很多的时候是一条线段,但是考虑到爆炸不是在一个密度相同的没有障碍物的地方,而是在一个建筑物里面,该建筑物内部有复杂的小隔间,而且各个隔间相通,隔间之间是坚固的钢板隔开,爆炸无法摧毁这些隔板,那么爆炸波的包络面虽然是球面,但是实际路线却不是线段,而是沿着各个隔间之间的通道走的,这个时候首先被波及的点沿着爆炸波的路线回到爆炸点,路线肯定是最短的,这是事实啊,好事怎么也波及不到我们,坏事总是用最快的是速度到来。

有时候觉得人做事很多时候挺像计算机的,用了很多的算法,按经验步骤进行,不求甚解,而我们从小学开始学的那些数学,比如解方程,函数求导之类的却是纯思维的东西,这些一般来用发掘新的算法,人的算法还来自于经验,但是到底哪个更重要呢?


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274010


相关文章
|
4月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
106 5
|
1月前
|
机器学习/深度学习 人工智能 算法
当AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
TimeGuessr融合AI与历史文化,首创时间与空间双维度评分体系,结合分段惩罚、Haversine距离计算与加权算法,辅以连击、速度与完美奖励机制,实现公平且富挑战性的游戏体验。
|
1月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
194 4
|
2月前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
707 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
8月前
|
机器学习/深度学习 算法
扩散模型=进化算法!生物学大佬用数学揭示本质
在机器学习与生物学交叉领域,Tufts和Harvard大学研究人员揭示了扩散模型与进化算法的深刻联系。研究表明,扩散模型本质上是一种进化算法,通过逐步去噪生成数据点,类似于进化中的变异和选择机制。这一发现不仅在理论上具有重要意义,还提出了扩散进化方法,能够高效识别多解、处理高维复杂参数空间,并显著减少计算步骤,为图像生成、视频合成及神经网络优化等应用带来广泛潜力。论文地址:https://arxiv.org/pdf/2410.02543。
233 21
|
9月前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
2801 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
9月前
|
机器学习/深度学习 人工智能 算法
Transformer打破三十年数学猜想!Meta研究者用AI给出反例,算法杀手攻克数学难题
《PatternBoost: Constructions in Mathematics with a Little Help from AI》提出了一种结合传统搜索算法和Transformer神经网络的PatternBoost算法,通过局部搜索和全局优化交替进行,成功应用于组合数学问题。该算法在图论中的Ramsey数研究中找到了更小的反例,推翻了一个30年的猜想,展示了AI在数学研究中的巨大潜力,但也面临可解释性和通用性的挑战。论文地址:https://arxiv.org/abs/2411.00566
213 13
|
8月前
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)

热门文章

最新文章