【路徑規(guī)劃】基于改進(jìn)粒子群實(shí)現(xiàn)機(jī)器人柵格地圖路徑規(guī)劃
1 研究背景
粒子群算法的發(fā)展過程。粒子群優(yōu)化算法(Partical Swarm Optimization PSO),粒子群中的每一個(gè)粒子都代表一個(gè)問題的可能解,通過粒子個(gè)體的簡單行為,群體內(nèi)的信息交互實(shí)現(xiàn)問題求解的智能性。由于PSO操作簡單、收斂速度快,因此在函數(shù)優(yōu)化、 圖像處理、大地測量等眾多領(lǐng)域都得到了廣泛的應(yīng)用。 隨著應(yīng)用范圍的擴(kuò)大,PSO算法存在早熟收斂、維數(shù)災(zāi)難、易于陷入局部極值等問題需要解決,主要有以下幾種發(fā)展方向。
1、基本思想
??粒子群算法通過設(shè)計(jì)一種無質(zhì)量的粒子來模擬鳥群中的鳥,粒子僅具有兩個(gè)屬性:速度和位置,速度代表移動(dòng)的快慢,位置代表移動(dòng)的方向。每個(gè)粒子在搜索空間中單獨(dú)的搜尋最優(yōu)解,并將其記為當(dāng)前個(gè)體極值,并將個(gè)體極值與整個(gè)粒子群里的其他粒子共享,找到最優(yōu)的那個(gè)個(gè)體極值作為整個(gè)粒子群的當(dāng)前全局最優(yōu)解,粒子群中的所有粒子根據(jù)自己找到的當(dāng)前個(gè)體極值和整個(gè)粒子群共享的當(dāng)前全局最優(yōu)解來調(diào)整自己的速度和位置。下面的動(dòng)圖很形象地展示了PSO算法的過程:

2、更新規(guī)則
??PSO初始化為一群隨機(jī)粒子(隨機(jī)解)。然后通過迭代找到最優(yōu)解。在每一次的迭代中,粒子通過跟蹤兩個(gè)“極值”(pbest,gbest)來更新自己。在找到這兩個(gè)最優(yōu)值后,粒子通過下面的公式來更新自己的速度和位置。

公式(1)的第一部分稱為【記憶項(xiàng)】,表示上次速度大小和方向的影響;公式(1)的第二部分稱為【自身認(rèn)知項(xiàng)】,是從當(dāng)前點(diǎn)指向粒子自身最好點(diǎn)的一個(gè)矢量,表示粒子的動(dòng)作來源于自己經(jīng)驗(yàn)的部分;公式(1)的第三部分稱為【群體認(rèn)知項(xiàng)】,是一個(gè)從當(dāng)前點(diǎn)指向種群最好點(diǎn)的矢量,反映了粒子間的協(xié)同合作和知識(shí)共享。粒子就是通過自己的經(jīng)驗(yàn)和同伴中最好的經(jīng)驗(yàn)來決定下一步的運(yùn)動(dòng)。以上面兩個(gè)公式為基礎(chǔ),形成了PSO的標(biāo)準(zhǔn)形式。

公式(2)和 公式(3)被視為標(biāo)準(zhǔn)PSO算法。
3、PSO算法的流程和偽代
clc;
close all
clear
load('data4.mat')
S=(S_coo(2)-0.5)*num_shange+(S_coo(1)+0.5);%起點(diǎn)對(duì)應(yīng)的編號(hào)
E=(E_coo(2)-0.5)*num_shange+(E_coo(1)+0.5);%終點(diǎn)對(duì)應(yīng)的編號(hào)
PopSize=20;%種群大小
OldBestFitness=0;%舊的最優(yōu)適應(yīng)度值
gen=0;%迭代次數(shù)
maxgen =200;%最大迭代次數(shù)
c1=0.5;%認(rèn)知系數(shù)
c2=0.7;%社會(huì)學(xué)習(xí)系數(shù)
c3=0.2;%反向因子
w=0.96;%慣性系數(shù)
%%
%初始化路徑
w_min=0.5;
w_max=1;
Group=ones(num_point,PopSize); ?%種群初始化
flag=1;
%最優(yōu)解
figure(3)
hold on
for i=1:num_shange
? ?for j=1:num_shange
? ? ? ?if sign(i,j)==1
? ? ? ? ? ?y=[i-1,i-1,i,i];
? ? ? ? ? ?x=[j-1,j,j,j-1];
? ? ? ? ? ?h=fill(x,y,'k');
? ? ? ? ? ?set(h,'facealpha',0.5)
? ? ? ?end
? ? ? ?s=(num2str((i-1)*num_shange+j));
? ? ? ?text(j-0.95,i-0.5,s,'fontsize',6)
? ?end
end
axis([0 num_shange 0 num_shange])%限制圖的邊界
plot(S_coo(2),S_coo(1), 'p','markersize', 10,'markerfacecolor','b','MarkerEdgeColor', 'm')%畫起點(diǎn)
plot(E_coo(2),E_coo(1),'o','markersize', 10,'markerfacecolor','g','MarkerEdgeColor', 'c')%畫終點(diǎn)
set(gca,'YDir','reverse');%圖像翻轉(zhuǎn)
for i=1:num_shange
? ?plot([0 num_shange],[i-1 i-1],'k-');
? ?plot([i i],[0 num_shange],'k-');%畫網(wǎng)格線
end
for i=2:index1
? ?Q1=[mod(route_lin(i-1)-1,num_shange)+1-0.5,ceil(route_lin(i-1)/num_shange)-0.5];
? ?Q2=[mod(route_lin(i)-1,num_shange)+1-0.5,ceil(route_lin(i)/num_shange)-0.5];
? ?plot([Q1(1),Q2(1)],[Q1(2),Q2(2)],'r','LineWidth',3)
end
title('改進(jìn)后的粒子群算法-最優(yōu)路線');
%進(jìn)化曲線
figure(4);
plot(BestFitness);
xlabel('迭代次數(shù)')
ylabel('適應(yīng)度值')
grid on;
title('改進(jìn)后的進(jìn)化曲線');
disp('改進(jìn)后的粒子群算法-最優(yōu)路線方案:')
disp(num2str(route_lin))
disp(['起點(diǎn)到終點(diǎn)的距離:',num2str(BestFitness(end))]);
figure(5);
plot(BestFitness*100);
xlabel('迭代次數(shù)')
ylabel('適應(yīng)度值')
grid on;
title('改進(jìn)后的最佳個(gè)體適應(yīng)度值變化趨勢');

