MATLAB|【路径规划】基于改进遗传算法的路径规划问题

目录

1 概述

2 运行结果

3 Matlab代码实现 

 4 结论

5 参考文献


1 概述

随着现代社会的发展,越来越多的人投入到人工智能的研究和发展中。而机器人的发展又是人工智能研究的基础。在机器人研究当中最重要的也是最基本的就是其相应的路径规划[1]。路径规划的实质就是在寻找最优路径的过程中,避开所有的障碍物﹐并顺利到达终点的过程2。目前,路径规划的研究方法主要趋向于智能化的算法。这种类型的算法主要有模糊逻辑控制算法、蚁群算法和遗传算法[8-5],其中模糊逻辑控制算法的特点是鲁棒性特别好﹐能够实时控制,而且对环境的依赖性较弱,但模糊规则需要结合人工经验及其他方法共同制定,影响算法的性能[8]。蚁群算法是根据蚂蚁留下的信息多少来找出一条最优的路径,这种算法需要存储很多信息,在搜索过程中很容易出现混乱或停滞,导致算法不精确[4。而遗传算法具有全局搜索的能力,计算量小且具有鲁棒性,大量的实验数据表明,传统的遗传算法在求解的过程中,精度较差,稳定性也不好。本文基于改进遗传算法求解路径规划问题,用Matlab代码实现。

2 运行结果

 

3 Matlab代码实现 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:交叉函数
%%入口参数:初始种群    交叉概率
%%出口参数:新种群
%%说明:
    %%通过随机数的方式决定某一种族是否交叉。 rand<pc
    %%交叉方式,随机产生一个在基因数量范围内的整数,作为交叉开始点,与下一种群进行单点交叉。
    %%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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<pc% && (D(i)<maxd || D(i+1)<maxd )
cpoint=round(rand*py);
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<pc
    %%交叉方式,随机产生一个在基因数量范围内的整数,作为交叉开始点,与下一种群进行单点交叉。
    %%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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<pc% && (D(i)<maxd || D(i+1)<maxd )
cpoint=round(rand*py);
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<pc
    %%交叉方式,随机产生一个在基因数量范围内的整数,作为交叉开始点,与下一种群进行单点交叉。
    %%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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<pc% && (D(i)<maxd || D(i+1)<maxd )
cpoint=round(rand*py);
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<pc
    %%交叉方式,随机产生一个在基因数量范围内的整数,作为交叉开始点,与下一种群进行单点交叉。
    %%交叉完成之后的种群还必须进行从大到小的排序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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<pc% && (D(i)<maxd || D(i+1)<maxd )
cpoint=round(rand*py);
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
 

 4 结论

改进型遗传算法主要是结合了模拟退火算法,这样可以很好地保证了种群中的个体多样性,改善了基本遗传算法的收敛速度,增强了该算法的全局搜索的能力。实验结果表明该算法具有比较好的收敛能力,能够克服传统遗传算法存在局部最优解的问题,还能够有效地避开障碍物,以较短的路径到达目标点,对后续有关机器人的运动轨迹及相应任务的研究奠定了基础。

5 参考文献

[1]周加全.基于改进遗传算法路径规划问题的研究[J].微型电脑应用,2021,37(11):1-38

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值