一. DJKSTRA算法概述

我们可以将地图抽象为Graph的数据结构,然后利用Graph的广度优先遍历算法(Breadth-First Search, BFS)解决无权重的High-Level的地图级别的规划。但是实际应用场景中,地图中各个路径所代表的Graph的边的权重都是不同的,比如距离长的Edge权重就应该比较低;交通拥堵的Edge权重就应该低等等。对于有权重的Graph如何进行最短路径规划呢,Dijkstra算法可以解决这个问题。

Dijkstra算法是一种有权图(Graph)的单源最短路径求解算法,给定一个起点,使用Dijkstra算法可以得到起点到其它所有节点的最短路径。Dijkstra算法要求图(Graph)中所有边的权重都为非负值,只有保证了这个条件才能该算法的适用性和正确性。

算法思想:偷个懒,摘自百度百科

按路径长度递增次序产生算法:

把顶点集合V分成两组:[3]

(1)S:已求出的顶点的集合(初始时只含有源点V0)[1]

(2)V-S=T:尚未确定的顶点集合[1]

将T中顶点按递增的次序加入到S中,保证:[1]

(1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度[1]

(2)每个顶点对应一个距离值[2]

S中顶点:从V0到此顶点的长度[1]

T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度[1]

依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和[1]  。

(反证法可证)

求最短路径步骤[1]

算法步骤如下:[1]

G={V,E}

1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值[1]

若存在,d(V0,Vi)为弧上的权值[1]

若不存在,d(V0,Vi)为∞[2]

2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中[1]

3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值[1]

重复上述步骤2、3,直到S[1]  中包含所有顶点,即W=Vi为止[1]

二. 示例问题

给出如下带权重的图,求从A到G的最短路径

第一步:

构建一个记录最短路径和距离并用来计算权重的表格。初始化这个表格,除了起点A,已知距离为0,其它距离初始化为无穷大。

A

B

C

D

E

F

G

0

第二步:

以A为起点,可以得到从A出发的几条边,更新最短距离,并标记A为已计算过最小路径

找到:

A - B;  权重8

A - D;  权重10

A - E;  权重12

第三步:

遍历上一步找出的几条路径,选择最短路径,并计算其临边的所有路径,更新表格,并标记B为已找过的顶点

找到:

A - B - C  14

A - B - F   20

第四步:不断重复第三步,直到所有顶点都找完为止

第五步:得到结果 A - B - F  - G

三. Python代码实现

1 #!/usr/bin/python3

2 #-*- coding: utf-8 -*-

3 #@author: Asp1rant

4

5

6 defdjkstra(graph, start, end):7 path_set = set() #已求的路径集合

8 priority_dic ={}9 for k ingraph.keys():10 priority_dic[k] = [9999, False, ""] #权重表构建为一个3维数组,分别是:最小路径代价,是否计算过最小边,最小路径

11 priority_dic[start][0] =012

13 #判断权重表中所有路点是否添加完毕

14 defisSelectAll():15 ret =True16 for val inpriority_dic.values():17 if not val[1]:18 ret =False19 break

20 returnret21

22 while notisSelectAll():23 find_point =start24 find_path =start25 min_distance = 9999

26 for path inpath_set:27 end_point = path[-1]28 path_distance =priority_dic[end_point][0]29 if path_distance < min_distance and not priority_dic[end_point][1]:30 find_point =end_point31 find_path =path32 min_distance =path_distance33 find_distance =priority_dic[find_point][0]34 neighbors =graph[find_point]35 for k inneighbors.keys():36 p = find_path + "-" +k37 weight = find_distance +neighbors[k]38 path_set.add(p)39 if weight

44 returnpriority_dic[end]45

46

47 if __name__ == '__main__':48 #用于测试的图

49 graph ={50 "A": {"B": 8, "D": 10, "E": 12},51 "B": {"C": 6, "F": 12},52 "C": {"F": 8},53 "D": {"E": 10, "G": 30},54 "E": {"F": 10},55 "F": {"G": 12},56 "G": {}57 }58 result = djkstra(graph, "A", "G")59 print(result)

输出结果:

[32, True, 'A-B-F-G']

python路径规划算法可视化_路径规划问题:DIJKSTRA算法 以及Python实现相关推荐

  1. python广度优先算法最短路径_最短路径问题的Dijkstra算法 -python

    最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树>    .该算法常 ...

  2. java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...

    最近在复习java,下学期要用,写这个练手.  技术较粗糙,见谅. 代码里用的是这幅地图,根据实际情况更改,在addNode方法中 这个是运行结果,起点和终点在 运行wrap(String qidia ...

  3. 求解广州到上海用时最短的路径,使用中国地图超详细剖析Dijkstra算法思想

    前言 当然,我们想知道广州到上海用时最短的路径,用导航软件一搜就知道答案了.但博文本意是想通过中国地图理解Dijkstra算法的主要思想,所以会设立一些特殊条件使得读者更好的能根据求解广州到上海用时最 ...

  4. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

  5. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  6. dijkstra算法PHP,单源最短路径(dijkstra算法)php实现

    做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...

  7. python路径规划算法可视化_[大创]一步一步写路径规划并绘图可视化 I new

    重新写了之前的I,这是中期答辩我写的桥段,没用上就放到博客里来了.有意向了解的朋友们可以去看看另外几篇详述的.密码是123456 一个简易的室内路径规划基础模型 1.1 选择编程工具 编程语言选择Py ...

  8. 多机器人路径规划的代码_知荐 | 地平线机器人算法工程师总结六大路径规划算法...

    来源 | 知乎 知圈 | 进"高精度地图社群",请加微信15221054164,备注地图 目录 1 自主机器人近距离操作运动规划体系········1.1 单个自主机器人的规划体系 ...

  9. python复杂网络点图可视化_数据分析:R与Python怎么选?

    作者介绍 知春里@伟仔 不知名数据科学家. 持续写<数据分析>和<数据产品>的系列文章,欢迎关注. 01 选R还是Python? "球鞋是买阿迪还是买耐克?" ...

最新文章

  1. 使用 cglib_java动态代理(JDK和CGLIB原理解析与使用)
  2. 关于调试windows services的方法
  3. 操作系统的中断,陷阱,异常
  4. c语言试题c组卡片换位,蓝桥杯 卡片换位 - 李韬|aitom|机器人|SLAM - OSCHINA - 中文开源技术交流社区...
  5. 【解决方案】SpringCloud项目优雅发版、部署
  6. excel 双纵坐标 图文介绍excel 2007如何画双纵坐标图
  7. IP Camera 基础知识
  8. win10开启移动热点,手机无法获取ip地址
  9. Inverted file index
  10. php反序列化漏洞中当不存在__invoke时的一种利用思路
  11. LeetCode——517. 超级洗衣机(Super Washing Machines)[困难]——分析及代码(C++)
  12. RH236介绍红帽GLUSTER存储
  13. python关键词排名_全自动监控网站关键词排名(Python实现)
  14. JAVA将时间如何将时间格式设置 yyyy-MM-ddTHH:mm:ssZ
  15. 2022年最新版初级商业数字营销师钻展题库
  16. 黑桃8形式的c语言编程,C语言的随机发牌程序(红桃、黑桃、梅花、方块)
  17. fedora14配置无线连接
  18. C#学习 - 关于协变(co-varianct)和抗变(contra-variant)
  19. es中对score 的过滤 min_score
  20. Vs13 开发水晶报表

热门文章

  1. angular示例_Angular Dependency Injection用示例解释
  2. corba的兴衰_代码广播的兴衰
  3. 如何在React中使用gRPC-web
  4. ios git解决冲突_适用于iOS和Linux的远程同步解决方案:Git和工作副本
  5. 数据科学家应该学习JavaScript吗?
  6. os系统好用的学术笔记软件_可靠软件系统的设计方法:学术文章摘要
  7. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事
  8. Linux——SSH服务器
  9. GIL对多线程的影响
  10. Team Foundation Server 2010 安装、部署与配置(一):安装计划 .