* * * * * * * * * * * * 北京林业大学信息学院 D*算法典型应用—火星探测器 * 北京林业大学信息学院 0 1 2 3 4 5 5 5 4 0 3 1 2 100 60 30 10 10 20 50 从v0到其余各点的最短路径--按路径长度递增次序求解 源 点 终 点 最 短 路 径 路 径 长 度 v0 v2 (v0, v2) 10 v4 (v0, v4) 30 v3 (v0, v4, v3) 50 v5 (v0, v4, v3, v5) 60 v1 无 ∞ * 北京林业大学信息学院 1.初始化:先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径。 2.选择:从这些路径中找出一条长度最短的路径(v0,u)。 3.更新:然后对其余各条路径进行适当调整: 若在图中存在弧(u,vk),且(v0,u)+(u,vk)(v0,vk), 则以路径(v0,u,vk)代替(v0,vk)。 在调整后的各条路径中,再找长度最短的路径,依此类推。 Dijkstra算法的思想 5 5 4 0 3 1 2 100 60 30 10 10 20 50 * 北京林业大学信息学院 主:邻接矩阵G[n][n] (或者邻接表) 辅: 数组S[n]:记录相应顶点是否已被确定最短距离 数组D[n]:记录源点到相应顶点路径长度 数组Path[n]:记录相应顶点的前驱顶点 存储结构(顶点个数为n) 5 5 4 0 3 1 2 100 60 30 10 10 20 50 v?=?0 v?=?1 v?=?2 v?=?3 v?=?4 v?=?5 S true false false false false false D 0 ∞ 10 ∞ 30 100 Path ??1 ?1 0 ??1 0 0 算法初始化结果 * 北京林业大学信息学院 ① 初始化: ● 将源点v0加到S中,即S[v0]?=?true; ● 将v0到各个终点的最短路径长度初始化为权值,即D[i]?=?G.arcs[v0][vi],(vi∈V???S); ● 如果v0和顶点vi之间有弧,则将vi的前驱置为v0,即Path[i]?=?v0,否则Path[i]?=??1。 ② 选择下一条最短路径的终点vk,使得: D[k]?=?Min{D[i]|vi∈V???S} 【算法思想】 * 北京林业大学信息学院 ③ 将vk加到S中,即S[vk]?=?true。 ④ 更新从v0出发到集合V???S上任一顶点的最短路径的长度,同时更改vi的前驱为vk。 若S[i]=false 且 D[k]+G.arcs[k][i]D[i],则D[i]=D[k]+ G.arcs[k][i]; Path [i]=k;。 ⑤ 重复②~④?n???1次,即可按照路径长度的递增顺序,逐个求得从v0到图上其余各顶点的最短路径。 【算法思想】 s i k D[i] D[k] * 北京林业大学信息学院 * 北京林业大学信息学院 (v0,v2)+ (v2,v3)(v0,v3) 终点 从v0到各终点的长度和最短路径 v1 v2 v3 v4 v5 vj S之外的当前最短路径之顶点 60 {v0,v2,v3} 50 {v0,v4,v3} 30 {v0,v4} 90 {v0,v4, v5} 60 {v0,v4,v3,v5} 5 5 4 0 3 1 2 100 60 30 10 10 20 50 s {v0,v2} {v0 ,v2 ,v4} {v0 ,v2 ,v4 ,v3} {v0 ,v2 ,v4 ,v3 ,v5} 10 {v0,v2} ∞ 30 {v0,v4} 100 {v0, v5} ∞ ∞ ∞ ∞ 例 v2 v4 v3 v5 100 {v0, v5} 0 1 2 3 4 5 D[w] 0 1 2 3 4 5 10 {v0,v2} 50 {v0,v4,v3} 30 {v0,v4} * 北京林业大学信息学院 iG.vexnum 初始化过程; (i=1;) End N Y w G.vexnum min = INFINTY;

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档