最短路径算法
- 格式:doc
- 大小:667.00 KB
- 文档页数:38
物流领域中的运输路径规划算法综述与优化运输路径规划是物流领域中至关重要的环节,它涉及到货物的运输安排、运输成本的控制以及运输效率的提升。
在物流管理中,合理的运输路径规划可以有效地降低物流成本,提高运输效率,优化供应链管理。
本文将综述物流领域中常用的运输路径规划算法,并探讨其优化方法和应用。
一、传统运输路径规划算法综述1. 最短路径算法最短路径算法是物流领域中最基础且常用的路径规划算法之一。
其主要目标是通过确定节点之间的最短路径来实现快速、高效的货物配送。
常用的最短路径算法包括Dijkstra算法、Floyd-Warshall算法和A*算法。
这些算法通过考虑节点之间的距离、时间、耗费等因素来进行路径选择,以最小化总体的运输成本。
2. 蚁群算法蚁群算法是一种模拟蚂蚁寻找食物路径的群体智能算法。
在物流领域中,蚁群算法被广泛应用于货车路径规划、货柜装载问题等。
它通过模拟蚂蚁在搜索食物时的信息素传递和选择机制,寻找最优的运输路径。
蚁群算法具有较强的自适应性和全局搜索能力,能够有效解决复杂的路径规划问题。
3. 遗传算法遗传算法是一种模拟生物进化过程的启发式算法。
在物流领域中,遗传算法被广泛应用于货物配送路径优化、车辆调度等问题。
它通过模拟自然选择、交叉、变异等操作,不断优化运输路径的适应度,以提高运输效率和降低成本。
遗传算法具有较强的全局搜索能力和并行计算能力,能够获取较优的解。
二、运输路径规划算法的优化方法1. 路径规划算法与实时数据的结合传统的运输路径规划算法大多是基于固定的网络拓扑结构,未考虑实时数据的变化。
而结合实时数据的路径规划算法可以更加准确地预测交通状况,从而选择更优的运输路径。
例如,通过实时交通数据可以选择空闲路段,避开拥堵路段,从而降低运输时间和成本。
2. 多目标优化算法在实际的物流运输中,往往涉及到多个目标,如最短路径、最小成本、最小时间等。
传统的路径规划算法往往只考虑一个目标,忽略了其他因素的影响。
最短路径dijkstra算法流程最短路径算法是计算在带权有向图或者无向图中起点到所有其他点最短路径的一种算法,其中最短路径指的是边权值之和最少的路径。
目前最常用的算法是Dijkstra算法,它是由荷兰计算机科学家Edsger W. Dijkstra于1959年提出的。
下面将介绍Dijkstra算法的流程。
1. 初始化首先,需要将起点到每个点的最短距离都初始化为无穷大,除了起点自己的最短距离为0。
其中,起点是指算法的起点节点。
同时,需要创建一个集合S,用于记录已经确定了最短距离的点。
2. 找出未确定最短路径的节点中最小的距离,并将其标记为已确定最短路径在第一步中,只有起点节点的最短距离是确定的。
接下来,在集合S中找出剩余未确定最短路径的节点中距离最小的节点u,并将其标记为已经确定了最短路径。
在第一次执行该步骤时,节点u即为起点节点。
3. 更新最短距离将节点u所有邻居的距离进行更新。
假设节点v是节点u的邻居,其距离为d(u,v),则:如果 d(u,v) + dist(u) < dist(v),则更新节点v的最短距离为d(u,v) + dist(u),其中dist(u)表示起点节点到节点u的最短距离。
重复执行上述步骤,直到集合S中包含所有节点。
4. 输出每个节点的最短距离执行完第三步之后,每个节点的最短距离都已经确定。
此时,可以输出每个节点的最短距离。
以上就是Dijkstra算法的流程。
此外,这个算法还可以通过堆优化来提高效率。
具体来说,可以将还未确定最短距离的节点按照距离从小到大存储在堆中,每次取出堆中距离最小的节点。
(这部分由于是在原算法的基础之上的优化模型,所以该模型不友好于百科网站的格式要求,如果您有需要,也可以决定不包括,并以此作为描述结尾)总的来说,Dijkstra算法是求解最短路径问题的有效方法之一。
它适用于只有正权边的有向或者无向图,并且能够计算出起点到所有其他节点的最短路径。
因此,它可以用于路线规划、制订地图等应用情景中。
Dijkstra算法是一种用于计算图中从一个顶点到其他所有顶点的最短路径的算法。
它由荷兰计算机科学家艾兹赫尔·戴克斯特拉于1956年提出。
Dijkstra算法的基本思想是通过不断更新起始顶点到其他顶点的最短路径长度,逐步找到最短路径。
以下将详细介绍Dijkstra算法的步骤,并给出一个例题和表格供读者参考。
一、算法步骤1. 初始化- 设置起始顶点的最短路径为0,其余顶点的最短路径为无穷大。
- 将起始顶点加入已访问的顶点集合。
2. 更新- 从未访问的顶点中选择离起始顶点最近的顶点,将其加入已访问的顶点集合。
- 更新起始顶点到其他顶点的最短路径长度,如果经过新加入的顶点到其他顶点的路径长度小于当前已知的最短路径长度,则更新最短路径长度。
3. 重复更新直到所有顶点都被访问过。
二、算法实例为了更好地理解Dijkstra算法的具体应用步骤,我们通过一个实际的例题来演示算法的执行过程。
假设有以下带权重的图,起始顶点为A:顶点 A B C D EA 0 3 4 ∞ ∞B ∞ 0 ∞ 1 7C ∞ 4 0 2 ∞D ∞ ∞ ∞ 0 5E ∞ ∞ ∞ ∞ 0表中每个元素表示从对应顶点到其它顶点的边的权重,"∞"表示没有直接相连的边。
我们按照Dijkstra算法的步骤来计算从顶点A到其他顶点的最短路径长度。
1. 初始化起始顶点为A,初始化A到各顶点的最短路径长度为0,其余顶点的最短路径长度为∞。
将A加入已访问的顶点集合。
2. 更新选择A到B的路径长度最短,将B加入已访问的顶点集合。
更新A到C和A到D的最短路径长度。
3. 重复更新依次选择离起始顶点最近的顶点,并更新最短路径长度,直到所有顶点被访问。
通过不断的更新,最终得到从顶点A到其他顶点的最短路径长度表格如下:顶点 A B C D E最短路径长度 0 3 4 5 9三、总结通过以上Dijkstra算法的步骤和实例计算,我们可以清晰地了解该算法的执行过程和原理。
最短路径dijkstra算法过程
Dijkstra算法是一种用于解决最短路径问题的经典算法,其过
程如下:
1. 创建一个距离表,记录从起始节点到每个节点的距离。
初始时,除了起始节点,其他节点的距离被设置为无穷大,起始节点的距离被设置为0。
2. 创建一个集合Q,用于存放还未被访问的节点。
3. 在集合Q中找到距离最小的节点v并将其从集合Q中移除。
如果没有找到,则说明所有节点已被访问完毕,算法结束。
4. 遍历节点v的所有邻居节点u,对于每个邻居节点u,更新
其距离表中的距离。
如果通过节点v可以获得比原先距离更短的路径,则更新距离。
5. 重复步骤3和步骤4,直到集合Q为空。
6. 返回距离表,其中记录了从起始节点到其他节点的最短距离。
需要注意的是,在实现过程中,需要使用一个优先队列来快速找到集合Q中距离最小的节点v,以提高算法的效率。
以上就是Dijkstra算法的基本过程。
通过不断更新距离表,算
法可以找到从起始节点到其他节点的最短路径。
计算机网络之路由算法:最短路径法则,提升路由效率!计算机网络之路由算法:最短路径法则,提升路由效率1. 概述计算机网络中的路由算法是实现网络数据包传输的重要组成部分。
最短路径法则是一种常用的路由算法,它通过选择最短的路径来提高路由效率。
本文将介绍最短路径法则的原理和应用。
2. 最短路径法则的原理最短路径法则的基本原理是通过计算各个节点之间的距离,选取距离最短的路径作为数据包传输的路径。
常用的最短路径计算算法有Dijkstra算法和Bellman-Ford算法。
Dijkstra算法是一种常用的单源最短路径算法,它通过不断选择当前距离起点最近的节点,逐步更新节点的距离值,直到找到起点到目标节点的最短路径。
该算法的时间复杂度为O(V^2),其中V为网络中节点的数量。
Bellman-Ford算法是一种能够处理带有负权边的图的最短路径算法,它通过不断松弛边的权值来计算最短路径。
该算法的时间复杂度为O(VE),其中V为网络中节点的数量,E为网络中边的数量。
3. 最短路径法则的应用最短路径法则广泛应用于计算机网络中的路由选择和网络优化等方面。
通过选取最短路径,可以提高数据包传输的效率和速度,减少网络拥塞等问题。
在实际应用中,最短路径法则可以通过路由器和交换机等网络设备的配置来实现。
通过配置路由表和控制数据包的流向,可以实现数据包按照最短路径进行传输。
4. 总结最短路径法则是一种提高路由效率的常用算法,在计算机网络中具有广泛的应用。
通过选取最短路径,可以实现数据包的快速传输,并减少网络拥塞等问题。
不同的最短路径计算算法适用于不同的场景,选择适合的算法可以提升路由效率。
该文档提供了最短路径法则的概述、原理和应用,帮助读者理解和应用最短路径算法。
通过合理的路由算法选择和配置,可以优化网络性能,提高数据传输效率。
---*注意:本文档仅提供概述和基本原理,具体网络配置和算法细节需根据实际情况进行进一步研究和探索。
*。
最短路径的算法最短路径的算法小河边有两个村庄A,B,要在河边建一自来水厂向A村与B村供水,若要使厂部到A,B村的距离相等,则应选择在哪建厂?要回答出这个问题,我们就要了解一下最短路径的相关知识。
以下是店铺与大家分享最短路径的知识。
最短路径最短路径,是指用于计算一个节点到所有节点的最短的线路。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
最短路径问题是图论研究中的一个经典算法问题,旨在图(由结点和路径组成的)中两结点之间的最短路径。
最短路径问题最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。
算法具体的形式包括:确定起点的最短路径问题- 即已知起始结点,求最短路径的问题。
适合使用Dijkstra算法。
确定终点的最短路径问题- 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。
在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题- 即已知起点和终点,求两结点之间的最短路径。
全局最短路径问题- 求图中所有的最短路径。
适合使用Floyd-Warshall算法。
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法是很有代表性的最短路径算法,在很多课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
注意该算法要求图中不存在负权边。
问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。
(单源最短路径)2.算法描述1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。
最短路径问题算法最短路径问题算法概述:在图论中,最短路径问题是指在一个加权有向图或无向图中,从一个顶点出发到另外一个顶点的所有路径中,权值和最小的那条路径。
最短路径问题是图论中的经典问题,在实际应用中有着广泛的应用。
本文将介绍常见的几种最短路径算法及其优缺点。
Dijkstra算法:Dijkstra算法是一种贪心算法,用于解决带权有向图或无向图的单源最短路径问题,即给定一个起点s,求出从s到其他所有顶点的最短路径。
Dijkstra算法采用了广度优先搜索策略,并使用了优先队列来维护当前已知的距离最小的节点。
实现步骤:1. 初始化:将起始节点标记为已访问,并将所有其他节点标记为未访问。
2. 将起始节点加入优先队列,并设置其距离为0。
3. 重复以下步骤直至队列为空:a. 取出当前距离起始节点距离最小的节点u。
b. 遍历u的所有邻居v:i. 如果v未被访问过,则将其标记为已访问,并计算v到起始节点的距离,更新v的距离。
ii. 如果v已被访问过,则比较v到起始节点的距离和当前已知的最短距离,如果更小则更新v的距离。
c. 将所有邻居节点加入优先队列中。
优缺点:Dijkstra算法能够求解任意两点之间的最短路径,并且保证在有向图中不会出现负权回路。
但是Dijkstra算法只适用于无负权边的图,因为负权边会导致算法失效。
Bellman-Ford算法:Bellman-Ford算法是一种动态规划算法,用于解决带权有向图或无向图的单源最短路径问题。
与Dijkstra算法不同,Bellman-Ford算法可以处理带有负权边的图。
实现步骤:1. 初始化:将起始节点标记为已访问,并将所有其他节点标记为未访问。
2. 对于每个节点v,初始化其到起始节点s的距离为正无穷大。
3. 将起始节点s到自身的距离设置为0。
4. 重复以下步骤n-1次(n为顶点数):a. 遍历所有边(u, v),如果u到起始节点s的距离加上(u, v)边权小于v到起始节点s的距离,则更新v的距离为u到起始节点s的距离加上(u, v)边权。
求最短路径的算法
最短路径算法是计算图中两个节点之间最短距离的算法。
在计算机科学中,最短路径算法是图论中最基本的算法之一。
最常见的应用是在路由算法中,用来寻找两个网络节点之间的最短路径。
最短路径算法有多种实现方式,其中最著名的算法是迪杰斯特拉算法和弗洛伊德算法。
迪杰斯特拉算法使用贪心策略,从起点开始对所有节点进行扫描,依次找到距离起点最近的节点,并更新与其相邻节点的距离。
弗洛伊德算法则是基于动态规划的思想,通过递推计算出所有节点之间的最短路径。
除了以上两种算法,还有贝尔曼-福德算法、A*算法等,它们各自适用于不同的场景。
例如,A*算法是一种启发式搜索算法,根据启发函数估计到目标节点的距离,从而更快地找到最短路径。
在实际应用中,最短路径算法被广泛使用。
例如,在地图导航中,我们需要找到最短路径来规划行程;在通信网络中,路由器需要计算出最短路径来转发数据包。
因此,掌握最短路径算法是计算机科学学习的基础,也是工程实践中必备的技能。
- 1 -。
最短路径在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。
由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。
对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。
从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或最短距离。
最短路径算法Dijkstra算法:该算法是用于求解单源点最短路径的实用算法。
Dijkstra算法的基本思想如下:设置并逐步扩充一个集合S,存放已求出其最短路径的顶点,则尚未确定最短路径的顶点集合是V-S其中,V为网中所有顶点集合。
按最短路径长度递增的顺序逐个用V-S中的顶点加到S中,直到S中包含全部顶点,而V-S为空。
Dijkstra算法的具体步骤;(1)设源点为V1,则S中只包含顶点V1,令W=V-S,则W中包含除V1外图中所有顶点。
V1对应的距离值为0,即D[1]=0。
W中顶点对应的距离值是这样规定的:若图中有弧 <v1,vk>,则Vj顶点的距离为此弧权值,否则为一个无穷大的数;(2)从W中选择一个其距离值最小的顶点 vk,并加入到S中;(3)每往S中加入一个顶点vk后,就要对W中各个顶点的距离值进行一次修改。
若加进vk做中间顶点,使<v1,vk> + <vk+vj>的值小于<v1,vj> 值,则用<v1,vk> + <vk+vj>代替原来vj 的距离值;(4)重复步骤2和3,即在修改过的W中的选距离值最小的顶点加入到S 中,并修改W中的各个顶点的距离值,如此进行下去,知道S中包含图中所有顶点为之,即S=V。
最短路径算法在计算机科学和图形学中,最短路径算法是一种用于找到一组节点之间最短路径的算法。
这些算法广泛应用于路由算法、GIS系统、模拟导航系统等领域。
在许多实际应用中,最短路径算法提供了许多实用的功能,如确定两点之间的距离和导航路径等。
下面将介绍几种最短路径算法的基本原理和实现方法。
一、Dijkstra算法Dijkstra算法是一种基于贪婪策略的最短路径算法,适用于图中不含负权边的图。
该算法的基本思想是从一个源节点开始,逐步计算源节点到其他节点的最短路径。
算法的核心思想是每次选择当前已知最短路径的节点,并更新其邻居节点的距离。
实现步骤如下:1. 初始化:将源节点的距离设为0,将所有其他节点的距离设为无穷大。
2. 遍历所有与源节点相邻的节点,并更新其到源节点的距离。
3. 对于每个相邻节点,如果通过源节点到达该节点的距离小于当前距离,则更新该节点的距离。
4. 重复步骤2和3,直到所有节点的距离都得到更新。
二、Bellman-Ford算法Bellman-Ford算法是一种适用于包含负权边的图的最短路径算法。
该算法通过多次迭代来更新节点的距离,并使用松弛操作来检测负权环。
该算法的时间复杂度为O(n),其中n是图中节点的数量。
实现步骤如下:1. 初始化:将源节点的距离设为0,并将所有其他节点的距离设为可能的最长距离(例如正无穷)。
2. 对于每个相邻节点u,从图中移除边(u, v),并更新v的距离(如果存在)。
3. 在没有剩余边的情况下,重新初始化所有节点的距离。
4. 重复步骤2和3,直到所有边的长度被增加到所有v的权重的加和+ε或被更改为新权重的节点变为可达状态。
如果某个节点的权重减小或为负数(因此没有负权环),那么就从结果集中移除它,并将邻居的权重减小对应的数量到其它节点中对应邻居的权重处(对权重相同的情况仍然可采用轮转机制确保统一更新)以优化该点下一步的可能选择空间和对应的下一个邻居的可能状态下的可能性一致。
6.3.3 最短路径算法--Dijkstra算法,Bellmanford算法,Floyd算法,Johnson 算法最短路径算法在交通地图上,两地点之间的路径通常标有长度,我们可以用加权有向来描述地图上的交通网。
加权有向图中每条路径都有一个路径权值,大小为该路径上所有边的权值之和。
本节将重点讨论顶点之间最短路径问题。
在实际问题中,路径权值还可以表示其它类型的开销,例如两地之间行程所需要的时间;两任务切换所需代价等。
本节讨论的最短路径具有方向性,问题用图的术语描述为:给定一个起始顶点s和一个结束顶点t,在图中找出从s到t的一条最短路径。
称s为路径源点,t为路径汇点。
最短路径问题可以进一步分为单源最短路径和全源最短路径。
● 单源最短路径定义为,给定起始顶点s,找出从s到图中其它各顶点的最短路径。
求解单源最短路径的算法主要是Dijkstra算法和Bellman-Ford算法,其中Dijkstra算法主要解决所有边的权为非负的单源最短路径问题,而Bellman-Ford算法可以适用于更一般的问题,图中边的权值可以为负。
● 全源最短路径定义为,找出连接图中各对顶点的最短路径。
求解全源最短路径的算法主要有Floyd算法和Johonson算法,其中Floyd算法可以检测图中的负环并可以解决不包括负环的图中的全源最短路径问题;Johonson算法同样也是解决不包含负环的图的全源最短路径问题,但是其算法效率更高。
1 基本原则最短路径算法具有最短路径的最优子结构性质,也就是两顶点之间的最短路径包括路径上其它顶点的最短路径。
具体描述为:对于给定的带权图G=(V, E),设p=<v1, v2, …,v k>是从v1到v k的最短路径,那么对于任意i和j,1≤i≤j≤k,p ij=<v i, v i+1, …, v j>为p中顶点v i到v j的子路径,那么p ij是顶点v i到v j的最短路径。
最短路径算法都使用了松弛(relaxation)技术。
开始进行一个最短路径算法时,只知道图中边和权值。
随着处理逐渐得到各对顶点的最短路径的信息。
算法会逐渐更新这些信息,每步都会检查是否可以找到一条路径比当前给定路径更短。
这一过程通常称为“松弛”。
如图为单元最短路径算法的松弛操作。
问题为求求解顶点s到图中各顶点之间的最短路径,用d[i]表示顶点s到顶点i的最短路径的长度。
对权值为1的边(v, w)进行松弛,若当前到顶点v和w的最短路径的长度分别6和8,如图(a),则此时d[w]<d[v]+ω(v, w),所以对d[w]的值需要减小,并且s到顶点w的最短路径为顶点s到v的最短路径,再经过边(v, w),如图(b)。
我们用d[i]数组表示顶点s到顶点i的最短路径的长度,用p[i]表示顶点i在最短路径中的父顶点。
可以将边松弛过程用一下代码来描述:Relax(v, w, ω(v, w))if d[w]>d[v] + ω(v, w){d[w]=d[v] + ω(v, w); p[w] = v;}2 单源最短路径单源最短路径定义为,给定起始顶点s,找出从s到图中其它各顶点的最短路径。
这里我们将得到的结果称为最短路径树(shortest path tree),其中树根为起始顶点s。
2.1 Dijkstra算法在前面章节中讨论最小支撑树时,我们讨论了Prim算法:每次选择一条边添加到最小支撑树MST中,这条边连接当前MST中某个顶点和尚未在MST中的某个顶点,其权值最小。
采用类似的方案可以计算最短路径树SPT。
开始时将源点添加到SPT中,然后,每次增加一条边来构建SPT,所取的边总是可以给出从源点到尚未在SPT中某个定点的最短路径。
这样,顶点按照到源点的距离由小到大逐个添加到SPT中。
这种算法称为Dijkstra算法,具体的实现跟Prim类型,分为普通实现和基于最小堆的实现。
首先,我们需要明确Dijkstra算法的适用范围是权值非负的图,即解决带有非负权值的图中的单源最短路径问题。
下面对这一属性做简单分析。
给定顶点s,通过Dijkstra算法得到的最短路径树中,从根s到树中各顶点u的树路径对应着图中从顶点s到顶点u的最短路径。
归纳证明如下:假设当前所得到的子树具有这一属性,向当前子树中添加新的顶点u,满足:从顶点s 出发,经过当前SPT中的树路径,并最终到达u。
可以通过选择,使得所选择的s到u的路径比所有满足条件的路径都更短。
所以增加一个新的顶点将增加到达该顶点的一条最短路径。
如果边的权值可以为负数,那么上述证明过程将不成立,上述证明中已经假设了向当前子树中添加新的边时,路径的长度不会递减。
然而在具有负权值的边的图中,这个假设不能满足,因为所遇到的任何边都可能指向子树中的某个顶点,而且这条边可能有一个负权值,从而会使得到达该顶点的路径比树路径更短。
以下是Dijkstra算法的实现,Dijkstra算法和基于优先队列的Dijkstra算法都在SingleSourceShortestPaths类中实现,类中包括存放每个顶点到源点的最近距离D 数组和存放各个顶点的在SPT中的父节点V数组。
/** Dijkstra 算法寻找图中单源点最短路径* 输入为待寻找的图G以及源点s* @param s 起始顶点*/public void Dijkstra(int s){if(s < 0) return;int nv = G.get_nv();// 初始化for(int i = 0; i < nv; i++){D[i] = Integer.MAX_VALUE;V[i] = -2;// 0 没有添加到树中G.setMark(i, 0);}// 对起点s,父节点为-1,距离为0V[s] = -1;D[s] = 0;G.setMark(s, 1);for(Edge w = G.firstEdge(s);G.isEdge(w); w = G.nextEdge(w)){D[G.edge_v2(w)] = G.getEdgeWt(w);V[G.edge_v2(w)] = s;}/*在其余顶点中找到与当前SPT最近的顶点v,并将* 顶点的父节点和顶点v添加到SPT中。
其中图的* 权值存放在节点v中。
* 循环迭代,直至所有顶点都遍历一遍.*/while(true){/*获取与当前树距离最近的边,其终点为最近的顶点* 起点为最近顶点的父节点 */Edge E = Utilities.minNextEdge(G, V);//如果边为空,函数返回if(E == null)break;System.out.println("ad (" + E.get_v1() +", " + E.get_v2() +"),\t" + G.getEdgeWt(E));// E的终点v被访问过了int v = E.get_v2();G.setMark(v, 1);// 更新与v相连的所有边的距离(松弛过程)for(Edge w = G.firstEdge(v);G.isEdge(w); w = G.nextEdge(w)){if(D[G.edge_v2(w)] > (D[v] + G.getEdgeWt(w))){ // 更新最短距离D[G.edge_v2(w)] = D[v] + G.getEdgeWt(w);// 更新父节点V[G.edge_v2(w)] = v;System.out.println("rx (" + w.get_v1() + ", " + w.get_v2() +"),\t" + G.getEdgeWt(w));}}}// 根据V数组建立最短路径树SPTspt.addChild(s, s, new ElemItem<Double>(D[0]));spt.setRoot(s);int f = -1;// 顶点标记数组,V_idx[i] == 1表示i顶点已经在SPT中,否则不再SPT中int[] V_idx = new int[V.length];// 初始化for(int i = 0; i < V_idx.length; i++)V_idx[i] = 0;// 起始顶点s已经在SPT中V_idx[s] = 1;while(true){f = -1;for(int i = 0; i < V.length; i++){// 顶点i不在SPT中,其父顶点V[i]在SPT中,则添加到SPT中if(V_idx[i] == 0 && V[i] >= 0&& V_idx[V[i]] == 1 &&spt.addChild(V[i], i, new ElemItem<Double>(D[i]))){V_idx[i] = 1;f = 1;}}// 一次都没有添加,结束循环if(f == -1) break;}}算法中每次从SPT之外的顶点中选择一个顶点v,对应边的权值最小;然后对这条边进行松弛操作。
算法迭代直至图中所有顶点都在SPT中为止。
以图为例,求解图的最短路径树,起始顶点为顶点0。
根据算法实现过程,提取图中最短路径数的过程如图(a-c)。
算法初始化阶段每个顶点到起始顶点s的最短路径长度为∞。
首先从起始顶点0开始,寻找相邻顶点1和顶点5,并对其进行松弛操作。
此时SPT中根节点为0,两个(未确定)子节点为顶点1和顶点5。
其中顶点0着色为灰色(赋值1),只有着色为灰色的顶点确定为SPT 中顶点。
由于顶点1和顶点5对应的边可能会在以后的操作中进行松弛操作,所以SPT中这两个顶点是未确定的,顶点着色也未改变。
选择与当前SPT中顶点0最近的顶点5,首先将顶点5确定为SPT中顶点0的子节点;然后对其相邻顶点进行松弛操作。
相邻顶点为顶点1和顶点4,其中顶点4的最短距离需要更新。
选择与当前SPT中顶点0、顶点5最近的顶点4,首先将顶点4确定为SPT中顶点5的子节点;然后对其相邻顶点进行松弛操作。
相邻顶点为顶点2和顶点3,这两个顶点都需要更新最短距离。
接下来将先后选择边(5, 1)、(4, 2)和(4, 3),并进行松弛操作。
最终得到的SPT为:将图作为算法代码的测试输入,编写示例程序如下:public class DijkstraExample {public static void main(String args[]){GraphLnk GL =Utilities.BulidGraphLnkFromFile("Graph\\graph8.txt");SingleSourceShortestPaths sp =new SingleSourceShortestPaths(GL);sp.Dijkstra(0);sp.spt.ford_print_tree();}}算法跟踪顶点选择和边松弛操作的过程,每个顶点距离起始顶点的最短距离记录在数组D中,顶点的父节点保存在数组V中,最终利用前面章节中讨论的广义树存放SPT。