本文参考《MATLAB智能算法30个案例分析》一书,文末的源代码也来自本书
前一段时间有小伙伴问能否出一个机器人路径规划的推文,小编最近努力查资料,然后学习一些新知识,然后才动笔写这篇推文,不知道能不能达到那位小伙伴的期待。
查阅了许多论文发现,机器人路径规划算法有太多太多,这里小编参考了上面提到的这本书,然后结合书中的代码,逐渐体会出二维路径规划的一些思想。废话不多说,接下来开始学习吧!
路径规划算法就是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。简单来说,就是如何避障并找出一条最佳路径。
上图中S代表起点,T代表终点,问题是如何找出一条从S出发到T结束并且不穿过障碍物的最短路径?
蓝色、黄色和绿色哪条路径最短呢,恐怕我们无法观察得出。这三条路径都是小编凭感觉画出来的,但是在实际计算过程中,我们不可能只凭着感觉找最短路径,因此这里引出一个图论的基本理论——MAKLINK图论理论。
MAKLINK图论可以建立二维路径规划的空间模型,其通过生成大量的MAKLINK线构造的二维路径规划可行空间。说白了,就是咱们使用人家定义好的一堆线,然后以此为基准,再找可行路径。那么什么是MAKLINK线呢?
MAKLINK线定义为两个障碍物之间不与障碍物相交的顶点之间的连线,以及障碍物顶点与边界相交的连线。
下图将所有MAKLINK线全部连出,v代表MAKLINK线的中点。
连接图中所有MAKLINK线的中点加上始点S和终点T构成用于初始路径规划的无向网络图,如下图所示。
在这张无向图的基础上,我们使用dijkstra算法找出一条初始可行路径。
我们可以数出从S到T,一共经过8个点,S-v8-v7-v6-v12-v13-v11-T,一共经过6条MAKLINK线。可能细心的小伙伴会看出这个dijkstra算法获得的初始路径会有很大提升空间。
因为v是MAKLINK线的中点,那么能不能够从这6条MAKLINK线中,每条都找到一个最合适的点,然后恰好从S出发经过这6个待找到的点,最后到终点T,所经过的路径恰好最短呢?
假设一条MAKLINK线两端的点为P1和P2,那么表示这条线段上任意一点的公式为:P(h)=P1+(P2-P1)*h 其中h取值范围为[0,1]。
看到这里小伙伴也许会恍然大明白了,这不就是找出6个合适的h值吗!!!
那么如何找出这6个h值呢,书中采用蚁群算法进行求解。对蚁群算法陌生的小伙伴可以参考之前的推文蚁群算法通俗讲解(附MATLAB代码)。下面给出蚁群算法求解该问题的流程图。
蚁群算法优化寻找的路径参数集合为(h1,h2,h3,...,h6)。假设共有m只蚂蚁从S出发到终点T,经过的路径为S-n1j-n2j-n3j-n4j-n5j-n6j-T,其中ndj表示路径点在第d条MAKLINK线的第j个等分点上。蚂蚁在移动的过程中,不可能完全随机地从一个点移动到下一个点。因此设定一个规则:当蚂蚁在MAKLINK线Li时,选择下一个MAKLINK线Li+1上节点j的方法为
其中为所有蚂蚁在MAKLINK线Li上时点的集合,
为信息素,
为启发值,q为(0,1)直接的随机数,q0为[0,1]之间的可调参数。
其实这里就是给蚂蚁选择下一个点时设定一个规则,各位小伙伴不用太纠结这个规则是如何设定的,针对不同的问题规则的设定也会不同。
蚁群算法的一大特点就是信息素,因为有了信息素,所以其它蚂蚁选择信息素浓度高的路径概率就大。这里的信息素更新体现在两部分。
一部分是实时信息素更新,另一部分是路径信息素更新。
实施信息素更新是指每一只蚂蚁在选择某个节点后必须对该节点的信息素进行更新,即
为信息素初始值,
为[0,1]区间的可调参数。
当所有蚂蚁从初始点走到终点,完成依次迭代搜索时,选择所有蚂蚁经过路径中长度最短的一条,更新该条路径上每一个点的信息素,即
为最短路径长度。
小编建议边看代码边理解,效果会更好。
蚁群算法优化后的路径如下图蓝线所示:
MATLAB代码链接(后台回复“蚁群二维路径”提取代码)
链接:https://pan.baidu.com/s/1rK72iSAM-ktHOsvQThCJaQ
提取码:4fys
代码有效期只有7天,如发现链接过期,可通过公众号后台联系小编,小编会尽快给您新的链接。