由于最近接触了大量关于路径规划的算法,所以这一期我们来讨论下路径规划的问题!~!
首先,我要介绍下关于路径规划问题的一些基本概念。
图
在最短路径问题中,我们往往给定一个带权重的有向图,G=(V,E),以及权重函数w:E->R,改权重函数将每条边映射到实数值的权重上。
松弛操作
对于一条边(u,v)的松弛过程就是:首先测试一下对s到v的最短路径进行改善。
测试方法就是:将从结点s到结点u的最短路径加上结点u到结点v的权重值,并与当前结点s到结点v的最短路径进行比较。如果前者更小,就进行更新。
接下来我会介绍下几种主要的路径规划算法:
Dijkstra算法
Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。
Dijkstra算法采用的是一种贪心的策略:
他首先声明一个数组dis来保存源点s到各个结点的最短距离,以及一个保存已经找到最短的结点的集合T。
初始后,他先将s的路径权重设置为0,再将对于s能直接到达的u结点的权重设置为w,即dis[u]=w,同时把其他(s不能直接到的结点)路径长度设置为无穷大。此时T里面只包含u一个结点。
此时dis[]里面的值是否就是s结点能到达的最短路径呢?不着急,我们先看看新加入的结点是否可以到达其他节点,并且看看经由此节点到达其他结点的路径是否比从s源点直接到达更短,也就是一个松弛的过程。
然后,重复上述动作,直到T中包含了图的所有顶点。
此算法有也衍生出很多应用在不同场景下的算法,比如说用于稀疏图的Johnson算法。Johnson算法使用技术称之为重新赋予权重。
原理如下:
如果图中所有边的权重赋值为非负数,我们可以通过对每个结点对运行一次Dijkstra算法来找到所有结点对之间的最短路径。
如果图中包含有负数的权重的边,且不包含权重为负的环路,那么我们只要计算出一组新