新浪博客

基于MAKLINK图论的遗传算法二维路径规划MATLAB源码

2019-10-31 09:02阅读:
首先先看程序的结果图
基于MAKLINK图论的遗传算法二维路径规划MATLAB源码

这个课题一共有3块:建立MAKLINK二维路径的规划空间模型2利用Dijkstra算法求得一个较优路径3基于上述求得的较优路径利用遗传算法求最优路径
1. 建立MAKLINK模型(需要的数据:障碍物顶点坐标,顶点连接序号,连线中点相连矩阵)
首先要对自己的环境进行抽象,得到障碍物的位置与尺寸,然后建立MAKLINK图。
而很多人不知道MAKLINK图是怎样建立的,那么你首先要知道它的定义:MAKLINK线定义为两个障碍物之间不与障碍物相交的顶点连线,以及障碍物顶点与边界相交的连线。
解释:连线是任意两个障碍物顶点之间的连线,但要保证这个连线不能与障碍物相交。再一个就是障碍物与边界的连线。
其实在实际应用
中可以对这个定义进行稍微调整,即模型中的连线必须符合上述定义,但是并不是说只要符合上述定义的线我们都要画。因为会有一些线比较相近,我们都画出来的意义不大。
所以你需要的数据有:障碍物各个顶点坐标,根据障碍物顶点坐标得到的图
基于MAKLINK图论的遗传算法二维路径规划MATLAB源码
障碍物图画好后,此时需要对障碍的顶点之间进行连线,这个时候需要的数据为:连线的两个顶点为一组序号,有多少条连线就有多少组序号。

得到上述障碍物顶点的连线后,相邻的连线中点则构成一条路径。而哪些连线中点进行连接是由我们自己设定的,这时需要的数据为一个矩阵,1表示两连线中点相连,0表示两连线中点不相连。可以得到下图。
基于MAKLINK图论的遗传算法二维路径规划MATLAB源码
得到上述路径图后,遍可以进行Dijkstra路径规划了
2. Dijkstra路径规划
进行Dijkstra路径规划其实就是上述第三步中得到连线中点的连线进行路径规划,此时需要的数据就是连线中点的坐标,中点连接矩阵(0表示不相连,1表示相连)。
关于Dijkstra路径规划具体是怎么做的,这个可参考其他博客,这是个很经典的问题,其他博客中有很详细的介绍。在此不做赘述。
得到的路径规划图如下
基于MAKLINK图论的遗传算法二维路径规划MATLAB源码

3. 遗传算法路径规划
我们对这个问题进行回顾,这个问题是先进行Dijkstra路径规划再进行遗传算法规划的,而Dijkstra进行路径规划时的路径是由连线中点构成的。得到的Dijkstra最优路径也是由中点连线构成的路径。所以再用遗传算法进行路径优化时,其实是在改边连线点的位置(之前是中点的连线),即现在不再是中点的连线了,而是某个点的连线,具体是哪个点我们需要用遗传算法求出来。因此基于上述工作,我们编写遗传算法程序求得点的位置。
%%%% 遗传算法求图论二维路径规划(先Dijkstra)
%%%% by 圆 一个有心的人在用心做事
%%%% 2019-08-01
%%%% 如有问题请联系 QQ530807088(已满)/3171304690 新浪微博:MATLAB圆创工作室
% ======================= 高 端 定 制 · 华 丽 分 割 ======================
clc
clear
close all
%% 输入数据
data = xlsread('数据.xlsx',1);
L = xlsread('数据.xlsx',2);
sign = xlsread('数据.xlsx',3);
sign(isnan(sign)) = 0;
position = data(:,1:2);
tag = data(:,3);
% 起点和终点
S = [20,180];
T = [160,90];
%% 绘图
figure
plot([0,200],[0,200],'.');
box on
hold on
xlabel('m')
ylabel('m')
title('遗传算法二维空间路径规划')
% 绘制障碍
NB = length(unique(tag)); % 障碍物数量
for i = 1 : NB
id = find(tag == i);
fill(position(id,1),position(id,2),[0,0,0]);
hold on
end
% 绘制起点终点
plot([S(1),T(1)],[S(2),T(2)],'r.');
text(S(1) + 2,S(2),'S');
text(T(1) + 2,T(2),'T');
% 描绘线及中点
mid = zeros(size(L)); % 所有连线中点的位置
for i = 1 : size(L,1)
% 障碍物顶点(包括边界交点)连线
plot([position(L(i,1),1),position(L(i,2),1)], [position(L(i,1),2),position(L(i,2),2)],'b--');
% 连线中点
mid(i,:) = (position(L(i,1),:) + position(L(i,2),:)) / 2;
plot(mid(i,1),mid(i,2),'rx');
text(mid(i,1)+2,mid(i,2),strcat('v',num2str(i)));
end
% 描绘可行路径
m = size(sign,1);
mid = [S; mid; T];
for i = 1:m
for j = i+1 : m
% 中点与中点相连
if sign(i,j) == 1
plot([mid(i,1),mid(j,1)],[mid(i,2),mid(j,2)],'color','black','Linewidth',2,'LineStyle','-');
end
end
end
% 计算距离
W = ones(size(sign))*10000;
for i = 1 : m
for j = 1 : m
if sign(i,j) == 1
W(i,j) = sqrt(sum((mid(i,:) - mid(j,:)).^2));
end
end
end
[distance,path] = DijkstraPlan(W,1,m);
plot(mid(path,1),mid(path,2),'color','yellow','LineWidth',2,'LineStyle','--');
Pmid = path;
Pmid(end) = [];
Pmid(1) = [];
Pmid = Pmid - 1; % Dijkstra路径经过的中点序号
dim = length(Pmid);
%% 经过中点的两端点
lines = zeros(dim, 4);
for i = 1 : dim
lines(i,1:2) = position(L(Pmid(i),1),:); % 中点的端点1
lines(i,3:4) = position(L(Pmid(i),2),:); % 中点的端点2
end
K = 10; % 线段10等分
%% 遗传算法
NP= 50; % 种群大小
maxgen = 100; % 最大进化代数
Pc= 0.8; % 交叉概率
Pm= 0.2; % 变异概率
Gap= 0.9; % 代沟(Generation gap)
%% 初始化种群
X = zeros(NP,dim);
for i = 1 : NP
X(i,:) = randi(K, 1, dim);
end
%% 遗传进化
gen=1;
for i = 1 : NP
Fx(i) = Fitness(X(i,:),lines,K,S,T); % 计算目标函数值
end
bestLength = min(Fx);
while gen <= maxgen
gen
% 记录各代最优值
bestLength = min(Fx);
FG(gen) = bestLength; % 各代最短路径
% 计算适应度
fit = 1./(Fx+1); % 将求最短路径转为最大值fit
% 选择
XSel = Select(X,fit,Gap);
% 交叉操作
XSel = Cross(XSel,Pc);
% 变异
XSel = Mutate(XSel,Pm,K);
% 重插入子代的新种群
X = Reins(X,XSel,fit);
% 计算路线长度
for i = 1 : NP
Fx(i) = Fitness(X(i,:),lines,K,S,T); % 计算路线长度
end
% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
[minLength,minInd]=min(Fx);
gbest = X(minInd,:);
%%
for i = 1 : dim
Px(i,:) = lines(i,1:2) + gbest(i) / K * (lines(i,3:4) - lines(i,1:2));
end
P = [S; Px; T]; % 最优路径经过的点坐标
figure(1)
plot(P(:,1),P(:,2),'r-.','LineWidth',3)
figure(2)
plot(FG,'b-')
xlabel('迭代次数')
ylabel('路径长度')

title('遗传算法优化迭代曲线')

我的更多文章

下载客户端阅读体验更佳

APP专享