文章目录

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

一、问题描述

路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。路径规划中有静态路径规划以及动态路径规划,本文所讨论的问题仅针对静态路径规划。具体问题描述如下:
给定起点、终点和障碍物等环境信息,如图1.1所示,利用演化计算方法得到最优轨迹,并分析不同参数选择对结果的影响。本文采用遗传算法和模拟退火混合遗传算法进行求解,得到最优路径。

二、遗传算法设计

2.1 算法原理

遗传算法(Genetic Algorithm,GA)[1]是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法简单、通用,鲁棒性强,适于并行处理。基本遗传算法流程包括种群初始化、选择、交叉、变异等操作,如图2.1所示。

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

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

2.2 编码

针对两点间避障路径规划问题,考虑将种群中的每一个个体作为一条路径,个体由一系列坐标点(x,y)(x, y)(x,y)组成,所以个体的染色体长度为坐标点数。为了编程方便,这里将个体的坐标分开存储,得到两个种群PopxPopxPopx和PopyPopyPopy,在进化过程中将两个种群看作一个种群,共同优化。
Popxi=(x1,x2,…,xj),Popyi=(y1,y2,…,yj).Pop{x_i} = ({x_1},{x_2}, \ldots ,{x_j}),Pop{y_i} = ({y_1},{y_2}, \ldots ,{y_j}).Popxi​=(x1​,x2​,…,xj​),Popyi​=(y1​,y2​,…,yj​).

其中PopxiPopx_iPopxi​和PopyiPopy_iPopyi​表示种群中的第i个个体,i∈[1,M]i \in \left[ {1,M} \right]i∈[1,M];xjx_jxj​和yjy_jyj​为个体染色体中的一对编码,表示一个点的横纵坐标,j∈[1,N]j \in \left[ {1,N} \right]j∈[1,N];MMM和NNN分别表示种群数量和染色体长度。

2.2 适应度函数

适应度函数要有效反映每一个体与问题的最优个体之间的差距。遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群中每个个体的适应度值来进行搜索。本问题的目标是路径总长度为最短,路径总长度的倒数就可以作为适应度函数:
Fitness=1∑i=1M−1(xi+1−xi)2+(yi+1−yi)2{\rm{ Fitness }} = \frac{1}{{\sum\limits_{i = 1}^{M - 1} {\sqrt {{{({x_{i + 1}} - {x_i})}^2} + {{({y_{i + 1}} - {y_i})}^2}} } }}Fitness=i=1∑M−1​(xi+1​−xi​)2+(yi+1​−yi​)2​1​

式中,xix_ixi​和yiy_iyi​是种群中第i个个体的坐标;MMM为种群规模。

为了计算距离,需要判断点和两点连线与障碍物的关系,即判断个体染色体的x,yx,yx,y编码对是否在圆形障碍物内,以及相邻编码对所连成的线段是否与圆形障碍物有交点。若存在点(x,y)(x, y)(x,y)不满足上式的条件,则将该个体的适应度置零。
(x−x0)2+(y−y0)2>r2{(x - {x_0})^2} + {(y - {y_0})^2} > {r^2}(x−x0​)2+(y−y0​)2>r2
经过上一步的判断,符合条件的个体编码坐标点都在圆形障碍物外,所以这时判断相邻两坐标点组成的线段与障碍物的关系可分为如图2.2所示的三种情况讨论:

在分情况讨论之前,还需要计算圆心到直线的距离ddd,这是为了区别圆心在直线上的特殊情况。计算公式为:
d=∣Ax0+By0+C∣A2+B2d = \frac{{\left| {A{x_0} + B{y_0} + C} \right|}}{{\sqrt {{A^2} + {B^2}} }}d=A2+B2​∣Ax0​+By0​+C∣​

对于第一种情况和第二种情况,d<rd<rd<r。计算∠OAB\angle OAB∠OAB和∠OBA\angle OBA∠OBA的余弦函数,若都大于0则该线段与圆相交,不符合条件,将该个体的适应度置零。计算公式为:

cos⁡∠OAB=AO→⋅AB→∣AO→∣∣AB→∣>0⇒AO→⋅AB→>0\cos \angle OAB = \frac{{\overrightarrow {AO} \cdot \overrightarrow {AB} }}{{\left| {\overrightarrow {AO} } \right|\left| {\overrightarrow {AB} } \right|}} > 0 \Rightarrow \overrightarrow {AO} \cdot \overrightarrow {AB} > 0cos∠OAB=∣∣∣​AO∣∣∣​∣∣∣​AB∣∣∣​AO⋅AB​>0⇒AO⋅AB>0

对于第三种情况,需要判断BA和BO的距离,d=0d=0d=0。若满足∣BA→∣>∣BO→∣\left| {\overrightarrow {BA} } \right| > \left| {\overrightarrow {BO} } \right|∣∣∣​BA∣∣∣​>∣∣∣​BO∣∣∣​,则证明该线段穿过圆,不符合条件,将该个体的适应度置零。

具体地,计算适应度函数的算法为:

2.3 混合遗传算法

为了提高遗传算法运行效率和求解质量,这里引入模拟退火算法的思想,模拟退火(Stimulated Annealing, SA)具有较强的局部寻优能力,并能使搜索过程避免陷入局部最优解[3-4],采用模拟退火遗传算法(Stimulated Annealing Genetic Algorithm,SAGA)求解路径优化问题。

具体来说,模拟退火遗传算法是对适应度函数的改进,在前期(高温)减少个体间的适应度差异,后期(低温)放大个体间适应度差异,突出优秀个体,完成适应度拉伸的作用,在一定程度上弥补了遗传算法在前期容易早熟、后期容易停滞的缺点[5]。具体的适应度值计算公式如式(6)和(7)所示:
fi=efiT∑i=1MefiT{f_i} = \frac{{{e^{\frac{{{f_i}}}{T}}}}}{{\sum\limits_{i = 1}^M {{e^{\frac{{{f_i}}}{T}}}} }}fi​=i=1∑M​eTfi​​eTfi​​​

T=T0(Ag−1)T = {T_0}({A^{g - 1}})T=T0​(Ag−1)
其中,MMM为种群大小,fif_ifi​为第iii个个体的适应度,ggg为遗传代数,TTT为温度,T0T_0T0​为初始温度,AAA为退火速度(取0.99)。

三、实验结果及分析

本文实验环境为MATLAB2018b,探讨遗传算法的参数设置对结果的影响,比如迭代次数、交叉概率、变异概率,同时比较在相同参数条件下基本遗传算法和混合遗传算法的性能。最后通过可视化结果和路径距离长度来评估算法的准确性与有效性。



四、总结

本次作业通过遗传算法编程求解了障碍物路径规划问题,对于基本遗传算法,探讨了算法中迭代次数、交叉概率和变异概率等参数对优化结果的影响。实验结果表明迭代次数不能设置得过小,否则算法还未收敛,反之则会导致计算资源的浪费;交叉概率和变异概率的大小影响种群的多样性,这两个参数过大会导致震荡,无法收敛,反之会导致优化出现停滞。此外,还将模拟退火的思想引入遗传算法,采用模拟退火遗传算法对本问题进行优化。实验结果证明GA算法更适用于该问题的优化求解,这是由于对该问题的个体坐标点排序和SAGA更强局部搜索能力导致无法使搜索过程进入最有希望的搜索区域共同造成的,同时SAGA较多的参数量也对算法寻优调参带来困难。

参考文献

[1] Holland J H. Genetic algorithms[J]. Scientific american, 1992, 267(1): 66-73.
[2] 王小平, 曹立明. 遗传算法——理论、应用与软件实现[M]. 西安交通大学出版社, 2002.
[3] Kirkpatrick S, Gelatt C D, Vecchi M P. Optimization by simulated annealing[J]. science, 1983, 220(4598): 671-680.
[4] 王雪梅,王义和.模拟退火算法与遗传算法的结合[J].计算机学报,1997(04):381-384.
[5] Sen M K, Datta-Gupta A, Stoffa P L, et al. Stochastic reservoir modeling using simulated annealing and genetic algorithm[J]. SPE Formation Evaluation, 1995, 10(01): 49-56.

MATLAB代码

主程序

GA_main.m

%%%%%%基本遗传算法(GA)%%%%%%%%%%%clear
%%%设置超参数
p_crs = 0.7;   %交叉概率
p_mut = 0.1;   %变异概率
ratio = 0.5;   %选择操作中父辈的比例
pop_num = 5000;  %种群规模
chrom_len = 7;  %染色体长度,这里代表路线的点数
iteration = 40;% 一个个体就是一条路线
[x,y]=popinit(pop_num,chrom_len);   %产生初始种群
fit=fitness(x,y);      %计算种群适应度
[bestx0,besty0,fit0]=best(x,y,fit); for 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;fit = fitness(x,y);   % 计算进化后的适应度[bestx,besty,bestfit]=best(x,y,fit);   %选择每一代中的最佳个体route_x(i,:)=bestx;                     %保存该最佳个体route_y(i,:)=besty;route_fit(i)=bestfit;fprintf('%dth 代进化完成...\n', i)
%     plot(bestx,besty,'r-');
end
route_fit = [fit0, route_fit];     %加上初始种群中最优个体
route_x = [bestx0; route_x];
route_y = [besty0; route_y];[final_fit,idx]=max(route_fit);            %所有代中的的最佳路线
final_routex=route_x(idx,:);
final_routey=route_y(idx,:);
final_distance = 1.0/final_fit             %最佳路径长度%==========画图,可视化路线、进化过程==============
% 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;%%画出最短路径的路线
plot(final_routex,final_routey,'r*-',  'linewidth', 1.5);
legend('障碍物1','障碍物2','障碍物3','起点', '终点', '最短路线')
set(gca,'FontSize',16);
hold off;% 进化过程中适应度曲线
figure,
plot(0:1:size(route_fit,2)-1, route_fit, 'linewidth', 1.2)
ylim([0.08,0.1])
title(['变异率=',num2str(p_mut),',交叉率=', num2str(p_crs), '的进化曲线']);
legend('适应度值', 'Location', 'southeast');
set(gca,'FontSize',16);figure,
plot(1./route_fit, 'linewidth', 1.2)
title(['变异率=',num2str(p_mut),',交叉率=', num2str(p_crs), '的进化曲线']);
legend('最短路径长度值', 'Location', 'northeast');
set(gca,'FontSize',16);% d_ga = 1./route_fit;
% save('d_ga');

SAGA_main.m

%%%%%%模拟退火遗传算法(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;%%画出最短路径的路线
plot(final_routex,final_routey,'r*-',  'linewidth', 1.5);
legend('障碍物1','障碍物2','障碍物3','起点', '终点', '最短路线')
set(gca,'FontSize',16);
hold off;% 进化过程中适应度曲线
figure,
% plot(0:1:size(route_fit,2)-1, route_fit, 'linewidth', 1.2)
plot(d, 'linewidth', 1.2)
% ylim([0.08,0.1])
title(['变异率=',num2str(p_mut),',交叉率=', num2str(p_crs), '的进化曲线']);
legend('最短路径长度值', 'Location', 'northeast');
set(gca,'FontSize',16);d_saga = d;
save('d_saga');load('d_ga.mat');
figure,
plot(d, 'linewidth', 1.2), hold on,
plot(d_ga, 'linewidth', 1.2);
title(['变异率=',num2str(p_mut),',交叉率=', num2str(p_crs), '的进化曲线']);
legend('SAGA最优路径值', 'GA最优路径值', 'Location', 'northeast');
set(gca,'FontSize',16);

相关函数

best.m

%====================================
%%输入参数:种群、其适应度
%%输出参数:种群中的最佳个体,及其适应度
%%说明:
%     选择最佳个体,便于后续分析
%====================================
function [bestx,besty,bestfit]=best(x,y,fitval)bestx = x(1,:);besty = y(1,:);bestfit = fitval(1);for i = 2:size(x,1)if fitval(i) > bestfitbestx = x(i,:);besty = y(i,:);bestfit=fitval(i);endend
end

crossover.m

%====================================
%%输入参数:父代种群,交叉概率
%%输出参数:子代种群
%%说明:
%     单点交叉,最后需要从小到大排序
%====================================
function [kidx, kidy]=crossover(x, y, p)[m,n] = size(x);kidx = ones(size(x)); kidy = ones(size(y)); for i = 1:2:m-1if(rand < p)point = round(rand*n);kidx(i,:) = [x(i,1:point),x(i+1,point+1:n)];kidx(i+1,:) = [x(i+1,1:point),x(i,point+1:n)];kidy(i,:) = [y(i,1:point),y(i+1,point+1:n)];kidy(i+1,:) = [y(i+1,1:point),y(i,point+1:n)];elsekidx(i,:) = x(i,:);kidx(i+1,:) = x(i+1,:);kidy(i,:) = y(i,:);kidy(i+1,:) = y(i+1,:);endendfor i = 1:1:mkidx(i,:) = sort(kidx(i,:));kidy(i,:) = sort(kidy(i,:));end
end

fitness.m

%====================================
%%输入参数:种群——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%%%计算适应度if cnt_line > 0f(i)=0;       %路线穿过障碍物的个体适应度置零elsefor j=1:1:xn-1d(j)=sqrt((x(i,j+1)-x(i,j)).^2+(y(i,j+1)-y(i,j)).^2);     %该个体(即路线)的路径长度endf(i)=1.0/sum(d);       %取距离的倒数作为个体适应度endrecord_cnt(i,:) = cnt_line;endfitval=f';
%     disp(['不满足条件的最小线段数为:',num2str(min(record_cnt, [], 1))])end

mutation.m

%====================================
%%输入参数:父代种群,变异概率
%%输出参数:子代种群
%%说明:
%     随机替换,最后需要从小到大排序
%====================================
function [kidx, kidy]=mutation(x, y, p)[m, n] = size(x);kidx = x;kidy = y;for i = 1:1:mif(rand < p)point = round(rand*n);% 避免越界if point <= 1point = 2;endif point == npoint = n-1;end% 变异:随机数替换kidx(i,point) = round(rand*n);kidy(i,point) = round(rand*n);endendfor i = 1:1:mkidx(i,:) = sort(kidx(i,:));kidy(i,:) = sort(kidy(i,:));end
end

popint.m

%====================================
%%输入参数:种群数量,染色体长度
%%输出参数:初始种群
%%说明:
%     种群中的个体由一系列点组成,该点的x,y坐标分开存放,
%     除了起点和终点,其余点随机生成并从小到大排序
%====================================
function [x,y]=popinit(popsize,chromlength)x=5.0*rand(popsize,chromlength);y=8.9*rand(popsize,chromlength);x(:,1)=0;  % 设置起点y(:,1)=0;for i=1:1:size(x,1) x(i,:)=sort(x(i,:));y(i,:)=sort(y(i,:));end x(:,chromlength)=1.5;  %设置终点y(:,chromlength)=8.9;end

saga_fitness.m

%====================================
%%输入参数:种群——x,y横纵坐标, 当前温度T
%%输出参数:种群中每个个体的适应度值
%%说明:
%     逐个计算种群中个体的适应度值,判断该个体所连成线路与圆形障碍物之间的关系,
%     将满足条件的路径的距离倒数作为适应度值
%====================================function fitval=saga_fitness(x,y,T)%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%%%计算适应度if cnt_line > 0f(i)=0;       %路线穿过障碍物的个体适应度置零elsefor j=1:1:xn-1d(j)=sqrt((x(i,j+1)-x(i,j)).^2+(y(i,j+1)-y(i,j)).^2);     %该个体(即路线)的路径长度endf(i)=1.0/sum(d);       %取距离的倒数作为个体适应度endrecord_cnt(i,:) = cnt_line;endI = find(f ~= 0);sumf = sum(exp(f(I) ./ T)) + n - size(I, 1);f(I) = exp(f(I)./T) ./ sumf;fitval=f';
%     disp(['不满足条件的最小线段数为:',num2str(min(record_cnt, [], 1))])end

select.m

%====================================
%%输入参数:种群、其适应度、选择比例
%%输出参数:父辈种群——x,y横纵坐标
%%说明:
%     按照输入参数的比例,从种群中选择父代
%====================================
function [parentPopx, parentPopy]=select(popx, popy, fitness, ratio)totalfit=sum(fitness); %适应值之和accP=cumsum(fitness/totalfit); %概率累计和%轮盘赌选择算法for n=1:round(ratio*size(popx,1))mat=find(accP>rand); %找到比随机数大的累积概率if isempty(mat)continueendparentPopx(n,:)=popx(mat(1),:);%将首个比随机数大的累积概率的位置的个体遗传下去parentPopy(n,:)=popy(mat(1),:);end
end

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

  1. 【路径规划】基于matlab GUI粒子群算法机器人避障路径规划(手动设障)【含Matlab源码 924期】

    ⛄一.简介 1 粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation).源于对鸟群捕 ...

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

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

  3. 【路径规划】基于matlab DWA动态避障路径规划【含Matlab源码 2356期】

    ⛄一.传统DWA算法 在传统的动态窗口法中,在模拟机器人的移动轨迹前,需要建立机器人的运动模型.图1为典型的移动机器人运动学模型示意图. v (t)和w (t)分别代表了移动机器人在世界坐标系中的线速 ...

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

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

  5. 六自由度机器人(机械臂)运动学建模及运动规划系列(五)——避障路径规划

    在之前的内容中,我们对机器人的运动轨迹进行了规划,但是,这种规划方法的运动路径是根据简单的轨迹人为组合起来的,具有较大的任意性.在实际的复杂工作环境中,采用人工规划路径的方法,难以保证规划的效率和准确 ...

  6. 基于粒子群算法的智能车辆避障路径规划方法研究

    基于粒子群算法的智能车辆避障路径规划方法研究 1.环境生成 1.1 环境生成方法的选择 1.2 坐标法生成环境 1.3 车辆简化 1.4 障碍物数据 2.粒子初始化 2.1 速度迭代设置 2.2 避障 ...

  7. 【路径规划】基于matlab遗传优化模拟退火算法避障路径规划【含Matlab源码 889期】

    ⛄一.简介 路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径.路径规划中有静态路径规划以及动态路径规划,本文所讨论的问题仅针对静态路径规划.具体问题描述如下: 给定起点 ...

  8. 六自由度机器人(机械臂)运动学建模及运动规划系列——避障路径规划算法补充:遗传算法

    上一篇介绍了蚁群算法,本篇介绍路径规划的另一种经典算法--遗传算法,主要介绍算法原理,流程以及在路径规划中的应用示例. 目录 1. 理论基础 2. 算法实现流程 3. 路径规划应用示例 4. 总结 1 ...

  9. 六自由度机器人(机械臂)运动学建模及运动规划系列——避障路径规划算法补充:粒子群算法(PSO)

    上一篇介绍了遗传算法,本篇接着介绍应用于路径规划的另一种算法--粒子群算法(PSO),主要介绍算法的理论基础以及实现流程等. 本篇目录 1. 算法起源与理论基础 2. 算法实现流程 (1)粒子群初始化 ...

最新文章

  1. java命令行读入密码_java-在命令行上隐藏输入
  2. weblogic 部署后出现Error 404–Not Found
  3. 哪里可以接到python的活干-学了Python以后,我干了很多不是人干的活
  4. 面试官:一千万数据,怎么快速查询?
  5. Android 底部导航栏的简单实现-BottomNavigationView
  6. 2017年如何成为全栈工程师,这些技能是你必须具备的!
  7. 《管理转型》——读书随笔
  8. Amazon Alexa 新里程碑: 50000 个功能、 20000 种设备、 3500 个品牌
  9. 63. Unique Paths II and 64. Minimum Path Sum
  10. Java易混小知识——equals方法和==的区别
  11. linux arm寄存器,ARM寄存器总结
  12. iOS 本地自动打包工具
  13. installanywhere's LAX Properties
  14. mysql 数据库快速入门 结构化查询语言SQL
  15. python批量删缩进_吾爱破解新出利器 : 批量重命名工具
  16. 机器学习中的七种分类算法
  17. 漫谈广告竞价模式(二)
  18. SKETCH 切出背景透明的图标
  19. CodeBERT理解
  20. android nohttp百度百科,百度百科宣布取消扩展阅读并给外链添加nofollow标签

热门文章

  1. TabLayout和Fragment实现点击和滑动切换
  2. Mysql五大数据类型
  3. 关于Z变换及其物理含义
  4. [GWT-RPC]RequestBuilder发起http请求实例
  5. RTCM3消息类型大全【1002,1006,1107,1117,1127到底代表了些啥】
  6. tensorflow with求导_TensorFlow - 求导
  7. html中根据姓名模糊查询,JavaScript根据Json数据来做的模糊查询功能
  8. HTML笔记(form与table标签区别,区分利用ul,dl与table标签)
  9. zookeeper digest授权方式
  10. 0基础玩转C语言—初识C语言(上)