原文: https://blog.csdn.net/minfanphd/article/details/120666884
-
定义清楚问题
输入、输出、优化目标、约束条件
输入:1) 二维平面地图,地图的大小是已知的吗?2) 障碍是已知的吗(有可能走到面前才知道,并没有上帝视角)?3) 地图上的区域有差异吗(距离与路程是否一定成正比,如果有沼泽地就不一定了)?
输出:从原点到终点的路径
优化目标:1)路径最短;2)搜索时间最短。其实是多目标优化。
约束条件:障碍物,导致有些顶点不可达 -
输入:起始点坐标,终点坐标,障碍物坐标以及其影响范围,这里使用的都是圆形障碍物,方便判断。1) 地图大小对算法本身来说是未知的,2)障碍物在什么地方也是未知的,如果经过障碍物区域或走到面前才知道3) 地图上的区域只分为障碍物区域以及非障碍物区域,障碍物区域不可达,非障碍物区域性质一致。如果中途未经障碍物区域,距离与路程一定成正比。
输出:一条从起点达到终点的避开障碍物的路径。
优化目标:1) 搜索时间最短 2) 路径长度最短或接近最短
约束条件:路径需要避开障碍物,障碍物范围内不可达。 -
在本文中,起点:(0, 0),图中显示为绿色。
终点:(15, 12),图中显示为红色。
障碍物:设置了5个障碍物,均为黑色,不过半径不一样。
实际地图范围:x轴0-15, y轴0-12。
图中,红色圆点为起点,标注为start。红色五角星为终点,标注为goal。在这里,使用的广度优先算法,dijkstra算法,遗传算法中的路径节点取值为离散的,即只走在整数坐标上(5,5)。每个节点可行的方向8个方向,即其周围相邻8个节点。在图中使用灰色线段画出,所有可行节点为灰色。图中标注了障碍物的中心坐标以及其影响范围。
- 给出一个最简单粗暴的算法,最好是确定性的
穷举法、动态规划算法(自底向上)
dijkstra算法,算法不赘述。
规划结果如图,在非障碍物区域移动到下一节点的路径为节点间的距离 ,
[(0,0), (1,0), (2,0), (3,0), (4,0), (5,0), (6,1), (7,2), (8,3), (9,4), (10,5), (10,6), (10,7), (11,8), (12,9), (13,10), (14,11), (15,12)]
路径长度为21.142135623730955。
广度优先搜索,从起点开始遍历相邻8个节点。直至遍历到终点为止。
规划结果如图,路径节点分别为
[(0,0), (1,0), (2,0), (3,0), (4,0), (5,0), (6,1), (7,2), (8,3), (9,4), (10,5), (10,6), (10,7), (11,8), (12,9), (13,10), (14,11), (15,12)]
,路径长度为21.142135623730955。
- 寻找更优的算法,有可能是不确定性的智能算法
分治法(减少时间的常用方法)
遗传算法,算法思想比较简单。
通过随机一定数量的初始化种群(理解为需要解决问题的解集),然后通过交叉(交换解的部分解值),变异(对解值做一定随机的变换),评估解的适应度(理解为解是否适合解决这个问题。在这里,使用路径长度,路径平滑度进行构造函数评估。),遗传,将生成的解集挑选部分解放入下次上述流程。直到达到最大迭代次数。
遗传算法就是通过构造一定数量的解,只要解的数量足够多,就可能逼近或达到最优解。
规划结果如图,路径节点分别为
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 1), (7, 2), (7, 3), (8, 4), (9, 4), (10, 5),(10, 6), (10, 7), (11, 8), (12, 9), (13, 10), (14, 11), (15, 12)]
路径长度为22.313708498984766。