錯誤的基于遺傳算法的機器人路徑規(guī)劃MATLAB源碼,求高人指點
基于遺傳算法的機器人路徑規(guī)劃MATLAB源碼算法的思路如下:取各障礙物頂點連線的中點為路徑點,相互連接各路徑點,將機器人移動的起點和終點限制在各路徑點上,利用Dijkstra算法來求網(wǎng)絡圖的最短路徑,找到從起點P1到終點Pn的最短路徑,由于上述算法使用了連接線中點的條件,不是整個規(guī)劃空間的最優(yōu)路徑,然后利用遺傳算法對找到的最短路徑各個路徑點Pi (i=1,2,n)調整,讓各路徑點在相應障礙物端點連線上滑動,利用Pi= Pi1+ti×(Pi2-Pi1)(ti0,1 i=1,2,n)即可確定相應的Pi,即為新的路徑點,連接此路徑點為最優(yōu)路徑。function L1,XY1,L2,XY2=JQRLJGH(XX,YY)% 基于Dijkstra和遺傳算法的機器人路徑規(guī)劃演示程序%輸入?yún)?shù)在函數(shù)體內部定義%輸出參數(shù)為% L1 由Dijkstra算法得出的最短路徑長度% XY1 由Dijkstra算法得出的最短路徑經(jīng)過節(jié)點的坐標% L2 由遺傳算法得出的最短路徑長度% XY2 由遺傳算法得出的最短路徑經(jīng)過節(jié)點的坐標%程序輸出的圖片有% Fig1 環(huán)境地圖(包括:邊界、障礙物、障礙物頂點之間的連線、Dijkstra的網(wǎng)絡圖結構)% Fig2 由Dijkstra算法得到的最短路徑% Fig3 由遺傳算法得到的最短路徑% Fig4 遺傳算法的收斂曲線(迄今為止找到的最優(yōu)解、種群平均適應值)% 畫Fig1figure(1);PlotGraph;title('地形圖及網(wǎng)絡拓撲結構')PD=inf*ones(26,26);for i=1:26 for j=1:26 if D(i,j)=1 x1=XY(i,5); y1=XY(i,6); x2=XY(j,5); y2=XY(j,6); dist=(x1-x2)2+(y1-y2)2)0.5; PD(i,j)=dist; end endend% 調用最短路算法求最短路s=1;%出發(fā)點t=26;%目標點L,R=ZuiDuanLu(PD,s,t);L1=L(end);XY1=XY(R,5:6);% 繪制由最短路算法得到的最短路徑figure(2);PlotGraph;hold onfor i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k'); hold onendtitle('由Dijkstra算法得到的初始路徑')% 使用遺傳算法進一步尋找最短路%第一步:變量初始化M=50;%進化代數(shù)設置N=20;%種群規(guī)模設置Pm=0.3;%變異概率設置LC1=zeros(1,M);LC2=zeros(1,M);Yp=L1;%第二步:隨機產(chǎn)生初始種群X1=XY(R,1);Y1=XY(R,2);X2=XY(R,3);Y2=XY(R,4);for i=1:N farmi=rand(1,aaa);end% 以下是進化迭代過程counter=0;%設置迭代計數(shù)器while counter<M%停止條件為達到最大迭代次數(shù) % 第三步:交叉 %交叉采用雙親雙子單點交叉 newfarm=cell(1,2*N);%用于存儲子代的細胞結構 Ser=randperm(N);%兩兩隨機配對的配對表 A=farmSer(1);%取出父代A B=farmSer(2);%取出父代B P0=unidrnd(aaa-1);%隨機選擇交叉點 a=A(:,1:P0),B(:,(P0+1):end);%產(chǎn)生子代a b=B(:,1:P0),A(:,(P0+1):end);%產(chǎn)生子代b newfarm2*N-1=a;%加入子代種群 newfarm2*N=b; for i=1:(N-1) A=farmSer(i); B=farmSer(i+1); newfarm2*i=b; end FARM=farm,newfarm;%新舊種群合并 % 第四步:選擇復制 SER=randperm(2*N); FITNESS=zeros(1,2*N); fitness=zeros(1,N); for i=1:(2*N) PP=FARMi; FITNESS(i)=MinFun(PP,X1,X2,Y1,Y2);%調用目標函數(shù) end for i=1:N f1=FITNESS(SER(2*i-1); f2=FITNESS(SER(2*i); if f1<=f2 else farmi=FARMSER(2*i); fitness(i)=FITNESS(SER(2*i); end end %記錄最佳個體和收斂曲線 minfitness=min(fitness); meanfitness=mean(fitness); if minfitness<Yp pos=find(fitness=minfitness); Xp=farmpos(1); Yp=minfitness; end if counter=10 PPP=0.5,Xp,0.5' PPPP=1-PPP; X=PPP.*X1+PPPP.*X2; Y=PPP.*Y1+PPPP.*Y2; XY2=X,Y; figure(3) PlotGraph; hold on for i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold on end title('遺傳算法第10代') hold on for i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold on end end if counter=20 PPP=0.5,Xp,0.5' PPPP=1-PPP; X=PPP.*X1+PPPP.*X2; Y=PPP.*Y1+PPPP.*Y2; XY2=X,Y; figure(4) PlotGraph; hold on for i=1:(length(R)-1) x1=XY2(i,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold on end title('遺傳算法第20代') hold on for i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold on end end if counter=30 PPP=0.5,Xp,0.5' PPPP=1-PPP; X=PPP.*X1+PPPP.*X2; Y=PPP.*Y1+PPPP.*Y2; XY2=X,Y; figure(5) PlotGraph; hold on for i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold on end title('遺傳算法第30代') hold on for i=1:(length(R)-1) x1=XY1(i,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold on end end if counter=40 PPP=0.5,Xp,0.5' PPPP=1-PPP; X=PPP.*X1+PPPP.*X2; Y=PPP.*Y1+PPPP.*Y2; XY2=X,Y; figure(6) PlotGraph; hold on for i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold on end title('遺傳算法第40代') hold on for i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold on end end if counter=50 PPP=0.5,Xp,0.5' PPPP=1-PPP; X=PPP.*X1+PPPP.*X2; Y=PPP.*Y1+PPPP.*Y2; XY2=X,Y; figure(7) PlotGraph; hold on for i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold on end title('遺傳算法第50代') hold on for i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold on end end LC2(counter+1)=Yp; LC1(counter+1)=meanfitness; % 第五步:變異 for i=1:N if Pm>rand&&pos(1)=i AA=farmi; AA(POS)=rand; farmi=AA; end end counter=counter+1; disp(counter);end% 輸出遺傳算法的優(yōu)化結果PPP=0.5,Xp,0.5'PPPP=1-PPP;X=PPP.*X1+PPPP.*X2;Y=PPP.*Y1+PPPP.*Y2;XY2=X,Y;L2=Yp;% 繪制Fig3figure(8)PlotGraph;hold onhold onfor i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold onendfor i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k'); hold onendtitle('遺傳算法最終結果')figure(9)PlotGraph;hold onfor i=1:(length(R)-1) x1=XY1(i,1); y1=XY1(i,2); x2=XY1(i+1,1); y2=XY1(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',1); hold onendhold onfor i=1:(length(R)-1) x1=XY2(i,1); y1=XY2(i,2); x2=XY2(i+1,1); y2=XY2(i+1,2); plot(x1,x2,y1,y2,'k','LineWidth',2); hold onendtitle('遺傳算法優(yōu)化前后結果比較')% 繪制Fig4figure(10);plot(LC1);hold onplot(LC2);xlabel('迭代次數(shù)');title('收斂曲線');