最短路径问题
路径问题涉及的网络是固定的道路网络。最佳路径问题是在预先规划的道路网络上寻找一个结点到另外结点之间最近(或成本最低)的路径。最佳路径分析也成最优路径分析,其一直是计算机科学、运筹学、交通工程学、地理信息科学等学科的研究热点。这里“最佳”包含很多含义,不仅指一般地理意义上的距离最短,还尅是成本最少、耗费时间最短、资源流量(容量)最大、线路利用率最高等标准。很多网络相关问题,如最可靠路径问题、最大容量路径问题、易达性评价问题和各种路径分配问题都可以纳入最佳路径问题的范畴之中。无论判断标准和实际问题中的约束条件如何变化,其核心实现方法都是最短路径算法。
最短路径问题的表达式比较简单的,从算法研究的角度看,最短路径问题通常可归纳为两大类:一类是所有点对之间的最短路径;另一类是单源点间的最短路径。
从一个单一的源到网络中所有或许多其他的定点的最短路径分析,成为单源SPAs或单源查询。从一个单一的源产生的最短路径的集合被称为最短路径树(SPT)。
计算最短路径的的典型算法有 Dantzig 和 Dijkstra算法,这两者都是单源的SPAs,适用于具有非负边权的网路,算法通常需要的时间是O(n^2),其中 n 是节点的数目。
Dantzig算法
Dantizig算法是一种具有离散动态规划形式的算法。算法基本步骤如下:
假设:求解顶点1到点2、3、4所有顶点的最短路径。
1)确定从顶点1开始的最短(最少的距离/成本/时间)边。
2)确定从顶点2开始并加上(1,2)边成本的最短(最少累计成本/时间)边。
3)确定标记集中最短(最少的累计成本/时间)的边。
4)所有的顶点都到打的时候停止;重复从顶点2、3和4开始,计算从每一个顶点出发的所有最短路径。
Dijkstra算法
Dijkstra(戴克斯图拉)算法是戴克斯图拉于 1959年提出的一种按路径长度递增的次序产生最短路径的算法,此算法被认为是解决单源点间最短路径问题经典且有效的算法。算法基本步骤如下:
假设:每一个点都有一对标号(d,p),其中 d 为从起源点 s 到点 j 的最短路径的长度(从顶点到其本身的最短路径是零路,即没有弧的路,其长度等于零);p 为从 s 到 j 的最短路径中j点的浅一点。求解从起源点 s 到点 j 的最短路径算法也成标号法或染色法。
1)初始化。起源点设置为 d = 0,p 为空,并标记起源点s,记k=s,其他所有点设为未标记点。
2)检验从速有已标记的点k到其直接连接的未标记的点 j 的距离,并设置d = min [ d ,d+l ],式中l为从点k到j的直接连接距离。
3)选取下一个点。从所有未标记的结点中,选取 d 中最小的一个 i,有d=min[ d ,所有未标记的点 j ],式中 i 就被选为最短路径中的一点,并设为已标记的点。
4)找到点i的前一点。从已标记的点中找到直接连接到点i的点j,作为前一点,记为 i = j
5)标记点 i 。如果所有点已标记,则算法完全退出,否则记 k = i ,重复步骤 2~4。
弗洛伊德算法
弗洛伊德(Floyd)算法能够求得每一对顶点之间的最短路径。算法基本步骤如下:
假设:求从顶点 i 到 j 的最短距离。
1)若从 i 到 j 有弧。则从 i 到 j 存在一条长度为 d 的路径,该路径不一定是最短路径,需要进行 n 次试探。首先判别弧(i,k)和弧(k,j)是否存在[即考虑路径 i , k , j 是否存在]
2)如果存在,则比较(i,j)和(i,k,j)的路径长度,较短者为从 i 到 j 的中间顶点的序号不大于 k 的最短路径。假如在路径上在增加一个顶点 m ,若路径 (i,…,m)和路径(m,…,j)就有可能是从 i 到 j 的中间顶点的序号不大于k的最短路径,那么后来的路径(i,…,m,…,j)就有可能是从 i 到 j 的中间顶点的序号不大于 m 的最短路径。将它和已经得到的 i 到 j 的中间顶点的序号不大于 k 的最短路径进行比较,从中选出中间顶点序号不大于 m 的最短路径,然后增加一个顶点 n,继续进行试探,经过 n 次比较后,最后求得的必将是 i 到 j 的最短路径。
矩阵算法
矩阵算法是利用矩阵来求出图的最短距离矩阵。算法基本步骤如下:
1)已知图的邻接矩阵 A ;
2)求出 A,A^2,A^3,…,A^n-2;
3)求出 D = AA^2A^3…A^N-2
由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:
这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn。(没看明白的可以看这个网址:https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069?fr=aladdin)