1、动态规划算法
2、拓展思考优化
现在,GPS导航为咱们的交通出行带来了极大的便利,尤为是对于MC君这种路痴而言,出行已经依赖了地图导航。在地图导航软件中,咱们最经常使用到的功能就是搜寻最短路程的路线或者最短期的路线,咱们知道,城市路网是错综复杂的,若是要遍历从出发地到终点的全部路线,计算量是巨大的,耗时也很长,那导航系统到底是如何作到在最短的时间内搜寻到最短路线呢?吴军老师在《数学之美》一书中提到了一种经常使用的优化方法:动态规划。3d
动态规划(Dynamic Programming)的核心思想就是把一个大的问题拆解成一个个小的子问题,经过求解这些子问题,层层优化,最终获得大问题的最优解。动态规划是一种有效求解最短路径问题的优化方法,咱们举个具体的例子看看它是如何操做的吧!下图是一个简化版的城市路网,假如我如今要从A城出发,如今求从A城到E城的最短路线。code
看着错综复杂的路线图真的头都大了!但咱们能够根据每一个城市的链接关系做出一个简单的有向图,每一个城市就是一个节点,每一条路就是一条弧,以下图所示,图中弧的权重对应地图上的距离(为了不标注的混乱,只标注了部分的距离)。经过绘制有向图,如此,就把A到E的路线分红了三个阶段,分别是A→Bi(i=1,2,3,4)、Bi→Cj(j=1,2,3)和Cj→Dk(k=1,2)。blog
咱们如今假设从A到E的最短路线为A→B2→C2→D2→E(路线1),那么能够判定,从A出发到D2的最短路线必定是A→B2→C2→D2(子路线1),为何?试想一下,从A到D2若是还存在一条更短的路线,好比A→B2→C1→D2(子路线1),那就能够直接推出A→B2→C1→D2→E(路线2)是A到E的最短路线,这就和最前面的假设相矛盾了。换句话说,假如A到E会通过D2,A到E的最短路线就等于A到D2的最短路线加上D2→E。同理,假如A到D2的最短路线会通过C2,A到D2的最短路线就等于A到C2的最短路线加上C2→D2。如此,咱们就能够一步一步地将最短路线问题拆解成一个个子路线问题,这就是动态规划求解最短路线的基本思路。数学
根据上述的思路,咱们就能够试着把上面的问题进行拆解了。设,表示A到X点的距离,就表示A到X点的最短距离。问题就是求解,不妨对进行拆解:class
接下来,就要对进行拆解了:基础
依次类推,最终咱们就能够把拆解成关于的表达式,易知,它们分别为4,2,3,3。软件
要求解,只需将上面的拆解过程反过来就能够了,即先求,而后求,再求,最后获得。因而,每向前走一步,都只须要计算当前与下一步之间的距离,而不须要重头开始计算。咱们能够对比一下动态规划法和穷举法的计算量,就上面这个问题,采用动态规划法的计算量是:,若是是穷举法呢?计算量是:??好像区别不大。但若是咱们把A和E之间的城市数量增长,假设从A到E要通过10个阶段,每一个阶段有20座城市,动态规划的计算量是:,穷举法的计算量是,根本不在一个量级!!!因此,动态规划是一种简单的快速寻优算法,吴军老师在书中也说起不少导航系统都是采用动态规划来计算最短路线。遍历
其实,上面这个问题咱们还能够做一些拓展的思考。
拓展一:假如如今A和D1之间多建了一条高铁(以下图红色虚线),能够直接从A到达D1,那么应该如何求解A到E的最短路线?
那这个问题其实也简单,咱们只须要在改变一下的求解式就好了,即增长一项,其余的步骤不变:
拓展二:在实际的导航应用中,地图软件都设置不一样的路线偏好,为用户指定最合适的路线方案,例如:时间最短、高速优先、躲避拥堵等等,那这些方案是如何经过算法实现的呢?(如下仅仅是个人我的理解,由于我也不知道软件自己采用的算法是怎样的。)
若是要搜寻时间最短的方案,只须要将有向图中弧的权重从原先的距离改成行车时间便可,那每条路的行车时间如何获得呢?那就是距离除以公路的车速(这个车速具体怎么求就不得而知了)。
若是要搜寻高速优先或者躲避拥堵的方案,能够在原来距离的基础上乘以一个系数,高速公路对应的弧就乘以一个小于1的系数,如0.5,拥堵路段就乘以一个大于1的系数,如2,实际上就是经过改变系数来改变实际距离,从而达到不一样的目的。
以上就是我对动态规划求解最短路线的理解,若有不一样意见,请在评论区留言,十分感谢!
笔记来源:吴军《数学之美》12章