以无人机避障为模拟场景
使用一般算法解决避障问题,需要考虑计算所有可能的状态序列才可能得到最好的解,当状态较多时计算量迅速增长,并且不具备以往路线规划的经验即有可能重复计算。如Dijstra,Bellman-Ford可以将一些节点的计算信息存储起来,减少计算量。在小规模问题中可以表现的很好,在更大的规模问题中,存储量不断增加,搜索起来更加困难。在三维空间中状态增多,行为可能性变多,这些算法不能很好的使用。在寻找不是很精确路径规划的一些问题中使用Q-Learning算法可以解决传统算法的弊端。
1.1 Dijkstra算法
在二维平面中寻找最优路径来避免障碍物,如图2.1所示从出发点到终点每走一步奖励值减一,碰到障碍物奖励值减五并终止此次试验。使用编程试探思想来实现,从出发点开始,随机选取行为来移动,碰到障碍物就回退直到终点。这种寻找路径处在以下问题:虽然最终可以找到终点,但无法确定需要多长时间,寻找的路径中可能存在重复的线路。可以记录每一步来避免重复的线路,有可能出现堵死的情况导致不能移动,如图2.2所示。可以使用递归的思想,如何遇到不能进行下一步选择,则回退到上一步直到终点,记录每一此实验的路线找到比较优的路线,这样不断探测路线的方式存在不同路线可能经过重复的点,增大计算量。
图2.1 模拟环境示意图
图2.2 行动示意图
还存在这样问题,最优的路线是随机生成的,理论上不能推理得到,存在很大的随机性。有大量的重复路线,是因为此算法不具备上一次实验的经验,可以使用表格记录每一个状态选择不同行为的回报值,如表2.1。
表2.1 状态值表
状态 | 上 | 下 | 左 | 右 |
(1,1) | — | -1 | — | -1 |
(1,2) | — | -5 | -1 | -1 |
(1,3) | — | — | — | — |
(1,4) | — | -1 | -1 | — |
(1,5) | — | -1 | -5 | — |
(2,1) | -1 | -1 | — | -1 |
…… | …… | …… | …… | …… |
有了经验值再一次试验可以借助状态行为值表做出较好的行为,同时也应该尝试未使用的行为去探索其他状态,直至所有状态所有行为都有了对应的值。即使有了行为值表格也不能选取最优的路径。这样的表格可以根据已知的环境自动生成。这种探索的方法是对未知的环境寻找路径有一定的帮助。
Dijkstra是求最短路径的算法,可以得到源点到其他所有点的最短路径,即可以找到到达终点的最优路径。Dijkstra算法可以生成源点到所有点最短路径的值,可以作为状态值,如图2.3所示,下一次试验可以直接利用快速找到路径。
图2.3 Dijkstra算法生成的状态值
图2.4 Dijkstra算法生成的状态值
Dijkstra算法计算的最短路径作为状态还存在一些问题。如在(3,1)位置可能会选择不能使整体最优的的行为,向下走。可以调整源点,把终点作为源点计算得到的状态不会存在这种问题,如图2.4所示。Dijkstra算法一次性计算就可以得到状态表,根据状态表在任何一个位置都可以找到一条到终点的最优路径。Dijkstra算法的优点也是它的缺点,Dijkstra算法使用递归算法一次性得到状态表,Dijkstra算法的复杂度O(),随着状态的增多,计算量极具增大。对于一些可以预处理的问题Dijkstra算法可以使用,对于一些需要快速应用或者状态未知的问题需要算法去探索,Dijkstra算法不再使用,每一次探索到的新状态,Dijkstra算法需要重新计算一遍,计算量消耗大。
在三维空间试验中相对于二维平面,状态增加,行为增多,算法不变。