当前位置:首页 » 操作系统 » dijkstra最短路算法

dijkstra最短路算法

发布时间: 2024-06-13 18:17:53

❶ 绠璋堣开鍏嬫柉鐗规媺绠楁硶

涓鐩存兂瑕佸︾偣绠鍗旷殑绠楁硶锛屽彣鍙ㄤ简濂戒箙锛屽紑濮嫔惂銆愯繖绡囨枃绔犵殑鍓嶈█镞犻潪灏辨槸鎴戞兂璇寸偣搴熻瘽锛屽ぇ瀹跺彲浠ラ夋嫨镐х殑杩囨护鍝堛伞

杩𨱒版柉鐗规媺绠楁硶(Dijkstra)鏄鐢辫嵎鍏拌$畻链虹戝﹀ 镫勫厠鏂鐗规媺 浜1959 骞存彁鍑虹殑锛屽洜姝ゅ张鍙 镫勫厠鏂鐗规媺绠楁硶 銆傛槸浠庝竴涓椤剁偣鍒板叾浣椤悇椤剁偣镄 链鐭璺寰 绠楁硶锛岃В鍐崇殑鏄链夋潈锲句腑链鐭璺寰勯梾棰樸傝开𨱒版柉鐗规媺绠楁硶涓昏佺壒镣规槸浠ヨ捣濮嬬偣涓轰腑蹇冨悜澶栧眰灞傛墿灞曪纴鐩村埌镓╁𪾢鍒扮粓镣逛负姝銆

鏁查粦𨱒缥杩涘叆姝i
杩𨱒版柉鐗规媺绠楁硶鏄鐩鍓 OIER 浠链鐖辩敤镄勬渶鐭璺绠楁硶锛屼笅闱㈣蹭竴涓嬭繖涓绠楁硶镄勬濊矾銆愬浘涓戯纴璇峰ぇ瀹跺繊钥愪竴涓嬨戯细

绗涓姝ワ纴鎴戜滑鍏堟妸a锷犲叆闆嗗悎锛屾暟缁勫彉鎴愶纸s = {a}, dis[] = {0, 鈭,鈭,鈭,鈭,鈭,鈭,鈭瀩锛
绗浜屾ワ纴镓惧埌鍜宎链杩戠殑镣癸纴涓篵锛屾妸b锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勚愯佹敞镒忕澶存柟钖戝搱銆戯纴鏁扮粍鍙樻垚锛坰 = {a, b}, dis[] ={0,2,鈭,鈭,鈭,鈭,鈭,鈭瀩锛
绗涓夋ワ纴镓惧埌鍜宐链杩戠殑镣癸纴涓篸锛屾妸d锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勚愯佹敞镒忕澶存柟钖戙戯纴鏁扮粍鍙樻垚锛坰 = {a, b, d}, dis[] = {0,2,鈭,3,鈭,鈭,鈭,鈭瀩锛
绗锲涙ワ纴镓惧埌鍜宒链杩戠殑镣癸纴涓篹锛屾妸e锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勚愯佹敞镒忕澶存柟钖戙戯纴鏁扮粍鍙樻垚锛坰 = {a, b, d, e}, dis[] = {0,2,鈭,3,5,鈭,鈭,鈭瀩锛
绗浜旀ワ纴镓惧埌鍜宔链杩戠殑镣癸纴涓篺锛屾妸f锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勚愯佹敞镒忕澶存柟钖戙戯纴鏁扮粍鍙樻垚锛坰 = {a, b, d, e, f}, dis[] = {0,2,鈭,3,5,9,鈭,鈭瀩锛
绗鍏姝ワ纴镓惧埌鍜宖链杩戠殑镣癸纴涓篻锛屾妸g锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勚愯佹敞镒忕澶存柟钖戙戯纴鏁扮粍鍙樻垚锛坰 = {a, b, d, e, f, g}, dis[] = {0,2,鈭,3,5,9,12,鈭瀩锛
绗涓冩ワ纴鐩鍓嶅彧鍓╀笅c鍜宧浜嗭纴闾d箞鎴戜滑鍏堣佹垒鍒拌窛绂婚泦钖堣矾寰勬渶鐭镄刢锛屾妸c锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勶纴鏁扮粍鍙樻垚锛坰 = {a, b, c, d, e, f, g}, dis[]= {0,2,13,3,5,9,12,鈭瀩锛
绗鍏姝ワ纴链钖庝竴姝ワ纴鎴戜滑镓惧埌璺濈婚泦钖堣矾寰勬渶鐭镄删锛屾妸h锷犲叆闆嗗悎锛屽苟纭瀹氢粬镄勬渶鐭璺寰勶纴鏁扮粍鍙樻垚锛坰 = {a, b, c, d, e, f, g, h}, dis[] = {0,2,13,3,5,9,12,18}锛
寰楀槥锛岃繖涓澶ц嚧镄勬濊矾鏄杩欐牱镄勶纴杩樻湁钖庣画鍝燂纴娆茬煡钖庝簨濡备綍锛岃风湅涓嫔洖璁茶В~

❷ 直观理解:单源点最短路径——Dijkstra算法

  Dijkstra算法是由荷兰计算机科学家 Edsger Wybe Dijkstra于1959年提出的单源点最短路径算法(SSSP:Single Souce Shortest Path)。是一个解决加权图(不含负权重的边)中从一个顶点到其余各个顶点最短路径问题的算法。Dijkstra算法是一个集 贪心算法 , 广度优先搜索(BFS) 和 动态规划 于一身的最短路径算法。Dijkstra算法的主要特点是从起源点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接顶点,直到扩展到终点为止。
  Dijkstra算法通过维护两个集合: (已求出最短路径的顶点)和 (未求出最短路径的顶点),每次迭代地从 中移除路径距离最小的点到集合 中,并通过这个新移入的点来更新 中各个顶点到源点的最短路径,直到集合 为空。下面我们通过一个例子来简单描述Dijkstra算法的过程。
  假设我们有如下的图,其中顶点A未此次算法的起点:

  首先我们需要初始化两个集合 和 ,以及 中每个顶点到源点的距离,若不直接于A相邻,结果置为正无穷∞。

   Step 1: 从集合 中挑选出距离最小的点,这里会挑选出顶点F,集合 和 变更为: , ,根据最新的 ,重新计算 中顶点到源点A的最短距离。

   Step 2:: 从集合 中挑选出距离最小的点,这里会挑选出顶点E,集合 和 变更为: , ,根据最新的 ,重新计算 中顶点到源点A的最短距离。

   Step 3: 从集合 中挑选出距离最小的点,这里会挑选出顶点C,集合 和 变更为: , ,根据最新的 ,重新计算 中顶点到源点A的最短距离。

   Step 4: 从集合 中挑选出距离最小的点,这里会挑选出顶点D,集合 和 变更为: , ,根据最新的 ,重新计算 中顶点到源点A的最短距离。

   Step 5: 从集合 中挑选出距离最小的点,这里会挑选出顶点B,集合 和 变更为: , ,根据最新的 ,重新计算 中顶点到源点A的最短距离。

   Step 6: 从集合 中挑选出距离最小的点,这里会挑选出顶点G,集合 和 变更为: , ,由于集合 为空,算法停止迭代,输出结果。

  以上就是对Dijkstra算法的计算过程的简单描述。

❸ 绠杩癫ijkstra鏂规硶镄勫熀链镐濇兂

绠杩癫ijkstra鏂规硶镄勫熀链镐濇兂濡备笅锛

棣栧厛浠庤捣镣筄寮濮嬶纴缁欐疮涓鑺傜偣涓涓镙囧彿锛屽垎涓篢镙囧彿鍜孭镙囧彿涓ょ被锛孴镙囧彿鏄涓存椂镙囧彿锛岃〃绀轰粠璧风偣O鍒拌ョ偣镄勬渶鐭璺𨱒幂殑涓婇檺;P镙囧彿鏄锲哄畾镙囧彿锛岃〃绀轰粠璧风偣O鍒拌ョ偣镄勬渶鐭璺𨱒冦

镙囧彿杩囩▼涓锛孴镙囩偣涓鐩村湪鏀瑰彉锛孭镙囧彿涓嶅啀鏀瑰彉锛屽嚒鏄娌℃湁镙囦笂P镙囧彿镄勭偣锛岄兘镙囦笂T镙囧彿銆傜畻娉旷殑姣忎竴姝ユ妸镆愪竴镣圭殑T镙囧彿璇ョ栌骞翠负P镙囧彿锛岀煡阆撴墍链夌殑T镙囧彿閮借ユ敼鍙树负P镙囧彿銆傚嵆寰楀埌钻夊嬬偣O鍒板叾浠栧悇镣圭殑链鐭璺𨱒冿纴镙囧彿杩囩▼缁撴潫銆

涓銆丏ijkstra

Dijkstra鏄鍏稿瀷链鐭璺寰勭畻娉曪纴鐢ㄤ簬璁$畻涓涓鑺傜偣鍒板叾浠栬妭镣圭殑链鐭璺寰勚傝ョ畻娉曚娇鐢ㄧ殑鏄璐蹇幂瓥鐣ワ细姣忔¢兘镓惧嚭鍓╀綑椤剁偣涓涓庢簮镣硅窛绂绘渶杩戠殑涓涓椤剁偣銆傜粰瀹氢竴甯︽潈锲撅纴锲句腑姣忔浔杈圭殑𨱒冨兼槸闱炶礋镄勶纴浠h〃镌涓ら《镣逛箣闂寸殑璺濈汇傛寚瀹氩浘涓镄勪竴椤剁偣涓烘簮镣癸纴镓惧嚭婧愮偣鍒板叾瀹冮《镣圭殑链鐭璺寰勫拰鍏堕暱搴︾殑闂棰桡纴鍗虫槸鍗曟簮链鐭璺寰勯梾棰樸

浜屻丏ijkstra镄勫师鐞

鍒濆嫔寲镞讹纴S鍙钖链夋簮鑺傜偣銆备粠U涓阃夊彇涓涓璺濈籿链灏忕殑椤剁偣k锷犲叆S涓锛堣ラ夊畾镄勮窛绂诲氨鏄痸鍒発镄勬渶鐭璺寰勯暱搴︼级銆备互k涓烘柊钥冭槛镄勪腑闂寸偣锛屼慨鏀筓涓钖勯《镣圭殑璺濈伙绂鑻ヤ粠婧愯妭镣箆鍒伴《镣箄镄勮窛绂伙纸缁忚繃椤剁偣k锛夋瘆铡熸潵璺濈伙纸涓岖粡杩囬《镣䇲锛夌煭锛屽垯淇鏀归《镣箄镄勮窛绂诲硷纴淇鏀瑰悗镄勮窛绂诲兼槸椤剁偣k镄勮窛绂诲姞涓妅鍒皍镄勮窛绂汇

❹ 最短路径算法

Dijkstra算法,A*算法和D*算法

Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的 A* 算法和 D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。

大概过程:
创建两个表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
1. 访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。
4. 重复2,3,步。直到OPEN表为空,或找到目标点。

提高Dijkstra搜索速度的方法很多,常用的有数据结构采用Binary heap的方法,和用Dijkstra从起始点和终点同时搜索的方法。

A*(A-Star)算法是一种启发式算法,是静态路网中求解最短路最有效的方法。

公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。

保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索过程:
创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->
While(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点) break;
else
{
if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于OPEN表的估价值 )
更新OPEN表中的估价值; //取最小路径的估价值
if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于CLOSE表的估价值 )
更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
if(X not in both)
求X的估价值;
并将X插入OPEN表中; //还没有排序
}
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}

A*算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A*算法中估价值为0的情况。

动态路网,最短路算法 D*A* 在静态路网中非常有效(very efficient for static worlds),但不适于在动态路网,环境如权重等不断变化的动态环境下。

D*是动态A*(D-Star,Dynamic A*) 卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。是火星探测器采用的寻路算法。

主要方法:
1.先用Dijstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h。每个节点包含上一节点到目标点的最短路信息1(2),2(5),5(4),4(7)。则1到4的最短路为1-2-5-4。
原OPEN和CLOSE中节点信息保存。
2.机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值c(X,Y)+X的原实际值h(X).X为下一节点(到目标点方向Y->X->G),Y是当前点。k值取h值变化前后的最小。
3.用A*或其它算法计算,这里假设用A*算法,遍历Y的子节点,点放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:
while()
{
从OPEN表中取k值最小的节点Y;
遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a)
{
if(a in OPEN) 比较两个a的h值
if( a的h值小于OPEN表a的h值 )
{ 更新OPEN表中a的h值;k值取最小的h值
有未受影响的最短路经存在
break;
}
if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值
if( a的h值小于CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表
有未受影响的最短路经存在
break;
}
if(a not in both)
将a插入OPEN表中; //还没有排序
}
放Y到CLOSE表;
OPEN表比较k值大小进行排序;
}
机器人利用第一步Dijstra计算出的最短路信息从a点到目标点的最短路经进行。

D*算法在动态环境中寻路非常有效,向目标点移动中,只检查最短路径上下一节点或临近节点的变化情况,如机器人寻路等情况。对于距离远的最短路径上发生的变化,则感觉不太适用。

❺ 已知带权有向图如图7-29所示,请利用Dijkstra算法从顶点V4出发到其余顶点的最短路

初始化d[i]为无穷大,由于从v4开始,所以将d4=0,标记v4已选择。
下面开始Dijkstra算法:
和v4相连的且未标记的点有v2和v6,这样更新d2=20,d6=15,选择未标记所有点中最小的d6=15,标记v6已选择,这样我们算出了v4->v6最短距离d6=15;
从v6开始,和v6相连的且未标记的是v2,此时算d6+6=21>20,所以不更新d2,选择未标记所有点中最小的d2=20,标记v2已选择,这样算出了v4->v2最短距离d2=20;
从v2开始,和v2相连的且未标记的有v1和v5,d1=d2+10=30,d5=d2+30=50,选择未标记所有点中最小的d1=30,标记v1已选择,这样我们算出了v4->v1最短距离d1=30;
从v1开始,和v1相连的且未标记的有v3,d3=d1+15=45,选择剩下没被选的所有点的最小的d3=45(d5=50),标记v3已选择,这样我们算出了v4->v3最短距离d3=45
从v3开始,没有出去的路径,不更新距离,选择剩下没被选的所有点的最小的d5=50,标记v5已选择,这样我们算出了v4->v5最短距离d5=50.
此时所有的点都被访问,结束。
注:上面的标记点已选择注意下,在算法的实现中用的是将所有的点放入队列中,一旦一个点被选择就是说求出了最短距离,就从此队列删除该点,一直到此队列为空,结束算法,我写标记只是为了方便理解。
希望能帮你清晰了解Dijkstra算法,图论中很重要的算法之一。

❻ dijkstra算法是什么

Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。

其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。

不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。

举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离。Dijkstra算法可以用来找到两个城市之间的最短路径。

Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。我们以V表示G中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。我们以E所有边的集合,而边的权重则由权重函数w: E→[0,∞]定义。

因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。边的花费可以想象成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。

已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e.最短路径)。这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。

热点内容
如何设置优酷缓存 发布:2024-10-24 04:16:44 浏览:174
服务器日记如何保留6个月 发布:2024-10-24 04:11:42 浏览:239
linux建新用户 发布:2024-10-24 04:03:06 浏览:936
java67 发布:2024-10-24 04:02:56 浏览:406
编程设计图 发布:2024-10-24 03:51:45 浏览:190
lsb算法嵌入 发布:2024-10-24 03:48:31 浏览:402
三维软件需要哪些配置 发布:2024-10-24 03:41:19 浏览:741
javascript与python 发布:2024-10-24 03:40:01 浏览:339
全部浏览器下载管理员密码多少 发布:2024-10-24 03:33:00 浏览:806
常用的图像算法 发布:2024-10-24 03:25:07 浏览:984