目录
1 概述
2 运行结果
3 Matlab代码实现
4 结论
5 参考文献
随着现代社会的发展,越来越多的人投入到人工智能的研究和发展中。而机器人的发展又是人工智能研究的基础。在机器人研究当中最重要的也是最基本的就是其相应的路径规划[1]。路径规划的实质就是在寻找最优路径的过程中,避开所有的障碍物﹐并顺利到达终点的过程2。目前,路径规划的研究方法主要趋向于智能化的算法。这种类型的算法主要有模糊逻辑控制算法、蚁群算法和遗传算法[8-5],其中模糊逻辑控制算法的特点是鲁棒性特别好﹐能够实时控制,而且对环境的依赖性较弱,但模糊规则需要结合人工经验及其他方法共同制定,影响算法的性能[8]。蚁群算法是根据蚂蚁留下的信息多少来找出一条最优的路径,这种算法需要存储很多信息,在搜索过程中很容易出现混乱或停滞,导致算法不精确[4。而遗传算法具有全局搜索的能力,计算量小且具有鲁棒性,大量的实验数据表明,传统的遗传算法在求解的过程中,精度较差,稳定性也不好。本文基于改进遗传算法求解路径规划问题,用Matlab代码实现。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:交叉函数
%%入口参数:初始种群 交叉概率
%%出口参数:新种群
%%说明:
%%通过随机数的方式决定某一种族是否交叉。 rand
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:交叉函数
%%入口参数:初始种群 交叉概率
%%出口参数:新种群
%%说明:
%%通过随机数的方式决定某一种族是否交叉。 rand
%%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [newx,newy]=crossover(x,y,pc)
[px,py]=size(x);
newx=ones(size(x));
newy=ones(size(y));
D=calfitvalue(x,y);
[maxd,I]=max(D);
for i=1:1:px-1
if rand
newx(i,:)=[x(i,1:cpoint),x(i+1,cpoint+1:py)];
newx(i+1,:)=[x(i+1,1:cpoint),x(i,cpoint+1:py)];
newy(i,:)=[y(i,1:cpoint),y(i+1,cpoint+1:py)];
newy(i+1,:)=[y(i+1,1:cpoint),y(i,cpoint+1:py)];
else
newx(i,:)=x(i,:);
newx(i+1,:)=x(i+1,:);
newy(i,:)=y(i,:);
newy(i+1,:)=y(i+1,:);
end
end
% if rand<0.5
% for i=1:1:px
% x(i,:)=sort(x(i,:));
% % y(i,:)=sort(y(i,:));
% end
% else
% for i=1:1:px
% % x(i,:)=sort(x(i,:));
% y(i,:)=sort(y(i,:));
% end
% end
% for i=1:1:px
% newx(i,:)=sort(newx(i,:));
% newy(i,:)=sort(newy(i,:));
% end
end
完整代码:基于改进遗传算法的路径规划问题
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:交叉函数
%%入口参数:初始种群 交叉概率
%%出口参数:新种群
%%说明:
%%通过随机数的方式决定某一种族是否交叉。 rand
%%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [newx,newy]=crossover(x,y,pc)
[px,py]=size(x);
newx=ones(size(x));
newy=ones(size(y));
D=calfitvalue(x,y);
[maxd,I]=max(D);
for i=1:1:px-1
if rand
newx(i,:)=[x(i,1:cpoint),x(i+1,cpoint+1:py)];
newx(i+1,:)=[x(i+1,1:cpoint),x(i,cpoint+1:py)];
newy(i,:)=[y(i,1:cpoint),y(i+1,cpoint+1:py)];
newy(i+1,:)=[y(i+1,1:cpoint),y(i,cpoint+1:py)];
else
newx(i,:)=x(i,:);
newx(i+1,:)=x(i+1,:);
newy(i,:)=y(i,:);
newy(i+1,:)=y(i+1,:);
end
end
% if rand<0.5
% for i=1:1:px
% x(i,:)=sort(x(i,:));
% % y(i,:)=sort(y(i,:));
% end
% else
% for i=1:1:px
% % x(i,:)=sort(x(i,:));
% y(i,:)=sort(y(i,:));
% end
% end
% for i=1:1:px
% newx(i,:)=sort(newx(i,:));
% newy(i,:)=sort(newy(i,:));
% end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:交叉函数
%%入口参数:初始种群 交叉概率
%%出口参数:新种群
%%说明:
%%通过随机数的方式决定某一种族是否交叉。 rand
%%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [newx,newy]=crossover(x,y,pc)
[px,py]=size(x);
newx=ones(size(x));
newy=ones(size(y));
D=calfitvalue(x,y);
[maxd,I]=max(D);
for i=1:1:px-1
if rand
newx(i,:)=[x(i,1:cpoint),x(i+1,cpoint+1:py)];
newx(i+1,:)=[x(i+1,1:cpoint),x(i,cpoint+1:py)];
newy(i,:)=[y(i,1:cpoint),y(i+1,cpoint+1:py)];
newy(i+1,:)=[y(i+1,1:cpoint),y(i,cpoint+1:py)];
else
newx(i,:)=x(i,:);
newx(i+1,:)=x(i+1,:);
newy(i,:)=y(i,:);
newy(i+1,:)=y(i+1,:);
end
end
% if rand<0.5
% for i=1:1:px
% x(i,:)=sort(x(i,:));
% % y(i,:)=sort(y(i,:));
% end
% else
% for i=1:1:px
% % x(i,:)=sort(x(i,:));
% y(i,:)=sort(y(i,:));
% end
% end
% for i=1:1:px
% newx(i,:)=sort(newx(i,:));
% newy(i,:)=sort(newy(i,:));
% end
end
改进型遗传算法主要是结合了模拟退火算法,这样可以很好地保证了种群中的个体多样性,改善了基本遗传算法的收敛速度,增强了该算法的全局搜索的能力。实验结果表明该算法具有比较好的收敛能力,能够克服传统遗传算法存在局部最优解的问题,还能够有效地避开障碍物,以较短的路径到达目标点,对后续有关机器人的运动轨迹及相应任务的研究奠定了基础。
[1]周加全.基于改进遗传算法路径规划问题的研究[J].微型电脑应用,2021,37(11):1-38