一、遗传算法及栅格地图简介

1.1 引言


1.2 遗传算法理论
1.2.1 遗传算法的生物学基础


1.2.2 遗传算法的理论基础




1.2.3 遗传算法的基本概念






1.2.4 标准的遗传算法


1.2.5 遗传算法的特点


1.2.6 遗传算法的改进方向

1.3 遗传算法流程



1.4 关键参数说明

2 栅格地图
2.1 栅格法应用背景
路径规划时首先要获取环境信息, 建立环境地图, 合理的环境表示有利于建立规划方法和选择合适的搜索算法,最终实现较少的时间开销而规划出较为满意的路径。一般使用栅格法在静态环境下建立环境地图。
2.2 栅格法实质
将AGV的工作环境进行单元分割, 将其用大小相等的方块表示出来,这样栅格大小的选取是影响规划算法性能的一个很重要的因素。栅格较小的话,由栅格地图所表示的环境信息将会非常清晰,但由于需要存储较多的信息,会增大存储开销,同时干扰信号也会随之增加,规划速度会相应降低,实时性得不到保证;反之,由于信息存储量少,抗干扰能力有所增强,规划速随之增快,但环境信息划分会变得较为模糊,不利于有效路径的规划。在描述环境信息时障碍物所在区域在栅格地图中呈现为黑色,地图矩阵中标为1,可自由通行区域在栅格地图中呈现为白色,地图矩阵中标为0。路径规划的目的就是在建立好的环境地图中找到一条最优的可通行路径,所以使用栅格法建立环境地图时,栅格大小的合理设定非常关键。
2.3 10乘10的静态环境地图

10乘10的静态环境地图代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立环境地图%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function DrawMap(map)
n = size(map);
step = 1;
a = 0 : step :n(1);
b = 0 : step :n(2);
figure(1)
axis([0 n(2) 0 n(1)]); %设置地图横纵尺寸
set(gca,'xtick',b,'ytick',a,'GridLineStyle','-',...
'xGrid','on','yGrid','on');
hold on
r = 1;
for(i=1:n(1))         %设置障碍物的左下角点的x,y坐标for(j=1:n(2))if(map(i,j)==1)p(r,1)=j-1;p(r,2)=i-1;fill([p(r,1) p(r,1) + step p(r,1) + step p(r,1)],...[p(r,2) p(r,2) p(r,2) + step p(r,2) + step ],'k');r=r+1;hold onendend
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%栅格数字标识%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x_text = 1:1:n(1)*n(2); %产生所需数值.
for i = 1:1:n(1)*n(2)[row,col] = ind2sub([n(2),n(1)],i);text(row-0.9,col-0.5,num2str(x_text(i)),'FontSize',8,'Color','0.7 0.7 0.7');
end
hold on
axis square

建立环境矩阵,1代表黑色栅格,0代表白色栅格,调用以上程序,即可得到上述环境地图。

map=[0 0 0 1 0 0 1 0 0 0;1 0 0 0 0 1 1 0 0 0;0 0 1 0 0 0 1 1 0 0;0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 1 0 0 1 0;1 0 0 0 0 1 1 0 0 0;0 0 0 1 0 0 0 0 0 0;1 1 1 0 0 0 1 0 0 0;0 0 0 0 0 1 1 0 0 0;0 0 0 0 0 1 1 0 0 0;];DrawMap(map);         %得到环境地图

2.4 栅格地图中障碍栅格处路径约束
移动体栅格环境中多采用八方向的移动方式,此移动方式在完全可通行区域不存在运行安全问题,当
移动体周围存在障碍栅格时此移动方式可能会发生与障碍物栅格的碰撞问题,为解决此问题加入约束
条件,当在分别与障碍物栅格水平方向和垂直方向的可行栅格两栅格之间通行时,禁止移动体采用对
角式移动方式。


约束条件的加入,实质是改变栅格地图的邻接矩阵,将障碍栅格(数字为“1”的矩阵元素)的对角栅格
设为不可达, 即将对角栅格的距离值改为无穷大。其实现MATLAB代码如下:
代码:

%约束移动体在障碍栅格对角运动
%通过优化邻接矩阵实现
%%%%%%%%%%%%%%%%%% 约束移动体移动方式 %%%%%%%%%%%%%%%%%
function W=OPW(map,W)
% map 地图矩阵  % W 邻接矩阵
n = size(map);
num = n(1)*n(2);
for(j=1:n(1))for(z=1:n(2))if(map(j,z)==1)if(j==1)                  %若障碍物在第一行if(z==1)               %若障碍物为第一行的第一个W(j+1,j+n(2)*j)=Inf;W(j+n(2)*j,j+1)=Inf;elseif(z==n(2))         %若障碍物为第一行的最后一个W(n(2)-1,n(2)+n(1)*j)=Inf;W(n(2)+n(1)*j,n(2)-1)=Inf;else                %若障碍物为第一行的其他W(z-1,z+j*n(2))=Inf;W(z+j*n(2),z-1)=Inf;W(z+1,z+j*n(2))=Inf;W(z+j*n(2),z+1)=Inf;endendendif(j==n(1))               %若障碍物在最后一行if(z==1)               %若障碍物为最后一行的第一个W(z+n(2)*(j-2),z+n(2)*(j-1)+1)=Inf;W(z+n(2)*(j-1)+1,z+n(2)*(j-2))=Inf;elseif(z==n(2))            %若障碍物为最后一行的最后一个W(n(1)*n(2)-1,(n(1)-1)*n(2))=Inf;W((n(1)-1)*n(2),n(1)*n(2)-1)=Inf;else                   %若障碍物为最后一行的其他W((j-2)*n(2)+z,(j-1)*n(2)+z-1)=Inf;W((j-1)*n(2)+z-1,(j-2)*n(2)+z)=Inf;W((j-2)*n(2)+z,(j-1)*n(2)+z+1)=Inf;W((j-1)*n(2)+z+1,(j-2)*n(2)+z)=Inf;endendendif(z==1)              if(j~=1&&j~=n(1))       %若障碍物在第一列非边缘位置 W(z+(j-2)*n(2),z+1+(j-1)*n(2))=Inf;W(z+1+(j-1)*n(2),z+(j-2)*n(2))=Inf;W(z+1+(j-1)*n(2),z+j*n(2))=Inf;W(z+j*n(2),z+1+(j-1)*n(2))=Inf;endendif(z==n(2))if(j~=1&&j~=n(1))         %若障碍物在最后一列非边缘位置 W((j+1)*n(2),j*n(2)-1)=Inf;W(j*n(2)-1,(j+1)*n(2))=Inf;W(j*n(2)-1,(j-1)*n(2))=Inf;W((j-1)*n(2),j*n(2)-1)=Inf;endendif(j~=1&&j~=n(1)&&z~=1&&z~=n(2))   %若障碍物在非边缘位置W(z+(j-1)*n(2)-1,z+j*n(2))=Inf;W(z+j*n(2),z+(j-1)*n(2)-1)=Inf;W(z+j*n(2),z+(j-1)*n(2)+1)=Inf;W(z+(j-1)*n(2)+1,z+j*n(2))=Inf;W(z+(j-1)*n(2)-1,z+(j-2)*n(2))=Inf;W(z+(j-2)*n(2),z+(j-1)*n(2)-1)=Inf;W(z+(j-2)*n(2),z+(j-1)*n(2)+1)=Inf;W(z+(j-1)*n(2)+1,z+(j-2)*n(2))=Inf;endendendend
end

2.5 栅格法案例
下面以Djkstra算法为例, 其实现如下:

map=[0 0 0 1 0 0 1 0 0 0;1 0 0 0 0 1 1 0 0 0;0 0 1 0 0 0 1 1 0 0;0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 1 0 0 1 0;1 0 0 0 0 1 1 0 0 0;0 0 0 1 0 0 0 0 0 0;1 1 1 0 0 0 1 0 0 0;0 0 0 0 0 1 1 0 0 0;0 0 0 0 0 1 1 0 0 0;];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立环境矩阵map%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DrawMap(map); %得到环境地图
W=G2D(map);   %得到环境地图的邻接矩阵
W(W==0)=Inf;  %邻接矩阵数值处理
W=OPW(map,W); %优化邻接矩阵
[distance,path]=dijkstra(W,1,100);%设置起始栅格,得到最短路径距离以及栅格路径
[x,y]=Get_xy(distance,path,map);   %得到栅格相应的x,y坐标
Plot(distance,x,y);   %画出路径

运行结果如下:

其中函数程序:
DrawMap(map) 详见建立栅格地图
W=G2D(map) ; 详见建立邻接矩阵
[distance, path] =dijkstra(W, 1, 100) 详见Djk stra算法
[x, y] =Get_xy(distance, path, map) ;
Plot(distance, x, y) ;

三、部分源代码

% 基于遗传算法的栅格法机器人路径规划
clc;
clear all
close all;
% 输入数据,即栅格地图
G=  [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0;0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0;0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 0 0;0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0;0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0;0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0;0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0;0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0;0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0;0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0;0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0;0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
​
p_start = 0;    % 起始序号
p_end =399;    % 终止序号
NP = 200;      % 种群数量
max_gen = 2000;  % 最大进化代数
pc = 0.5;      % 交叉概率
pm = 0.5;      % 变异概率
a = 1;         % 路径长度比重
b = 7;         % 路径顺滑度比重
%init_path = [];
z = 1;
new_pop1 = {}; % 元包类型路径
[y, x] = size(G);
% 起点所在列(从左到右编号1.2.3...)
xs = mod(p_start, x) + 1;
% 起点所在行(从上到下编号行1.2.3...)
ys = fix(p_start / x) + 1;
% 终点所在列、行
xe = mod(p_end, x) + 1;
ye = fix(p_end / x) + 1;
​
% 种群初始化step1,必经节点,从起始点所在行开始往上,在每行中挑选一个自由栅格,构成必经节点
pass_num = ye - ys + 1;
pop = zeros(NP, pass_num);
min_value=1000;
for i = 1 : NPpop(i, 1) = p_start;j = 1;% 除去起点和终点for yk = ys+1 : ye-1j = j + 1;% 每一行的可行点can = [];for xk = 1 : x% 栅格序号no = (xk - 1) + (yk - 1) * x;if G(yk, xk) == 0% 把点加入can矩阵中can = [can no];endendcan_num = length(can);% 产生随机整数index = randi(can_num);% 为每一行加一个可行点pop(i, j) = can(index);endpop(i, end) = p_end;%pop% 种群初始化step2将上述必经节点联结成无间断路径single_new_pop = generate_continuous_path(pop(i, :), G, x);%init_path = [init_path, single_new_pop];if ~isempty(single_new_pop)new_pop1(z, 1) = {single_new_pop};z = z + 1;end
end
​
% 计算初始化种群的适应度
% 计算路径长度
path_value = cal_path_value(new_pop1, x);
% 计算路径平滑度
path_smooth = cal_path_smooth(new_pop1, x);
fit_value = a .* path_value .^ -1 + b .* path_smooth .^ -1;
​
mean_path_value = zeros(1, max_gen);
min_path_value = zeros(1, max_gen);
% 循环迭代操作
for i = 1 : max_gen% 选择操作new_pop2 = selection(new_pop1, fit_value);% 交叉操作new_pop2 = crossover(new_pop2, pc);% 变异操作new_pop2 = mutation(new_pop2, pm, G, x);% 更新种群new_pop1 = new_pop2;% 计算适应度值% 计算路径长度path_value = cal_path_value(new_pop1, x);% 计算路径平滑度path_smooth = cal_path_smooth(new_pop1, x);fit_value = a .* path_value .^ -1 + b .* path_smooth .^ -1;mean_path_value(1, i) = mean(path_value);[~, m] = max(fit_value);if  min(path_value)<min_valuemin_value=min(path_value);min_path_value(1, i) = min(path_value);else min_path_value(1, i) = min_value;end
end
% 画每次迭代平均路径长度和最优路径长度图
figure(1)
plot(1:max_gen,  mean_path_value, 'r')
hold on;
title(['a = ', num2str(a)', ',b = ',num2str(b)','的优化曲线图']);
xlabel('迭代次数');
ylabel('路径长度');
plot(1:max_gen, min_path_value, 'b')
legend('平均路径长度', '最优路径长度');
min_path_value(1, end)
% 在地图上画路径
[~, min_index] = max(fit_value);
min_path = new_pop1{min_index, 1};
figure(2)
hold on;
title(['a = ', num2str(a)', ',b = ',num2str(b)','遗传算法机器人运动轨迹']);
xlabel('坐标x');
ylabel('坐标y');
DrawMap(G);
[~, min_path_num] = size(min_path);
for i = 1:min_path_num% 路径点所在列(从左到右编号1.2.3...)x_min_path(1, i) = mod(min_path(1, i), x) + 1;% 路径点所在行(从上到下编号行1.2.3...)y_min_path(1, i) = fix(min_path(1, i) / x) + 1;
end
hold on;
plot(x_min_path, y_min_path, 'r')

四、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
《智能优化算法及其MATLAB实例(第2版)》包子阳 余继周 杨杉著 电子工业出版社

【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 022期】相关推荐

  1. 【A_star二维路径规划】基于matlab A_star算法无人机二维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】

    ⛄一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[A_star二维路径规划]基于matlab A_s ...

  2. 【生产优化】基于matlab遗传算法求解帐篷工序问题【含Matlab源码 2145期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [生产优化]基于matlab遗传算法求解帐篷工序问题[含Matlab源码 2145期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【ELM分类】基于matlab遗传算法优化ELM神经网络数据分类【含Matlab源码 2138期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab遗传算法优化ELM神经网络数据分类[含Matlab源码 2138期] 点击上面蓝色字体,直接付费下载,即可. ...

  4. 【LSSVM分类】基于matlab遗传算法优化LSSVM烟叶识别【含Matlab源码 1944期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab鲸鱼算法优化核极限学习机数据分类[含Matlab源码 2012期] 获取代码方式2: 付费专栏Matlab智 ...

  5. 【路径规划】基于matlab A_star算法机器人动态避障【含Matlab源码 2571期】

    ⛄一.A_star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标 ...

  6. 【优化求解】基于matlab遗传算法求解仓库货位优化问题【含Matlab源码 022期】

    一.遗传算法仓库货位简介(仅供参考) 1 引言 随着电力企业生产规模的不断扩大,传统模式下的仓库管理模式由于利用率较低等问题已经不能很好地胜任电力企业仓储管理的需要.自动化立体仓库又称为自动仓储,极大 ...

  7. 【多式联运】基于matlab粒子群结合遗传算法求解陆海空多式联运问题【含Matlab源码 1963期】

    一.联运运输简介 1 引言 随着全球经济一体化进程的加快, 产业供应链变得越来越复杂, 运输网络变得越来越广泛, 货物运输需求也发生了变化---以顾客需求为中心的方便.快捷.高效.低价的货物运输已成为 ...

  8. 【多式联运】基于matlab粒子群结合遗传算法求解陆海空多式联运问题【含Matlab源码 2061期】

    一.联运运输简介 1 引言 运输问题(Transportation Problem)是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的合理调度 ...

  9. 【指派问题】基于matlab遗传算法求解指派优化问题【含Matlab源码 2292期】

    ⛄一.遗传算法求解指派优化问题简介 1 遗传算法 1.1 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法,它是一种多学科融合交叉的产物.遗传算法通过 ...

  10. 【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】

    ⛄一.物流选址简介 1 引言 配送中心是物流系统网络中的关键节点和重要的基础设施,在整个物流系统网络规划中起着枢纽性的作用[1].快递物流配送中心选址是指在具有若干个发件网点或者若干个收件网点的物流配 ...

最新文章

  1. 浮点数内存表示---记录一道题目
  2. 定积分证明题例题_第二十天(20,11,27):积分中值定理
  3. 电脑销售技巧_汝州市,如何查询楼盘详细销售数据?官方公布,精确到房间
  4. ECMAScript6入门教程(二)
  5. 服务器运维一般的故障率,服务器平均故障率
  6. 语音交互设备 前端信号处理技术和语音交互过程介绍
  7. idea tomcat启动成功但是访问方面都是404_IDEA相关配置【集成Tomcatamp;项目部署】...
  8. 有道词典 Chrome取词插件
  9. 人脸关键点定位:300W数据集
  10. 上传git编译失败回退
  11. 微信小程序里面嵌套的h5使用微信sdk配置踩坑
  12. python每个if条件后面都要使用冒号_Python基础:条件控制if
  13. java中static什么意思_Java中static的含义和用法
  14. 如何修改非root用户的ulimit -n的值
  15. PHP获取用户浏览器信息
  16. 谈一谈康得新的财务状况、大股东质押与股价走弱的原因
  17. linux命令远程下载文件
  18. pdf to word文件转换器,出自著名的PDF解决方案供应商NitroPDF
  19. C# 取出字符串中的一个字符
  20. Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery

热门文章

  1. Java经典编程题50道之三十二
  2. 深入浅出-iOS函数式编程的实现 响应式编程概念
  3. 所谓的日常 #10 - 勤王室馬騰舉義 報父仇曹操興師
  4. 部署ganglia3.7
  5. ubuntu - sudo in php exec
  6. http://bassistance.de/jquery-plugins/
  7. 190314每日一句
  8. Atitit.月度计划日程表 每月流程表
  9. atitit 英文与中文与阿拉伯文的简化解决方案.docx
  10. Atitit dsl实现(1)------异常的库模式实现  异常的ast结构