一、简介

路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。路径规划中有静态路径规划以及动态路径规划,本文所讨论的问题仅针对静态路径规划。具体问题描述如下:
给定起点、终点和障碍物等环境信息,如图1.1所示,利用演化计算方法得到最优轨迹,并分析不同参数选择对结果的影响。本文采用遗传算法和模拟退火混合遗传算法进行求解,得到最优路径。
1 遗传算法
1.1 遗传算法原理
遗传算法(Genetic Algorithm,GA)[1]是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法简单、通用,鲁棒性强,适于并行处理。基本遗传算法流程包括种群初始化、选择、交叉、变异等操作,如图1所示。

遗传算法的进化过程从完全随机生成的种群开始,随后逐代向适应度更高的种群进化。在进化的每一代中,整个种群的适应度按照一定规则被评价,基于个体的适应度高低从当前种群中随机选择多个个体,通过个体自然选择和基因突变操作而产生新种群,生成的新种群在算法的下一次迭代中成为当前种群。在遗传算法中,需解决的问题的解通常被成为基因个体,它通常以参数列表的形式进行标示,被称作染色体或基因串。其中染色体通常以编码形式体现,即表达为简单的字符串或数字串[2]。

针对本问题,使用遗传算法求解最优路径需要按照特定规则初始化种群,并且根据问题所给的限定条件设计合适的适应度计算方法。下面的内容会详细说明这两个步骤,而算法中的其他操作,如选择、交叉、变异分别采用经典的轮盘赌、单点交叉和随机变异方法,这里不再赘述。

1.2 编码

1.3 适应度函数
适应度函数要有效反映每一个体与问题的最优个体之间的差距。遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群中每个个体的适应度值来进行搜索。本问题的目标是路径总长度为最短,路径总长度的倒数就可以作为适应度函数:



2 混合遗传算法
为了提高遗传算法运行效率和求解质量,这里引入模拟退火算法的思想,模拟退火(Stimulated Annealing, SA)具有较强的局部寻优能力,并能使搜索过程避免陷入局部最优解[3-4],采用模拟退火遗传算法(Stimulated Annealing Genetic Algorithm,SAGA)求解路径优化问题。
具体来说,模拟退火遗传算法是对适应度函数的改进,在前期(高温)减少个体间的适应度差异,后期(低温)放大个体间适应度差异,突出优秀个体,完成适应度拉伸的作用,在一定程度上弥补了遗传算法在前期容易早熟、后期容易停滞的缺点[5]。具体的适应度值计算公式如式(6)和(7)所示:

二、源代码

%%%%%%模拟退火遗传算法(SAGA)%%%%%%%%%%%clear
%%%设置超参数
p_crs = 0.7;   %交叉概率
p_mut = 0.1;   %变异概率
ratio = 0.5;   %选择操作中父辈的比例
pop_num = 5000;  %种群规模
chrom_len = 7;  %染色体长度,这里代表路线的点数
iteration = 40;
T0 = 100;  %初始温度
A = 0.8;  %退火速度% 一个个体就是一条路线
[x,y]=popinit(pop_num,chrom_len);   %产生初始种群
fit=saga_fitness(x,y, T0);      %计算种群适应度
[bestx0,besty0,fit0]=best(x,y,fit);
d0 = 0; %初始路径长度
for j=1:1:size(bestx0,2)-1d0 = d0 + sqrt((bestx0(1,j+1)-bestx0(1,j)).^2 + ...(besty0(1,j+1)-besty0(1,j)).^2);     %该个体(即路线)的路径长度
endfor i=1:1:iteration           %设置进化代数[Parentx,Parenty]=select(x, y, fit, ratio);      %选择[Kidx,Kidy]=crossover(Parentx,Parenty,p_crs);       %交叉[Kidx,Kidy]=mutation(Kidx,Kidy,p_mut);              %变异x = [Parentx; Kidx];    % 得到新的种群y = [Parentx; Kidy];x(:,chrom_len)=1.5;   % 保留终点y(:,chrom_len)=8.9;T = T0 * A^(i-1);  % 当前温度fit = saga_fitness(x,y,T);   % 计算进化后的适应度[bestx,besty,bestfit]=best(x,y,fit);   %选择每一代中的最佳个体route_x(i,:)=bestx;                     %保存该最佳个体route_y(i,:)=besty;route_fit(i)=bestfit;for j=1:1:size(bestx,2)-1dd(j)=sqrt((bestx(1,j+1)-bestx(1,j)).^2 + ...(besty(1,j+1)-besty(1,j)).^2);     %该个体(即路线)的路径长度endd(i) = sum(dd);   %有问题fprintf('%dth 代进化完成...\n', i)
%     plot(bestx,besty,'r-');
end
route_fit = [fit0, route_fit];   %加上初始种群中最优个体
route_x = [bestx0; route_x];
route_y = [bestx0; route_y];
d = [d0, d];[final_fit,idx]=max(route_fit);            %所有代中的的最佳路线
final_routex=route_x(idx,:);
final_routey=route_y(idx,:);
final_distance = min(d)             %最佳路径长度%==========画图,可视化路线、进化过程==============
% start point
xs=0;
ys=0;
% Destination
xt=1.5;
yt=8.9;
%obstacle
xobs=[1.5 4.0 1.2];
yobs=[6.5 3.0 1.5];
robs=[1.5 1.0 0.8];
theta=linspace(0,2*pi,100);
max_area = 0;
for k=1:numel(xobs)fill(xobs(k)+robs(k)*cos(theta),yobs(k)+robs(k)*sin(theta),[0.5 0.7 0.8]);  % 后一个参数表示RGB值text(xobs(k), yobs(k), num2str(k))hold on;
end
plot(xs,ys,'bs','MarkerSize',12,'MarkerFaceColor','y');
plot(xt,yt,'kp','MarkerSize',16,'MarkerFaceColor','g');
grid on;
hold on;
%====================================
%%输入参数:种群——x,y横纵坐标
%%输出参数:种群中每个个体的适应度值
%%说明:
%     逐个计算种群中个体的适应度值,判断该个体所连成线路与圆形障碍物之间的关系,
%     将满足条件的路径的距离倒数作为适应度值
%====================================function fitval=fitness(x,y)%obstaclexobs=[1.5 4.0 1.2];yobs=[6.5 3.0 1.5];robs=[1.5 1.0 0.8];[n, xn] = size(x);for i=1:1:ncnt_line = 0;  %记录穿过障碍物的线段数%%拆分相邻的两个点,便于后续计算for m=1:1:xn-1x1(m)=x(i,m);y1(m)=y(i,m);endfor n=2:1:xnx2(n-1)=x(i,n);y2(n-1)=y(i,n);end%%判断线段与障碍物的关系for m = 1:size(x1,2)A = y2(m) - y1(m);B = x1(m) - x2(m);C = y1(m)*(x2(m)-x1(m)) - x1(m)*(y2(m)-y1(m));for ii = 1:3if ((x1(m)-xobs(ii))^2 + (y1(m)-yobs(ii))^2) < robs(ii)^2 || ((x2(m)-xobs(ii))^2 + (y2(m)-yobs(ii))^2) < robs(ii)^2% disp('有点在圆内')cnt_line = cnt_line + 1;continue;else            d = abs(A*xobs(ii)+B*yobs(ii)+C) / sqrt(A^2+B^2);if d==0d1 = (xobs(ii)-x1(m))^2 + (yobs(ii)-y1(m))^2;d2 = (x2(m)-x1(m))^2 + (y2(m)-y1(m))^2;if d1 < d2cnt_line = cnt_line + 1;   % 该线段过圆心且穿过圆endelseif d < robs(ii)cos1 = (x2(m)-x1(m))*(xobs(ii)-x1(m)) + (y2(m)-y1(m))*(yobs(ii)-y1(m));cos2 = (x1(m)-x2(m))*(xobs(ii)-x2(m)) + (y1(m)-y2(m))*(yobs(ii)-y2(m));if cos1>0 && cos2>0cnt_line = cnt_line + 1;    % 该线段与圆交与两点endelsecontinue;endendendend

三、运行结果






四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【路径规划】基于matlab模拟退火优化遗传算法求解避障路径规划问题【含Matlab源码 889期】相关推荐

  1. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  2. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  3. 【Matlab树叶分类】BP神经网络植物叶片分类【含GUI源码 916期】

    一.代码运行视频(哔哩哔哩) [Matlab树叶分类]BP神经网络植物叶片分类[含GUI源码 916期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  4. 【Matlab水果蔬菜识别】形态学水果蔬菜识别【含GUI源码 919期】

    一.代码运行视频(哔哩哔哩) [Matlab水果蔬菜识别]形态学水果蔬菜识别[含GUI源码 919期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅. ...

  5. 【Matlab青草识别】形态学马唐草+牛筋草识别【含GUI源码 908期】

    一.代码运行视频(哔哩哔哩) [Matlab青草识别]形态学马唐草+牛筋草识别[含GUI源码 908期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  6. 【Matlab限速标志识别】形态学限速标志识别【含GUI源码 1142期】

    一.代码运行视频(哔哩哔哩) [Matlab限速标志识别]形态学限速标志识别[含GUI源码 1142期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  7. MATLAB实现遗传算法、模拟退火遗传算法求解避障路径规划问题——计算智能作业

    文章目录 一.问题描述 二.遗传算法设计 2.1 算法原理 2.2 编码 2.2 适应度函数 2.3 混合遗传算法 三.实验结果及分析 四.总结 参考文献 MATLAB代码 主程序 相关函数 一.问题 ...

  8. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  9. 【微电网优化】基于matlab粒子群算法求解综合能源系统优化问题【含Matlab源码 1969期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[微电网优化]基于matlab粒子群算法求解综合能源系统优化问题[含Matlab源码 1969期] 点击上面蓝色字体,直接付费下载,即可. ...

  10. 【路径规划】基于matlab DWA算法机器人局部避障路径规划【含Matlab源码 890期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[路径规划]基于matlab DWA算法机器人局部避障路径规划[含Matlab源码 890期] 获取代码方式2: 通过订阅紫极神光博客付费 ...

最新文章

  1. 实探全球第九大超算中心:温水冷却节能30% 正寻求新突破
  2. linux信号使用,linux信号使用注意事项
  3. android版多功能日历,欢迎大家测试
  4. JAVA程序设计----数组基础
  5. 24/100. Linked List Cycle
  6. 结构体的传参理解成员的存储方式
  7. 可以进行单元测试么_为什么程序员都讨厌写单元测试?有一个词叫“相爱相杀”!...
  8. android 视频恢复软件,视频恢复软件免费版
  9. Java并发编程-synchronized锁优化
  10. 4-2cglib 动态代理
  11. 系统学习数字图像处理之灰度变换和空域滤波
  12. 微信小程序点击事件绑定及传参详解
  13. 局域网如何设置服务器
  14. 《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理
  15. 使用代理ip会导致网络卡顿吗?
  16. 郭德纲 相声下载(续)
  17. cpu倍频模式怎么调_CPU超频详细设置图文教程 CPU怎么超频
  18. 阿里笔试--智能对话简化版之query指令槽位识别
  19. idea如何全局搜索关键字_intellij idea 怎么全局搜索
  20. xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新

热门文章

  1. HBase集成(准备篇)
  2. Problem 1036 四塔问题
  3. 服务器电源常见故障判断及处理方法
  4. 新增四则运算用户选择功能小程序
  5. ASP操作XML文件的主要方法和实现
  6. 『号外』 排名进入2000!再创佳绩!
  7. 190418每日一句
  8. Atitit 组织软资产建设 知识管理 经济学架构体系
  9. Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
  10. paip.c#.net托盘图标的建立使用总结