机器人路径规划:基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(提供Python代码)

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。它可以找到从一个起始节点到其他所有节点的最短路径。

一、算法介绍


Dijkstra算法采用贪心策略,通过逐步扩展已知最短路径集合来逐步确定最短路径。它使用一个距离数组来记录从起始节点到其他节点的当前最短距离,并通过不断更新距离数组来逐步确定最短路径。

二、算法描述


1. 创建一个距离数组dist[],用于记录起始节点到其他节点的当前最短距离。初始化dist[],将起始节点的距离设为0,其他节点的距离设为无穷大。
2. 创建一个集合visited[],用于记录已经确定最短路径的节点。
3. 重复以下步骤,直到visited[]包含所有节点:
   a. 从未访问的节点中选择一个距离最小的节点u,将其加入visited[]。
   b. 对于节点u的所有邻居节点v,更新其距离数组dist[]:
      - 如果通过节点u可以获得更短的路径,则更新dist[v]为新的最短距离。
4. 最终,dist[]数组中记录了起始节点到其他所有节点的最短距离。

三、算法流程


1. 初始化dist[]数组和visited[]集合。
2. 将起始节点的距离设为0。
3. 重复以下步骤,直到visited[]包含所有节点:
   a. 从未访问的节点中选择一个距离最小的节点u。
   b. 将节点u加入visited[]。
   c. 对于节点u的所有邻居节点v,更新其距离数组dist[]:
      - 如果通过节点u可以获得更短的路径,则更新dist[v]为新的最短距离。
4. 返回dist[]数组作为最短路径结果。

四、部分代码

import matplotlib.pyplot as plt
import math

show_animation = True


class Dijkstra:

    def __init__(self, ox, oy, resolution, robot_radius):
        """
        Initialize map for a star planning

        ox: x position list of Obstacles [m]
        oy: y position list of Obstacles [m]
        resolution: grid resolution [m]
        rr: robot radius[m]
        """

        self.min_x = None
        self.min_y = None
        self.max_x = None
        self.max_y = None
        self.x_width = None
        self.y_width = None
        self.obstacle_map = None

        self.resolution = resolution
        self.robot_radius = robot_radius
        self.calc_obstacle_map(ox, oy)
        self.motion = self.get_motion_model()

    class Node:
        def __init__(self, x, y, cost, parent_index):
            self.x = x  # index of grid
            self.y = y  # index of grid
            self.cost = cost
            self.parent_index = parent_index  # index of previous Node

        def __str__(self):
            return str(self.x) + "," + str(self.y) + "," + str(
                self.cost) + "," + str(self.parent_index)

五、部分结果

六、完整Python代码

见下方联系方式

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Dijkstra算法Python中实现并打印路径的示例代码: ```python import sys class Graph: def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printPath(self, parent, j): if parent[j] == -1: print(j, end=' ') return self.printPath(parent, parent[j]) print(j, end=' ') def printSolution(self, dist, parent, src): print("Vertex \t Distance from Source \t Path") for node in range(self.V): print(node, "\t\t", dist[node], "\t\t", end='') self.printPath(parent, node) print() def minDistance(self, dist, sptSet): min = sys.maxsize for v in range(self.V): if dist[v] < min and sptSet[v] == False: min = dist[v] min_index = v return min_index def dijkstra(self, src): dist = [sys.maxsize] * self.V parent = [-1] * self.V dist[src] = 0 sptSet = [False] * self.V for cout in range(self.V): u = self.minDistance(dist, sptSet) sptSet[u] = True for v in range(self.V): if self.graph[u][v] > 0 and \ sptSet[v] == False and \ dist[v] > dist[u] + self.graph[u][v]: dist[v] = dist[u] + self.graph[u][v] parent[v] = u self.printSolution(dist, parent, src) ``` 在上面的代码中,我们首先定义了一个`Graph`类,其中`__init__`方法初始化了`V`个节点的图。然后,`printPath`方法用于打印源节点到目标节点的最短路径。`printSolution`方法用于打印从源节点到每个节点的距离及其路径。`minDistance`方法用于找到距离源节点最近的未访问节点。最后,`dijkstra`方法使用Dijkstra算法找到从源节点到每个节点的最短路径,并打印结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值