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

news/2025/3/15 12:35:04/

一. 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']


http://www.ppmy.cn/news/822261.html

相关文章

计算机二级要学的函数有哪些,2019年计算机二级等级考试Excel函数公式汇总

1、求和函数: SUM =SUM ( A1:A5 , 5 ) 等于 60 2、条件求和函数:SUMIF = SUMIF ( A2 : A6 , “ 01 ” , F2 : F6 ) 3、求平均值函数: AVERAGE =AVERAGE(A1:A5, 5) 等于 10 4、 最大(小)值函数: MAX( MIN) = MAX(A1:A5) 等于 27 5、统计数值型数据个数函数: COUNT = COUNT …

c语言第七章指针答案,C语言指针练习+答案+讲解

《C语言指针练习+答案+讲解》由会员分享,可在线阅读,更多相关《C语言指针练习+答案+讲解(29页珍藏版)》请在人人文库网上搜索。 1、第七章 指针71 选择题1 若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。A p=q; B *p=*q; C a=*q; D q=a;a是整型数,int *…

杭州最新公交线路一览(31-40)

31/K31市一医院-火车东站 上行站点:市一医院、众安桥、皮市巷口、潮鸣寺巷、宝善桥建国路口、莫衙营、公交总公司、闸弄口新村、汽 车东站、火车东站 下行站点:火车东站、汽车东站、闸弄口 新村、公交总公司、莫衙营、宝善桥建国路口、潮鸣寺巷、浙一医院、联桥、市一医院 首…

2021-03-24

计算机二级Excel公式整理 1、提取员工生日&#xff1a; 【 注&#xff1a;” ” 为小写 】 &#xff1d; MID&#xff08; F3&#xff0c;7&#xff0c;4 &#xff09;& ”年” & MID&#xff08; F3&#xff0c;11&#xff0c;2 &#xff09;& ”月” & MID&…

个人设想中的TCAX GUI生成的带python脚本代码的ASS字幕文件

这个是我自己设想的一种带Python脚本代码的ASS字幕文件&#xff0c;第27行那里的[Python]表示ass字幕文件中的Python脚本代码分区&#xff0c;这部分内容我是打算如果未来有空给TCAX做GUI的话&#xff0c;就在GUI上加入一个专门写Python脚本代码的分区&#xff0c;并且这个分区…

寒假集训D2.22.12.29

Day2 K31.选择器 1.为什么要用控制器 2.element选择器 K32.div的class命名 1.class选择器 K33.id选择器 1.id选择器 K34.通配选择器 1.*通配符/选择器 K35.选择器pro 1.群组选择器 1&#xff09;原 2&#xff09;现 2.包含选择器/后代选择器 …

flask+pymysql初步实践

flaskpymysql初步实践 软件&#xff1a;pycharm 需要安装&#xff1a;pymysql flask 软件安装 文件夹内部如下所示 其中&#xff0c;templates文件夹内放置网页文件 工程文件如图所示 测试hellow world from flask import Flaskapp Flask(__name__)app.route(/) def hel…

Redis的数据结构之 list

文章目录 书接上回list 简介list的相关命令LPUSH命令lpushx 命令rpush 命令rpushx 命令lpop 命令rpop 命令lrange 命令rpoplpush 命令lrem 命令llen 命令lindex 命令linsert 命令lset 命令ltrim 命令blpop 命令brpop 命令brpoplpush 命令 list内部结构之quicklistquicklistquic…