💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
在路径规划算法中,A(A-star)启发搜索、Hybrid-A(混合A*)、Dijkstra迪杰斯特拉算法、GBFS(贪婪最佳优先搜索)、DFS(深度优先搜索)和BFS(广度优先搜索)是几种常用的算法。下面将分别介绍这些算法在路径规划中的应用和特点。
1. A*(A-star)启发搜索算法
原理:
A算法是一种启发式搜索算法,用于在图或网格中找到从起始节点到目标节点的最短路径。它结合了Dijkstra算法的全局搜索能力和贪心最佳优先搜索的启发式搜索能力。A算法通过评价函数f(n) = g(n) + h(n)来选择下一个要探索的节点,其中g(n)是从起点到节点n的实际代价,h(n)是从节点n到目标节点的估计代价(启发式函数)。
特点:
- 高效性:由于引入了启发式函数,A*算法能够更快速地找到最短路径。
- 完备性:在启发式函数可接受的条件下,A*算法能够找到最短路径。
- 灵活性:启发式函数可以根据具体问题进行设计,以适应不同的应用场景。
2. Hybrid-A(混合A)算法
原理:
Hybrid-A算法是A算法的一种扩展,它结合了车辆动力学模型,用于在连续空间上搜索满足车辆非完整性约束的最短路径。Hybrid-A算法放弃了A算法中对搜索空间的离散化,而是利用Dubins或Reeps-Shepp模型来生成满足车辆运动学约束的路径。
特点:
- 考虑车辆动力学:Hybrid-A*算法能够生成符合车辆实际运动能力的路径。
- 路径平滑:生成的路径更加平滑,有利于车辆的跟踪和控制。
- 牺牲完备性和最优性:为了考虑车辆动力学,Hybrid-A*算法可能无法找到全局最优解,且算法的完备性也可能受到影响。
3. Dijkstra迪杰斯特拉算法
原理:
Dijkstra算法是一种用于找到图中节点之间最短路径的算法。它维护一个优先队列,并按照从起点到当前节点的累计成本(g(n))来选择下一个要探索的节点。
特点:
- 全局搜索:Dijkstra算法会探索所有可能的路径,直到找到最短路径。
- 无启发式:Dijkstra算法不依赖于启发式函数,因此其搜索过程较为盲目。
- 高计算成本:在大型图中,Dijkstra算法的计算成本可能较高。
4. GBFS(贪婪最佳优先搜索)算法
原理:
GBFS算法是一种贪心算法,它根据某种启发式规则(如欧氏距离或曼哈顿距离)来选择下一个要探索的节点。GBFS算法总是选择看起来最接近目标节点的节点进行探索。
特点:
- 贪心性:GBFS算法总是选择当前看起来最优的节点进行探索。
- 快速但不保证最优:GBFS算法能够快速找到一条路径,但这条路径可能不是最短路径。
- 适用于无障碍环境:在无障碍环境中,GBFS算法通常能够找到最短路径。
5. DFS(深度优先搜索)算法
原理:
DFS算法是一种用于遍历或搜索树或图的算法。它从根节点(或起始节点)开始,尽可能深地搜索树的分支,直到达到叶子节点或满足某种条件为止。然后回溯到上一个节点,继续探索其他未探索的分支。
特点:
- 深度优先:DFS算法总是尽可能深地探索图的分支。
- 空间效率高:DFS算法通常只需要较小的内存空间来存储搜索过程中的节点。
- 可能陷入死循环:在无限图或包含循环的图中,DFS算法可能无法找到目标节点或返回结果。
6. BFS(广度优先搜索)算法
原理:
BFS算法是一种用于遍历或搜索树或图的算法。它从根节点(或起始节点)开始,逐层遍历图的节点,直到找到目标节点或遍历完所有节点为止。
特点:
- 广度优先:BFS算法总是先访问离起始节点最近的节点。
- 找到最短路径:在无障碍图中,BFS算法能够找到从起始节点到目标节点的最短路径(按边数计算)。
- 空间成本高:BFS算法可能需要较大的内存空间来存储待探索的节点。
综上所述,每种算法都有其独特的优势和适用场景。在选择算法时,需要根据具体问题的特点和需求进行权衡和选择。
📚2 运行结果
部分代码:
终点坐标
map_array : ndarray
二值化地图, 0表示障碍物, 255表示空白, H*W维
move_step : int
移动步数, 默认3
move_direction : int (8 or 4)
移动方向, 默认8个方向
"""
# 网格化地图
self.map_array = map_array # H * W
self.width = self.map_array.shape[1]
self.high = self.map_array.shape[0]
# 起点终点
self.start = Node(*start_pos) # 初始位置
self.end = Node(*end_pos) # 结束位置
# Error Check
if not self._in_map(self.start) or not self._in_map(self.end):
raise ValueError(f"x坐标范围0~{self.width-1}, y坐标范围0~{self.height-1}")
if self._is_collided(self.start):
raise ValueError(f"起点x坐标或y坐标在障碍物上")
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]王泉啸,蔡先华,WangQuanXiao,等.动态最佳路径算法研究[J].城市勘测, 2009(1):73-75.DOI:10.3969/j.issn.1672-8262.2009.01.019.
[2]鲁毅,高永平,龙江腾.A*算法在移动机器人路径规划中的研究[J].湖北师范大学学报:自然科学版, 2022(002):042.
[3]赵作鹏,宗元元.面向矿井突水避险的双向搜索多最优路径算法[J].中国矿业大学学报, 2015, 44(3):7.DOI:CNKI:SUN:ZGKD.0.2015-03-028.
🌈4 Python代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取