网络原理实验报告(DIJKSTRA)
dijkdtra最短路径算法

题目:探究Dijkstra最短路径算法的原理与应用1. 引言在计算机科学中,图论是一个重要的领域,涉及到了各种数据结构和算法。
其中,路径规划算法在实际应用中具有广泛的意义,而Dijkstra最短路径算法便是其中一种经典算法。
本文将对Dijkstra算法的原理和应用进行深入探讨,帮助读者更好地理解该算法的实际作用。
2. Dijkstra最短路径算法概述Dijkstra算法是一种用于解决带权重图中单源最短路径问题的算法。
该算法能够找出从起始顶点到其他所有顶点的最短路径。
其核心思想是通过逐步扩展已经找到的最短路径来寻找更短的路径。
3. Dijkstra算法原理(1)初始化:将起始顶点到自身的距离设为0,其他顶点到起始顶点的距离设为无穷大。
(2)确定最短路径:从起始顶点开始,依次遍历所有顶点,并更新与起始顶点相邻的顶点的最短距离,直到所有顶点均被遍历。
(3)更新距离:对于每个顶点,通过比较当前路径和已知最短路径的距离来更新最短路径。
(4)重复步骤2和步骤3,直到所有顶点的最短路径都被确定。
(5)得出最短路径:根据已经确定的最短路径和距离,得出从起始顶点到其他所有顶点的最短路径和距离。
4. Dijkstra算法实际应用Dijkstra算法在实际应用中发挥着重要作用,例如在网络路由中常用于寻找最短路径、交通规划中用于确定最佳路径等。
其高效的时间复杂度和准确的结果使得该算法被广泛应用于各种领域。
5. 个人观点与总结个人观点上来说,Dijkstra最短路径算法是一种非常有效的路径规划算法,可以在实际应用中发挥巨大作用。
其原理清晰,实现相对简单,是一种理想的解决最短路径问题的算法。
在总结上,Dijkstra算法的实际应用不仅仅局限于计算机领域,其在现实生活中的广泛应用也使得了解该算法成为有益的知识。
通过深入理解和掌握Dijkstra算法,我们能够更加灵活地应用这一算法,解决各种路径规划问题。
在这篇文章中,我们对Dijkstra最短路径算法进行了深入探讨,从原理到应用,从个人观点到总结,希望读者能够对该算法有更深入的理解,并能够在实际问题中灵活运用。
网络原理实验报告

网络原理实验报告网络原理实验报告一、引言网络原理是计算机科学中的重要基础知识,通过实验可以更好地理解和掌握网络的工作原理。
本实验报告旨在总结和分析我们在网络原理实验中所做的实验内容和实验结果。
二、实验目的本次实验的主要目的是通过搭建一个简单的局域网,了解和掌握网络的基本概念和工作原理。
具体实验内容包括网络拓扑结构的搭建、IP地址的配置、网络通信的测试等。
三、实验过程1. 网络拓扑结构的搭建我们使用了三台计算机和一个交换机来搭建一个简单的局域网。
首先,我们将三台计算机连接到交换机上,确保每台计算机都能够正常连接到交换机。
然后,我们通过配置交换机的端口,将这三台计算机连接在同一个局域网中。
2. IP地址的配置在搭建好网络拓扑结构后,我们需要为每台计算机配置IP地址,以便它们能够相互通信。
我们使用了静态IP地址的方式进行配置,为每台计算机分配了一个唯一的IP地址。
通过配置IP地址,我们可以实现计算机之间的互联和数据传输。
3. 网络通信的测试在完成网络拓扑结构的搭建和IP地址的配置后,我们进行了网络通信的测试。
我们通过在不同计算机上运行ping命令,测试计算机之间的连通性。
通过ping命令,我们可以发送一个网络数据包到目标计算机,并接收到该计算机的响应。
通过测试,我们可以判断网络是否正常工作。
四、实验结果与分析通过实验,我们成功搭建了一个简单的局域网,并配置了IP地址。
在进行网络通信测试时,我们发现所有计算机之间都能够正常通信,ping命令的结果都为成功。
这表明我们的网络拓扑结构和IP地址配置是正确的。
在实验过程中,我们还发现了一些问题。
首先,网络拓扑结构的搭建需要注意连接线的正确插入。
如果连接线插入不正确,计算机之间可能无法正常通信。
其次,IP地址的配置要确保每台计算机的IP地址不重复,并且属于同一个网段。
如果IP地址配置错误,计算机之间也无法正常通信。
通过本次实验,我们深入理解了网络的工作原理。
网络是由多台计算机通过网络设备连接在一起,通过IP地址进行通信的。
最短路径的实验报告

最短路径的实验报告最短路径的实验报告引言:最短路径问题是图论中一个经典的问题,涉及到在一个带有权重的图中找到两个顶点之间的最短路径。
本实验旨在通过实际操作和算法分析,深入探讨最短路径算法的性能和应用。
实验设计:本次实验使用了Dijkstra算法和Floyd-Warshall算法来解决最短路径问题。
首先,我们使用Python编程语言实现了这两个算法,并对它们进行了性能测试。
然后,我们选择了几个不同规模的图进行实验,以比较这两种算法的时间复杂度和空间复杂度。
最后,我们还在实际应用中使用了最短路径算法,以验证其实用性。
实验过程:1. 实现Dijkstra算法Dijkstra算法是一种贪心算法,用于求解单源最短路径问题。
我们首先实现了该算法,并对其进行了性能测试。
在测试中,我们使用了一个包含1000个顶点和5000条边的图,记录了算法的运行时间。
结果显示,Dijkstra算法的时间复杂度为O(V^2),其中V表示图中的顶点数。
2. 实现Floyd-Warshall算法Floyd-Warshall算法是一种动态规划算法,用于求解所有顶点对之间的最短路径。
我们在Python中实现了该算法,并对其进行了性能测试。
在测试中,我们使用了一个包含100个顶点和5000条边的图,记录了算法的运行时间。
结果显示,Floyd-Warshall算法的时间复杂度为O(V^3),其中V表示图中的顶点数。
3. 比较两种算法通过对Dijkstra算法和Floyd-Warshall算法的性能测试,我们可以看到,Dijkstra算法在处理较大规模的图时性能更好,而Floyd-Warshall算法在处理较小规模的图时性能更好。
因此,在实际应用中,我们可以根据图的规模选择合适的算法。
4. 应用实例为了验证最短路径算法的实际应用性,我们选择了一个城市交通网络图进行实验。
我们使用了Dijkstra算法来计算两个城市之间的最短路径,并将结果与实际的驾车时间进行比较。
简述dijkstra算法原理

简述dijkstra算法原理Dijkstra算法是一种用于寻找最短路径的算法,通常用于网络规划和搜索引擎等领域。
该算法的基本思想是将节点的度数图转换为度数图的优化,以最小化图中所有节点之间的最短距离。
Dijkstra算法的基本流程如下:1. 初始化:将起点到起点的最短距离设置为0,其他节点的度数设置为0。
2. 遍历:从起点开始,依次将相邻的未服务的节点加入集合中。
每个节点都将其度数加1,并将其连接到已服务集合中最小的节点。
3. 计算:计算每个节点到所有其他节点的最短距离。
4. 更新:更新集合中所有节点的度数和连接它们的最短距离。
5. 重复步骤2到步骤4,直到集合为空。
Dijkstra算法的时间复杂度为O(ElogE),其中E是节点数。
该算法的优点是简单易懂,并且可以处理大规模数据集。
除了基本的Dijkstra算法外,还有许多变种,如Dijkstra算法的优化版本,用于处理有向图中的最短路径,以及基于贪心算法的优化版本。
这些变种可以用于不同的应用场景,并提供更高的效率和更好的性能。
拓展:Dijkstra算法的应用非常广泛,包括搜索引擎、路由协议、网络规划、路径查找和图论等领域。
例如,在搜索引擎中,Dijkstra算法可以用于查找最短路径,以确定搜索查询的正确路径。
在路由协议中,Dijkstra算法可以用于确定到达目的地的最佳路径。
在网络规划中,Dijkstra算法可以用于建立网络拓扑结构,以最小化图中所有节点之间的通信距离。
除了计算最短路径外,Dijkstra算法还可以用于其他任务,如找到最短路径中的最大公约数、最小生成树等。
Dijkstra算法的优化版本可以用于处理有向图中的最短路径,并提供更高的效率和更好的性能。
此外,Dijkstra算法的变种可以用于不同的应用场景,以满足不同的需求。
dijkstra算法 原理

dijkstra算法原理Dijkstra算法原理Dijkstra算法是一种用于解决最短路径问题的经典算法。
它的原理是通过不断地选择当前最短路径的顶点来逐步扩展最短路径集合,直到找到源点到所有其他顶点的最短路径。
在介绍Dijkstra算法的原理之前,先来了解一下最短路径问题。
最短路径问题是指在一个加权有向图中,找到一个顶点到其他顶点的最短路径。
其中,加权有向图由一组顶点和有向边组成,每条边上都有一个权重表示从一个顶点到另一个顶点的距离或代价。
Dijkstra算法的核心思想是使用贪心策略,通过逐步扩展当前最短路径集合来找到源点到其他顶点的最短路径。
算法的具体步骤如下:1. 创建两个集合:一个是已确定最短路径的顶点集合S,一个是未确定最短路径的顶点集合V-S。
2. 初始化源点到自身的最短路径为0,其他顶点的最短路径为无穷大。
3. 从V-S中选择一个顶点u,使得源点到u的最短路径值为当前最小值。
将u加入S集合。
4. 更新源点到V-S中所有顶点v的最短路径值。
如果通过u到v的路径比当前最短路径更短,则更新最短路径值。
5. 重复步骤3和4,直到所有顶点都被加入S集合。
6. 最终得到源点到所有其他顶点的最短路径。
Dijkstra算法的关键在于如何选择当前最短路径的顶点。
为了实现这一点,可以使用最小堆等数据结构来高效地选择最小路径值的顶点。
Dijkstra算法的时间复杂度为O(V^2),其中V是顶点的数目。
这是因为在每一次迭代中,都需要遍历V个顶点来找到当前最小路径值的顶点。
Dijkstra算法的应用非常广泛,特别是在网络路由算法中。
通过使用Dijkstra算法,网络中的路由器可以快速找到到达目标节点的最短路径,从而实现高效的数据传输。
总结一下,Dijkstra算法是一种解决最短路径问题的经典算法。
它通过不断地选择当前最短路径的顶点来逐步扩展最短路径集合,从而找到源点到其他顶点的最短路径。
在实际应用中,Dijkstra算法被广泛应用于网络路由算法等领域。
dijkstra算法定义

Dijkstra算法1. 引言Dijkstra算法是一种用于解决图中单源最短路径问题的经典算法。
由荷兰计算机科学家Edsger W. Dijkstra于1956年提出,被广泛应用于路由选择、网络优化等领域。
本文将介绍Dijkstra算法的基本原理、实现步骤以及应用场景。
2. 基本原理Dijkstra算法通过构建一个有向加权图来描述问题,其中每个节点表示一个地点,边表示两个地点之间的路径,边上的权重表示路径的长度或代价。
该算法通过不断更新起始节点到其他节点的最短路径长度和路径信息,逐步扩展搜索范围,直到找到起始节点到目标节点的最短路径。
3. 实现步骤Dijkstra算法的实现主要包括以下几个步骤:步骤1:初始化•创建一个集合S来存放已经找到最短路径的节点。
•创建一个数组dist[]来存放起始节点到其他节点的当前最短距离估计值。
•创建一个数组prev[]来存放起始节点到其他节点的当前最短路径上该节点的前驱节点。
•将起始节点加入集合S,并将dist[]数组初始化为正无穷大(除了起始节点的距离设为0)。
步骤2:更新最短路径信息•从集合S中选择一个距离起始节点最近的节点u。
•对于u的每个邻接节点v,如果通过u能够获得更短的路径长度,则更新dist[v]和prev[v]的值。
•将节点u从集合S中移除。
步骤3:重复步骤2直到找到目标节点或集合S为空•重复步骤2,直到目标节点被加入集合S或者集合S为空。
步骤4:构建最短路径•根据prev[]数组构建起始节点到目标节点的最短路径。
4. 应用场景Dijkstra算法在许多领域都有广泛应用,下面列举几个常见的应用场景:4.1 路由选择在计算机网络中,路由器需要根据网络拓扑和链路状态来选择最优路径进行数据包转发。
Dijkstra算法可以用于计算每个路由器到其他路由器之间的最短路径,以便做出最优路由选择。
4.2 网络优化在通信网络中,带宽限制、传输延迟等因素会影响网络性能。
最短路径算法dijkstra算法python
最短路径算法dijkstra算法python Dijkstra算法是一种用于求解图中两点之间最短路径的经典算法。
该算法由荷兰计算机科学家Edsger Dijkstra于1956年提出,至今仍然被广泛运用于各个领域,例如路由算法、网络优化、地图导航等。
本文将以Python 语言为基础,详细介绍Dijkstra算法的原理和实现过程。
一、Dijkstra算法的原理Dijkstra算法的核心思想是利用贪心策略逐步构建最短路径树。
该算法首先将起始节点的距离设置为0,将其他节点的距离设置为无穷大。
然后在每一轮选择距离起始节点最近的节点,并更新其周围节点的距离。
通过不断选择距离最近的节点,并更新距离,直到找到终点节点或所有节点都被访问完毕,即可得到起始节点到终点节点的最短路径。
二、算法的实现步骤下面将详细介绍Dijkstra算法的实现步骤。
1. 创建一个空的顶点集合visited和距离集合distance,并初始化起始节点的距离为0,其他节点的距离为无穷大。
2. 选择起始节点,并将其加入visited集合。
3. 遍历起始节点的邻居节点,计算起始节点到每个邻居节点的距离,并更新distance集合。
4. 在distance集合中选择距离起始节点最短的节点,将其加入visited 集合。
5. 重复步骤3和步骤4,直到终点节点被加入visited集合或所有节点都被访问完毕。
6. 根据visited集合和distance集合,可以得到起始节点到终点节点的最短路径。
三、Dijkstra算法的Python实现下面将使用Python语言实现Dijkstra算法,并解决一个具体的例子。
首先,创建一个图的类,包含节点和边的信息,并定义一些基本的方法。
其中,节点信息包括标识符、邻居节点和距离,边的信息包括起始节点、终点节点和权重。
pythonclass Graph:def __init__(self):self.nodes = []self.edges = []def add_node(self, node):self.nodes.append(node)def add_edge(self, start, end, weight):edge = (start, end, weight)self.edges.append(edge)接下来,实现Dijkstra算法的主要函数,用于求解最短路径。
路由算法中的Dijkstra算法实现原理
路由算法中的Dijkstra算法实现原理路由算法是计算机网络中的一项重要技术,它指导着数据在网络中的传输过程。
路由算法中的Dijkstra算法是其中一种比较常用的算法,它通过计算最短路径来选择数据传输方案,进而实现高效稳定的数据传输。
本文将详细介绍Dijkstra算法的实现原理。
一、Dijkstra算法的概述Dijkstra算法是一种用于计算带权图最短路径的算法。
它的基本思想是:维护一个当前已知的最短路径集合S和距离源点最短的节点v,然后以v为基础扩展出一些新的节点,并计算这些节点到源点的距离并更新路径集合S。
重复这一过程,一直到源点到所有节点的最短路径集合已经确定为止。
该算法求解的是一个有向带权图中一个节点到其他所有节点的最短路径问题,其中「带权」表示图的边权值是一个非负实数。
二、Dijkstra算法的实现Dijkstra算法可以使用多种数据结构的实现,常见的有数组、链表、堆等。
这里我们以使用优先队列为例进行实现。
首先,定义一个数组distance用于存储源点至所有节点的最短距离。
初始状态下,将源点与其它节点的距离初始化为正无穷大。
同时,构建一个优先队列,用于维护已经遍历过的节点。
具体实现过程如下:1. 初始化distance数组和优先队列。
将源点源加入优先队列中,与源点相邻的节点按照距离增序加入队列中。
2. 从队列中取出距离源点最短的节点u,然后遍历所有与节点u相邻的节点v。
通过计算distance[u] + w(u,v)可得到源点到节点v的距离。
如果这个距离比已经存储在distance[v]中的距离更短,则更新distance[v]的值,同时将节点v加入到优先队列中。
3. 重复步骤2,直到所有节点都已经加入到队列中,并且所有节点的最短路径都已经被确定。
三、Dijkstra算法的时间复杂度分析Dijkstra算法的时间复杂度主要取决于寻找当前距离源点最短的节点的过程。
如果使用数组实现,该过程的时间复杂度为O(n^2),n为节点数量。
最短路径算法的原理和方法
最短路径算法的原理和方法最短路径算法是一类解决图中节点最短路径问题的算法,例如在网络中找到从一个节点到另一个节点的最短路径,或者在地图中找到从一个地点到另一个地点的最短路线。
最短路径问题可以用图论来描述,即在有向或无向的图中,根据边的权重找到连接两个顶点的最短路径。
最短路径算法可以分为以下几种:1. Dijkstra 算法Dijkstra 算法是最常用的找到单源最短路径的算法,它适用于没有负权边的有向无环图或仅含正权边的图。
算法步骤:(1)初始化,将起点到所有其他顶点的距离初始化为正无穷,将起点到自己的距离初始化为0。
(2)选择一个起点,将其距离设为0。
(3)将起点加入已知最短路径集合。
(4)遍历与起点相邻的所有顶点,将它们到起点的距离更新为起点到它们的距离。
(5)从未加入已知最短路径集合中的顶点中选择最小距离的顶点,将它加入已知最短路径集合中。
(6)重复步骤4和步骤5直到所有顶点都被加入已知最短路径集合中。
2. Bellman-Ford 算法Bellman-Ford 算法是一种解决有负权边的单源最短路径问题的算法。
算法步骤:(1)初始化,将起点到所有其他顶点的距离初始化为正无穷,将起点到自己的距离初始化为0。
(2)遍历每条边,将该边起点的距离加上该边的权重,如果得到的距离比该边终点的距离小,则更新该终点的距离为该距离。
(3)重复步骤2 V-1 次,其中V 是图中的顶点数。
(4)检查是否存在负环,即在V-1 次迭代后,仍然可以更新顶点的距离。
如果存在负环,算法无法执行。
3. Floyd-Warshall 算法Floyd-Warshall 算法是一种解决所有顶点对之间的最短路径问题的算法。
算法步骤:(1)初始化,将每个顶点到其他顶点的距离初始化为边权,如果两个顶点之间没有边相连,则初始化为正无穷。
(2)依次加入每个顶点,如果通过加入该顶点可以得到更短的路径,则更新路径。
(3)输出结果,即每个顶点对之间的最短路径。
离散数学 最短路径dijkstra算法
离散数学是数学的一个分支,研究离散对象和不连续对象的数量关系及其结构的数学学科。
离散数学对于计算机科学和信息技术领域有着重要的应用,其中最短路径dijkstra算法是离散数学中的一个重要算法,它被广泛应用于计算机网络、交通规划、电路设计等领域,在实际应用中发挥着重要的作用。
一、最短路径dijkstra算法的基本原理最短路径dijkstra算法是由荷兰计算机科学家艾兹赫尔·达斯提出的,用于解决带权图中的单源最短路径问题。
该算法的基本原理是:从一个源点出发,按照权值递增的顺序依次求出到达其它各个顶点的最短路径。
具体来说,最短路径dijkstra算法的实现步骤如下:1. 初始化:将源点到图中各个顶点的最短路径估计值初始化为无穷大,将源点到自身的最短路径估计值初始化为0;2. 确定最短路径:从源点开始,选择一个离源点距离最近的未加入集合S中的顶点,并确定从源点到该顶点的最短路径;3. 更新距离:对于未加入集合S中的顶点,根据新加入集合S中的顶点对其进行松弛操作,更新源点到其它顶点的最短路径的估计值;4. 重复操作:重复步骤2和步骤3,直到集合S中包含了图中的所有顶点为止。
二、最短路径dijkstra算法的实现最短路径dijkstra算法的实现可以采用多种数据结构和算法,比较常见的包括邻接矩阵和邻接表两种表示方法。
在使用邻接矩阵表示图的情况下,最短路径dijkstra算法的时间复杂度为O(n^2),其中n表示图中顶点的个数;而在使用邻接表表示图的情况下,最短路径dijkstra 算法的时间复杂度为O(nlogn)。
三、最短路径dijkstra算法的应用最短路径dijkstra算法可以应用于计算机网络中路由选择的最短路径计算、交通规划中的最短路径选择、电路设计中的信号传输最短路径计算等领域。
在实际应用中,最短路径dijkstra算法通过寻找起始点到各个顶点的最短路径,为网络通信、交通规划、电路设计等问题提供有效的解决方案。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public static String[] closestpath(String[] route,String[] p,int star){ //计算各条最短路径并且保存于字符串数组中 int num=route.length; int sorce=star; String[] vname=route; String[] path=new String[num]; for(int i=0;i<num;i++) path[i]=vname[i]+" "; String p1="AB"; for(int i=0;i<num;i++){ if(i!=sorce){ p1=p[i]; path[i]+=p1+" "; while( p1!=null&&(!p1.equals(vname[sorce])) ){ //采用逆推思维,从后向前依次表示 //获取节点数 //获取源节点 //获取顶点集 //路径
10 update D(v) for all v adjacent to w and not in N: 11 D(v) = min( D(v), D(w) + c(w,v) ) 12 /* new cost to v is either old cost to v or known 13 shortest path cost to w plus cost from w to v */ 14 until all nodes in N
//设置自己到自己的距离为0 for(int i=0;i<route.length-1;i++){ System.out.print("【随机】路由"+route[i]+"到其他路由的距离 依次为: "); for(int j=i+1;j<route.length;j++){ int ran=new Random().nextInt(150); if(ran>100){ //设定随机值
7. 类概览与描述
(1) Grap 类: 自定义的 “图” 类, 用于模拟各个路由器 (节 点)和各条链路(边) ,主要功能函数如下:
Public
Grap(String[]v)——自定义的构造函数,主要
功能有: A. 接收随机定义好的(名字和数量都是由系统随 机指定的)顶点集 B. 对顶点集经行初始化并且初始化任意两个定点 间的距离值(如果不可直达则为无穷大) ,这里 的距离值(即权值)是由系统随机数指定的 C. 依次显示路由器数量、名称、各路由器到其他 路由器的距离值 D. 统计非无穷大边(有限权值边)的数量并显示 (2) Dijkstra 类:主函数类,实现核心功能,主要功能函 数有: A. Public static int min(int[] a)——最小值函数, 获取 一个指定的整型数组中最小值对应的数组下标 B. Public static String[] closestpath(String[] route,String[] p,int star)——路径计算函数,该函 数是建立在已经计算得到最小距离之上的,用 字符串数组依次保存源节点到各目标节点的最 短路径上的路由器名称 C. Public static void dijkstra(Grap g,String star)—— Dijkstra 算法中求找最小距离的功能函数,运行 结果依次显示源节点到各目标节点的最小距离
//逆推至源节点表示最短路径完全确定了 for(int t=0;t<num;t++){ if(vname[t].equals(p1)) p1=p[t]; } path[i]+=p1+" "; } }
} String[][] path01=new String[num][]; //以下部分均是路径显示格式的调整与转换 String[] truepath=new String[num]; for(int i=0;i<num;i++) truepath[i]=""; for(int i=0;i<num;i++) path01[i]=path[i].split(" "); for(int i=0;i<num;i++) path01[i][path01[i].length-1]=route[sorce]; for(int i=0;i<num;i++){ for(int j=path01[i].length-1;j>=0;j--){ if(path01[i][j]!=null) truepath[i]+=path01[i][j]+" "; } } for(int i=0;i<num;i++){ truepath[i]=truepath[i].replaceAll(" ", "→"); truepath[i]=truepath[i].substring(0,truepath[i].length()-1); } return truepath; } public static void dijkstra(Grap g,String star){
distance=new int[route.length][route.length]; //用二维数组保存任意两条边的距离 System.out.print("【随机】设置了"+v.length+"个路由器 "); //统计路由器总数 System.out.print("路由名分别为: "); for(int i=0;i<v.length;i++) {System.out.print(v[i]);System.out.print(" ");//依次显示路径名称 System.out.println(); for(int i=0;i<route.length;i++) distance[i][i]=0;
4. 实验步骤
(1) 选择合适的编程语言编程实现基于 Dijkstra 算法的路 由软件。 (2) 输入不同的网络拓扑和链路代价测试和验证自己的 路由件。
5. 实验环境
(1) (2) (3) 实验语言:JAVA 实验平台:Eclipse 引用库函数:随机(Random)库
6. 算法思想理解与描述
在编写代码时, 我曾遇到过两个问题也是最容易碰到的难题, 这里我介绍一下自己的解决方法:
和对应的最短路径 D. Public static void main(String[] args)——主函数, 用于程序的初始化(比如随机顶点集的初始化) 和程序算法的执行(调用各功能函数)
8. 代码展示与描述
(一) Grap 类
import java.util.Random; public class Grap { String[] route; int[][] distance; int count=0; public Grap(String[]v){ route=v; //获取顶点集
我选择使用 JAVA 里的随机类 Random,一方面是方便省 心省力另一方面“All Random”(全随机)更能帮你检查 算法正确性以及更加符合实际 2. 选 D()最小值: 自己写一个求数组最小值的 min()函数 就可以了, 每次求 D()最小值是要排除已经选过的节点的, 怎么实现呢?——可以把选过的节点的 D()值用另一个数 组的元素暂存起来,然后自己被赋成∞,这样 min{D(Vi)} 就不会出现重复了 3. D()值更新——其实也就是算法最精华的部分, 采用 判断语句就可以了: 数学表达:D(B) = min{ D(B), distance(C,B)+D(C) } 代码表达:D[i]=D[i]<dis[k][i]+D[k]?D[i]:dis[k][i]+D[k] 或者 if+else 语句也行 4. 最佳路径的查找——也就是迭代 我们可以使用 while 语句进行, 终止条件就是迭代得 到的节点是源节点就可以了,例如目标节点是 D,源节点 是 A 那么由 p(D)得到了 C,再由 p(C)得到 B,再有 p(B)得 到 A,迭代终止——我们可以以此得到 DCBA,颠倒顺序 就可以得到最短路径 ABCD 了!
我们编程最容易遇到的问题莫过于此: 一个算法用数学语言 或者人类自然语言比较容易描述和理解,但是代码(机器语言) 却很难把简单的一段话实现, 但是如果按照前面讲过的几个要点 依次来编写就是很容易的,这里就谈谈关键的几个步骤吧: 1. “图”的绘制——想必大家都是手工输入节点和任意 两条边间的距离吧?不说太夸张的, 如果我有 15 个节点, 有 50 条边,估计手指按键盘都得按疼(100 个节点,300 条边更不说了) 这里,我听取了学长的建议,无论是节点的名称、 节点的个数、源节点的选取还是边的权值都用系统随机 数设置(这里比如还可以设随到-1 的话表示无穷大)— —这就是全自动化的好处,再也不用担心手疼了!因此,
//设置一定的概率出现“无穷大”
distance[i][j]=10000; System.out.print(" ∞");
distance[j][i]=distance[i][j]; } else{ distance[i][j]=ran; System.out.print(" ");
System.out.print(ran); //依次显示每个顶点到其他顶点的距离 distance[j][i]=ran; count++; } } System.out.println(); }