算法设计原则Word文档格式.docx
《算法设计原则Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法设计原则Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
p=x+10y(1-1)
而在MATLAB语言中,x和y与P的关系为
x=rem(p,10)(1-2)
y=fix(P,10)(1-3)
其中,rem表示取余操作,fix表示取整操作。
对已建立的栅格加入序号编码后的图形见图1。
因为遗传算法在搜索和优化上具有的优势,所以采用遗传算法来进行机器人路径的规划。
用遗传算法对机器人的路径进行规划时,可将直角坐标法同序号法相结合使用,根据条件的不同按照映射关系进行变换。
这样既减少了个体长度及编码的复杂度,又可以保证机器人处于栅格中心位置,避免了与其周围障碍物的碰撞。
为了使每次的路径寻优都尽量向接近目标点的方向运动,当前栅格邻接方位的位置显得极为重要。
对于8个邻接方位,8个方位分别为:
右下,右,右上,上,左上,左,左下,下。
方位距离表示当前栅格到它的邻接栅格的距离,定义为两个栅格之间的中心距离。
可以看出,当前栅格和它相邻的8个方位的距离为定义为
(1-4)
由于地图的表示有两种方式,有序号法,如上所述,和直角坐标法。
因此,在机器人地图的表示中,需要一个结构来表示这两种表示方法的对应关系。
typedefstructGrid
{
DPOINTm_left_up;
DPOINTm_left_down;
DPOINTm_right_up;
DPOINTm_right_down;
DPOINTm_center;
intproperty;
intserial_number;
}GRID,*PGRID;
在结构GRID中,以栅格的四个顶点,一个中心点栅格属性以及栅格序号表示一个栅格的信息。
其中,栅格的四个顶点为:
左上点m_left_up,左下点m_left_down,右上点m_right_up,右下点m_right_down,DPOINT也是一个结构表示地图中点的坐标{doubles_X;
doubles_Y};
栅格中心点为m_center,整数property表示此栅格为自由栅格还是障碍栅格。
如果是自由栅格property=0,否则property=1。
整数serial_number表示每个栅格的序号。
图1中,灰色格为障碍栅格。
2.算法流程
2.1改进的初始种群
遗传算法与传统搜索算法不同,遗传算法在运算开始需要随机产生一组初始解,称作初始种群。
结合本章的机器人路径规划考虑,初始种群中的每个解,必须满足两个条件:
一是栅格的连续性,它确保了种群的可行性;
二是随机性,它保证了初始种群尽可能分布在搜索空间中每一个区域,体现遗传算法的全局最优性。
本算法中初始种群的产生方法主要有以下特点:
(1)采用不等长染色体,每条染色体都是“起点”和“终点”之间的一条连续栅格代码,因此,采用不等长染色体比较合理。
(2)采用A*算法产生初始种群。
在“起点”和“终点”之间随机插入一个或多个中间点,然后,采用A*算法在这些点之间填充连续栅格,使之成为可行的初始解;
这种方法产生的初始解更接近于最优解,大大提高了收敛速度。
在讨论初始种群前,首先给出连续的相邻栅格定义:
定义1连续的相邻栅格如图2.1所示,地图中与栅格N相邻的有八个栅格,分别是N-Nraw-1,N-Nraw,,N-Nraw+1,N-1,N+1,N+Nraw-1,N+Nraw,N+Nraw+1,其中Nraw为每行中的最大栅格数目。
若满足公式(2-1),N-Nraw-1称为N的连续栅格;
式中(N-Nraw-1)N表示N-Nraw-1是N的连续的相邻栅格,其条件是N-Nraw和N-1至少有一个为自由栅格,即它们的属性为0,且N-Nraw-1必须为自由栅格。
同理,式(2-2)(2-3)(2-4)(2-5)表明其它相邻的七个栅格称为N的连续的相邻栅格的条件。
图2.1连续的相邻栅格定义
(2-1)
(2-2)
(2-3)
(2-4)
(2-5)
设栅格环境为Ù
,栅格总数为n,假定种群中个体数目为pop_size。
第t代的第i条染色体表示为
,
;
每条染色体由m个实数构成,染色体
可以表示成m维的行向量即
这样第t代的种群Xt可以表示为一个向量集
。
机器人的起点“Nstart”,终点“Ngoal”,“Nstart”和“Ngoal”为整数。
分别代表起点和目标所在栅格的代码。
下面讨论初始种群产生步骤:
Step1:
确定染色体的条数即确定种群大小pop_size
Step2:
确定染色体的起始和末尾基因:
由于机器人路径规划的任务是从确定的起点到确定的终点。
因此,可以将机器人的起点Nstart始终作为染色体的第一个基因,终点Ngoal始终作为染色体的最后一个基因,即
=Nstart,
=Ngoal这样可以缩小遗传算法的搜索空间。
Step3:
确定起点到终点的一组染色体大小为pop_size:
Step3-1:
确定起点到终点的第一条染色体:
从Nstart开始,根据连续的相邻栅格原则,从与之相邻的八个栅格中,选取一个自由栅格作为此染色体的第二个基因;
然后从围绕第二个基因的八个基因中,选取一个自由栅格作为此染色体的第三个基因;
依此类推,直到Ngoal为止;
选取原则有两个:
一是该栅格的代码与已有的代码不重复(不重复原则),见公式(2-6);
二是即将选取的栅格到目标栅格的距离d(Nnew,Ngoal)最短,见公式(2-7):
(2-6)
(2-7)
Step3-2:
确定起点到终点的第i条染色体(1<
i<
pop_size)。
在起点“Nstart”到终点“Ngoal”之间,随机插入i-1个“1—n-1”之间的整数(不包含起点Nstart和终点Ngoal),将这i-1个整数按距离起点Nstart的远近排序,距Nstart越近,排名越靠前,得到
,因此,得到包括起点和终点在内的不连续栅格序列为
然后将这些不连续的栅格变为连续的栅格,每两个不连续栅格
和
变为连续栅格的方法是满足公式(2-8)所示的A*算法,即栅格Nj,i到所选栅格N的距离
,与栅格N到栅格
的距离
和最短;
另外还要考虑Step3-1的不重复原则,将序列中的断点补齐。
到此为止,第i条染色体形成;
(2-8)
Step3-3:
以此类推共得到pop_size条染色体。
Step4:
在产生染色体过程中,还需要注意一些细节问题。
例如,由于要求基因的无重复性,在Step3-2中产生初始种群时可能陷入死锁,即无法生成连续栅格序列,例如下图所示情况,判断生成种群的死锁方法:
是当前栅格的周围无自由栅格点,而且当前点不是终点;
解决方法是重复执行Step3-2直到成功产生新的染色体。
图2.2无连续栅格情况
2.2适应度函数:
在遗传算法中,个体适应度的大小决定该个体被遗传到下一代群体中的概率,适应度函数的选择在遗传算法中是相当重要的,它是引导遗传算法问题最优解逼近的关键因素。
适应度函数的选取直接影响遗传算法的计算效率和计算时间。
本文的适应度函数取路径长度的倒数。
路径越长,适应度就越小;
路径越短,适应度越大。
这样,适应度越大(路径越短)的个体被淘汰的可能性就越小。
(2-9)
式中eval(Pi)表示染色体的适应值。
f(Pi)表示机器人的目标函数。
机器人路径优化的目标函数可取为机器人行走路径的总长度最短。
设机器人经过的路径为栅格
,则机器人目标函数为:
(2-10)
式中:
Pi为染色体。
Num_Chromosome为染色体长度,
表示第i组染色体中的栅格
到栅格
的距离,可以认为是两栅格中心的距离。
以适应度函数为评价指标,就可以从每代种群中选择优秀的染色体并将它们保存下来。
2.3遗传算子:
2.3.1选择操作:
选择算子也称复制(reproduction)算子,它的作用在于根据个体的优劣程度,保留适应性好的染色体,淘汰适应性差的染色体。
一般地说,通过选择,将保证当前种群中具有较高适应值的个体,以较大的概率通过复制和繁衍,生成新的种群,而适应度小的个体将被淘汰。
本算法采用竞争策略,令交叉产生的子代染色体按适应度优劣进行竞争,从中选出优胜个体进入下一代种群,直到种群充满为止。
下面首先介绍一下转轮法,这是一种正比选择策略,能根据与适值成正比的概率选出新种群,步骤如下:
分别计算每一个染色体的累积概率
(2-11)
式中eval(xk)为第k个染色体适应值,分母为所有适应值的和。
在[0,1]区间随机产生pop_size个均匀分布的伪随机数ri
对每一个ri,若ri小于qi,则从子代染色体中选染色体xi,否则选第k个染色体
,使
成立,作为第i对染色体中的第1个染色体。
Step5:
从第i对染色体中选取适应值高的染色体作为下一代种群的第i个染色体。
Step6:
重复Step3,直到充满种群得到尺寸为pop_size的新种群。
2.3.2交叉算子:
交叉操作是结合来自父代交配种群中的信息产生新的个体,通常有单点交叉、多点交叉、均匀交叉等几种方法。
此处选择单点不等长交叉的方法。
只要两条路径通过相同的栅格,就可以进行交叉。
如果相同的栅格不止一个,则在这些相同的栅格中任选一个进行交叉;
如果没有相同的栅格,则不进行交叉。
用交叉后的子代个体代替原种群中的父代个体,产生新的种群。
这样,有效地避免了染色体中出现新断点和重复栅格。
交叉算子流程:
图2.3交叉运算
FORcross_num=1TOPc﹒pop_sizeBEGIN//按交叉率Pc确定交叉次数并作循环
Pos1←—rand%(pop_size)//在1—pop_size中随机选一个数作为交叉染色体1的位置
Pos2←—rand%(pop_size)//在1—pop_size中随机选一个数作为交叉染色体2的位置
Pos[i]←—samegrid//发现相同栅格将相同点位置存入pos[i],i=1,2,m
i←—rand%(m)//在m个相同点中随机产生一个数作为交叉点
Ppos1CrosswithPpos2atNpos[i]//位置在Pos1和Pos2的染色体在点Npos[i]进行交叉运算
Replacethe2worstchromosomes//新染色体取代两个适应值最差的旧染色体
ENDFOR
2.3.3变异操作:
变异操作是通过随机改变染色体的某些基因来引入新个体,对于增加种群多样性起着关键作用,经过变异的解是否变得更好并不重要。
路径规划中的变异算子,分三种操作方式,即从个体中随机删除一个序号(不包括起始点、终止点序号);
或从个体中随机选取一点,插入一个新序号;
或在个体中随机选取一个序号,用另一个随机产生的序号代替它。
显然,这三种变异算子都有可能产生间断路径。
通过实验,我们发现可行路径变异后所得到的新路径为不可行路径。
本章提出一种新的变异算子,让系统不断增加新的染色体,并能保持与次优解接近。
具体方法是按变异率Pm从种群中选取pop_size*Pm个优秀染色体;
在每一个染色体中,随机抽取k个不连续基因,将这k个基因和染色体的起点和终点,构成一个染色体的基本构架。
然后按照2.1节所述的距离最短原则和不重复原则,使之连续化,形成新的染色体,并以之取代种群中适应值最差的pop_size*Pm个染色体。
图3以k=1为例描述了变异运算:
图2.4变异运算
2.4终止条件:
本章采取最佳适值过半原则,它的含义是当种群中一半以上的染色体达到相同的适应度,且种群的适应值不变,则可以确定染色体的发展方向并将之作为停止条件。
2.5流程
综上所述,机器人在静态环境下路径规划的主要程序框架为:
main
g=draw(m,m)//将机器人工作空间画出栅格
mark=number(m,m)//将栅格编号
S=area(x,y)//将障碍物标识在机器人工作空间中
oldpop=zeros(pop_size,lengthchromosome)//随机生成初始种群
bestpath=ga(oldpath)//采用遗传算法优化生成的路径
plot(x,y)//在机器人工作空间中画出最优路径图
end
3实验仿真
路径规划是寻找满足安全和平滑条件下的最优路径,因此个体的适应度函数值越小,则该路径越好。
为了获得最优路径,根据本文中给出的算法,利用MATLAB分别对交叉率、变异率等参数的不同取值进行了比较选择。