RRT:
实现:给定一个node_start, node_goal,随机选择一个node_rand,在node_list列表里选择一个离node_random最近的点设置为node_nearest,然后沿着node_nearest朝node_random走step_length距离,找到一个node_new, 将其加入node_list。
重复上述过程直到找到一个node_new接近node_goal,然后再在得到的node_list中找到从node_start到最后一个node_new的列表就构成了path。
优势:速度较快,概率完备
劣势:通常不是最优路径
https://blog.csdn.net/u013528298/article/details/80546175
RRT*:
实现原理于RRT,基本相同,但是RRT的最优化的版本。
1 不同:RRT会记录每个顶点相对于其父顶点移动的距离。 这称为顶点的cost()。 在图中找到最近的节点后,将检查距新节点固定半径内的顶点邻域。 如果找到比近端节点更便宜的 cost() 节点,则更便宜的节点替换近端节点。
2 不同:RRT树的重新布线,当新的顶点连接到更便宜的节点后,再次检查新节点固定半径内的顶点,如果将其连接到新的顶点后(即将新的节点当作父节点)会使得其cost降低,则将新节点当作此节点的父节点连接上去。
Dijkstra:
实现:从绿色start开始对每个栅格进行遍历,即对每个栅格的cost进行更新,一直迭代遍历到黄色的goal为止,然后从goal再反向查找start即得最优路径。
优势:简单
劣势:环境太大的话,算法复杂度较高
https://www.guyuehome.com/5652
https://www.guyuehome.com/33665
A*算法:
实现:相对于Dijkstra算法,增加了每个节点到目标点的启发函数,根据启发函数构建最小代价的节点。
优势:相对Dijkstra算法较快
劣势:当目标较多的时候,会带入大量重复数据和复杂的估价函数
A*算法和Dijkstra算法的比较:
Dijkstra算法计算源点到其他所有点的最短路径长度,A关注点到点的最短路径
Dijkstra算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,A算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。
PRM算法:
相较于Dijkstra算法,PRM只是采样了一个地图中的一堆点,来进行A*等搜索算法的路径搜索。
优势:算得比较快
劣势:概率不完备