【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)

这篇具有很好参考价值的文章主要介绍了【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料

  • 路径规划与轨迹跟踪系列算法学习
  • 最短路径算法-迪杰斯特拉(Dijkstra)算法
  • 迪杰斯特拉dijkstra算法的python实现
  • Python实现迪杰斯特拉算法

1. 基本概念

1.1 算法简介

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

它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止。

它是图搜索算法的一种。

1.2 算法思想

  1. 设G=(V,E)是一个带权图,V为节点集合。通过Dijkstra计算图G中的最短路径时,需要指定一个起点(假设为D,即从顶点D开始计算)。
  2. 此外,引进两个点集S和U。初始时S中只有一个起点,S的作用是记录已求出最短路径的节点(以及相应的最短路径长度);而U则是记录还未确定最短路径的节点(以及该节点到起点D的距离)。
  3. 初始时,数组S中只有起点D,而数组U中是除起点D之外的节点集合,并且数组U中记录各节点到起点D的距离。如果节点与起点D不相邻,距离设为无穷大
  4. 然后,从数组U中找出路径最短的节点K,并将其加入到数组S中;同时,从数组U中移除节点K。接着,更新数组U中的各节点到起点D的距离。
  5. 重复第4步操作,直到遍历完所有节点。

1.3 算法图解

全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

以上图为例,设节点D为起点。

  1. 初始时,S只包含起点D;U包含除 D外的其他节点,且U中节点的距离为起点D到该节点的距离,如果该节点与起点D不相邻,距离为无穷大。

    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

  2. 从U中选出距离最短的节点C,并将节点C加入到S中;同时,从U中移除节点C。然后,更新U中各个节点到起点D的距离。

    之所以更新U中节点的距离,是由于确定了C是求出最短路径过程中的节点,从而可以利用C来更新其它节点的距离;因为起点D到节点v的距离(D,v)可能大于(D,C)+(C,v)的距离。

    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

接下来重复步骤1,2即可。

  1. 选取节点E,将E加入到S中,同时更新U中节点的距离。以节点F为例,之前F到D的距离为9;但是将E加入到S之后,F到D的距离为6=(F,E)+(E,D)。
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

  2. 将节点F加入到S中,同时更新U。
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

  3. 将节点G加入到S中,同时更新U。
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

  4. 将节点B加入到S中,同时更新U。
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

  5. 将节点A加入到S中,同时更新U。
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划
    此时,起点D到各个节点的最短距离就计算出来了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。

  6. 最后D->A的最优路径为D->E->F->A
    全局路径规划算法,# 规划,数据结构,迪杰斯特拉,人工智能,自动驾驶,路径规划

1.4 最短路径的最优子结构性质

如果 P ( i , j ) = { V i … V k … V m … V j } P(i,j)=\{V_i…V_k…V_m…V_j\} P(i,j)={ViVkVmVj}是从顶点 i i i j j j的最短路径, k k k m m m是这条路径上的一个中间顶点,那么 P ( k , m ) P(k,m) P(k,m)必定是从 k k k m m m的最短路径。

证明:反证法

假设 P ( i , j ) = { V i … V k … V m … V j } P(i,j)=\{V_i…V_k…V_m…V_j\} P(i,j)={ViVkVmVj}是从顶点 i i i j j j的最短路径,则有 P ( i , j ) = P ( i , k ) + P ( k , m ) + P ( m , j ) P(i,j)=P(i,k)+P(k,m)+P(m,j) P(i,j)=P(i,k)+P(k,m)+P(m,j)。而 P ( k , m ) P(k,m) P(k,m)不是从 k k k m m m的最短距离,那么必定存在另一条从 k k k m m m的最短路径 P ′ ( k , m ) P'(k,m) P(k,m),那么 P ( i , j ) = P ( i , k ) + P ′ ( k , m ) + P ( m , j ) < P ( i , j ) P(i,j)=P(i,k)+P'(k,m)+P(m,j)<P(i,j) P(i,j)=P(i,k)+P(k,m)+P(m,j)<P(i,j)。则与 P ( i , j ) P(i,j) P(i,j)是从 i i i j j j的最短路径相矛盾。因此该性质得证。

1.5 算法说明

Dijkstra算法过程包括了三个循环,第一个循环的时间复杂度为 O ( n ) O(n) O(n),第二、三个循环为循环嵌套,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

可以看出,Dijkstra最短路径算法的执行时间和占用空间与图(或网)中结点数目有关,当结点数目较大时,Dijkstra算法的时间复杂度急剧增加。当图规模较大时,直接应用该算法就会存在速度慢或空间不够的问题。所以在大的城市交通网络图中直接应用Dijkstra最短路径算法是很困难的。路径规划作为无人驾驶汽车导航系统的重要功能模块,其算法的优劣是非常重要的,评价该算法的主要性能指标是它的实时性和准确性。Dijkstra算法作为经典的路径规划算法,在实验地图数据量较小情况下会得到很好的规划结果,但在实验地图数据量较大情况下很难满足路径规划的实时性要求。

2. python代码实现

参考自资料。


def dijkstra(matrix, source):
    """迪杰斯特拉算法实现
    Args:
        matrix (_type_): 用邻接矩阵表示带权图
        source (_type_): 起点

    Returns:
        _type_: 最短路径的节点集合,最短路径的节点的最短距离,每个节点到起点的最短路径
    """
    INF = float('inf')
    n = len(matrix)
    m = len(matrix[0])
    assert n == m, "Error, please examine matrix dim"
    assert source < n, "Error, start point should be in the range!"
    S = [source]        # 已找到最短路径的节点集合
    U = [v for v in range(n) if v not in S]  # 记录还未确定最短路径的节点集合
    distance = [INF] * n          # source到已找到最短路径的节点的最短距离
    distance[source] = 0  # 起点到自己的距离
    path_optimal = [[]]*n           # source到其他节点的最短路径
    path_optimal[source] = [source]
    while len(S) < n:   # 当已找到最短路径的节点小于n时
        min_value = INF
        col = -1
        row = -1
        for s in S:     # 以已找到最短路径的节点所在行为搜索对象
            for u in U:   # 从U中搜索尚未记录的节点
                if matrix[s][u] + distance[s] < min_value:  # 找出最小值
                    # 在某行找到最小值要加上source到该行的最短路径
                    min_value = matrix[s][u] + distance[s]
                    row = s         # 记录所在行列
                    col = u
        if col == -1 or row == -1:  # 若没找出最小值且节点还未找完,说明图中存在不连通的节点
            break
        S.append(col)  # 在S中添加已找到的节点
        U.remove(col)  # 从U中移除已找到的节点
        distance[col] = min_value # source到该节点的最短距离即为min_value
        path_optimal[col] = path_optimal[row][:]    # 复制source到已找到节点的上一节点的路径
        path_optimal[col].append(col)       # 再其后添加已找到节点即为source到该节点的最短路径
    return S, distance, path_optimal


def main():
    INF = float('inf')
    # 使用邻接矩阵存储图
    # A B C D E F G
    matrix = [[0, 12, INF, INF, INF, 16, 14],
            [12, 0, 10, INF, INF, 7, INF],
            [INF, 10, 0, 3, 5, 6, INF],
            [INF, INF, 3, 0, 4, INF, INF],
            [INF, INF, 5, 4, 0, 2, 8],
            [16, 7, 6, INF, 2, 0, 9],
            [14, INF, INF, INF, 8, 9, 0]]
    S, distance, path_optimal = dijkstra(matrix, 3)
    print('S:')
    print(S)
    print('distance:')
    print(distance)
    print('path_optimal:')
    for p in path_optimal:
        print(p)

if __name__ == '__main__':
    main()



详细请见github仓库

4. c++代码实现

由于在自动驾驶中算法实现一般使用C++,所以我也使用C++实现了相关功能,代码结构与pythonRobotics的代码实现类似,这边就不再做相关代码解释了。完整代码详见另一个github仓库。文章来源地址https://www.toymoban.com/news/detail-717666.html

到了这里,关于【路径规划】全局路径规划算法——Dijkstra算法(含python实现 | c++实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Dijkstra算法实现无人机三维路径规划

    基于Dijkstra算法实现无人机三维路径规划 无人机在飞行任务中往往需要寻找一条最优路径以达到最佳的飞行效果。而在三维空间中,路径规划问题变得更加复杂。本文将介绍如何基于Dijkstra算法来解决无人机三维路径规划问题,并且提供相应的matlab代码。 一、Dijkstra算法简介

    2024年02月14日
    浏览(61)
  • 【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

    好久不见,我又回来了, 这段时间把路径规划的一系列算法整理一下 ,感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法,文末有 python 完整代码,那我们开始吧。 1959 年,荷兰计算机科学家 ·EdsgerWybe·Dijkstra 发表了论文《 A note on two problems in c

    2023年04月08日
    浏览(45)
  • 【路径规划】局部路径规划算法——人工势场法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 基于改进型人工势场法的车辆避障路径规划研究 基于改进人工势场法的车辆避障路径规划研究 1986 年 Khatib 首先提出人工势场法,并将其应用在机器人避障领域, 而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障

    2023年04月09日
    浏览(40)
  • 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 曲线杂谈(二):Bezier曲线的特殊性质 贝塞尔曲线的特性总结 贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔( Pierre Bézier)发表,他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线是应用于二维图形应用程序的数学曲线,由一组称为

    2024年02月14日
    浏览(83)
  • 自动驾驶路径规划——Dijkstra算法

    这个学期学校开设了相应的课程,同时也在学习古月居机器人学系列的《基于栅格地图的机器人路径规划指南》,为了巩固知识,方便自己的学习与整理,遂以学习笔记的形式记录。      深度优先搜索( Depth First Search , DFS ) :首先从某个顶点出发,依次从它的各个未被

    2024年01月22日
    浏览(43)
  • 基于Dijkstra算法的机器人编队路径规划问题

    基于Dijkstra算法的机器人编队路径规划问题 路径规划是机器人领域中的一个重要问题,它涉及确定从起点到目标点的最佳路径。Dijkstra算法是一种经典的图算法,用于解决最短路径问题。在本文中,我们将介绍如何使用Dijkstra算法来实现机器人编队的路径规划,并提供相应的

    2024年02月08日
    浏览(48)
  • 路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

    1. 背景介绍 路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用,包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展,路径规划技术也在不断地得到改进和应用。 路径规划中常见的算法可以分为

    2024年02月03日
    浏览(50)
  • 数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

    目录 前言 1. 介绍 2. 加权图 2.1 概念 3. 最短路径 -- Dijkstra 算法 3.1 历史 3.2 Dijkstra 算法的基本思路 3.3 Dijkstra 算法图解 4.  python中dijkstra算法的实现 5. 总结  前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。 本章,我们将介绍 加权图 和 最短路径 的相关知识。 最

    2024年02月12日
    浏览(51)
  • 路径规划-DWA算法(C++实现)

    1、简单介绍 DWA算法(dynamic window approach),其原理主要是在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价(其中包括距离障碍物距离,距离目标点距离等等进行评价),选取最优轨迹对应的(v,w)驱动机器人

    2024年02月10日
    浏览(42)
  • 数学建模6——路径规划的各种算法(Dijkstra、Floyd、A*、D*、RRT*、LPA*)

    前言:本文只是简单的介绍一下各路径规划算法的概念和流程,可用于对算法的初步了解,如果要进一步学习,可以在 个人理解 中找到我推荐的其他博主更为完善的文章。 目录 一、Dijkstra 基本概念 基本流程 个人理解 MATLAB代码 二、Floyd 基本概念 基本流程 个人理解 MATLAB代

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包