?一、遺傳算法及柵格地圖簡介
1 遺傳算法
遺傳算法是一種基于生物進化論模型的優(yōu)化算法,通過模擬生物進化的過程,通過復制、交叉、突變等操作產(chǎn)生下一代的解,并逐步淘汰掉適應度函數(shù)值低的解,增加適應度函數(shù)值高的解。遺傳算法可以用于解決各種優(yōu)化問題,如函數(shù)優(yōu)化、組合優(yōu)化、機器學習等。在遺傳算法中,個體的適應度函數(shù)值越高,就越有可能被選擇為下一代的父代,從而進化出更優(yōu)秀的解。遺傳算法的優(yōu)點是可以在大規(guī)模搜索空間中找到全局最優(yōu)解,但是也存在一些缺點,如收斂速度慢、參數(shù)設置困難等。
2 遺傳算法步驟
遺傳算法是一種模擬自然進化過程的優(yōu)化算法,其步驟如下:
(1)初始化種群:隨機生成一定數(shù)量的個體,每個個體都是由若干個基因組成的染色體。
(2)評估適應度:對于每個個體,通過一個適應度函數(shù)來評估其適應度,即該個體在解決問題中的表現(xiàn)好壞。
(3)選擇操作:根據(jù)適應度函數(shù)的值,選擇一部分個體作為父代,用于產(chǎn)生下一代個體。
(4)交叉操作:對于選出的父代個體,進行交叉操作,生成新的個體。
(5)變異操作:對于新生成的個體,進行變異操作,引入新的基因,增加種群的多樣性。
(6)重復步驟2-5,直到達到預設的終止條件(如達到最大迭代次數(shù)或找到滿足要求的解)。
3 遺傳算法求解帶容量和體積的車輛路徑規(guī)劃問題
遺傳算法是一種基于生物進化原理的優(yōu)化算法,可以用于求解帶容量和體積的車輛路徑規(guī)劃問題。具體實現(xiàn)過程如下:
(1)定義染色體編碼方式,將車輛路徑規(guī)劃問題轉(zhuǎn)化為染色體的編碼問題。
(2)初始化種群,隨機生成一定數(shù)量的染色體。
(3)評估適應度,根據(jù)染色體編碼計算每個染色體的適應度。
(4)選擇操作,根據(jù)適應度選擇一定數(shù)量的染色體作為下一代的父代。
(5)交叉操作,對父代染色體進行交叉操作,生成新的染色體。
(6)變異操作,對新生成的染色體進行變異操作,增加種群的多樣性。
(7)評估適應度,計算新生成的染色體的適應度。
(8)選擇操作,根據(jù)適應度選擇一定數(shù)量的染色體作為下一代的種群。
(9)重復步驟4-8,直到滿足停止條件。
在帶容量和體積的車輛路徑規(guī)劃問題中,染色體編碼可以采用基因串編碼,其中每個基因表示一個客戶點,基因串表示車輛的路徑。同時,需要引入容量和體積約束條件,確保每個車輛的容量和體積不超過限制。在評估適應度時,可以考慮車輛的行駛距離和滿足約束條件的程度。
2 柵格地圖
2.1 柵格法應用背景
路徑規(guī)劃時首先要獲取環(huán)境信息, 建立環(huán)境地圖, 合理的環(huán)境表示有利于建立規(guī)劃方法和選擇合適的搜索算法,最終實現(xiàn)較少的時間開銷而規(guī)劃出較為滿意的路徑。一般使用柵格法在靜態(tài)環(huán)境下建立環(huán)境地圖。
2.2 柵格法實質(zhì)
將AGV的工作環(huán)境進行單元分割, 將其用大小相等的方塊表示出來,這樣柵格大小的選取是影響規(guī)劃算法性能的一個很重要的因素。柵格較小的話,由柵格地圖所表示的環(huán)境信息將會非常清晰,但由于需要存儲較多的信息,會增大存儲開銷,同時干擾信號也會隨之增加,規(guī)劃速度會相應降低,實時性得不到保證;反之,由于信息存儲量少,抗干擾能力有所增強,規(guī)劃速隨之增快,但環(huán)境信息劃分會變得較為模糊,不利于有效路徑的規(guī)劃。在描述環(huán)境信息時障礙物所在區(qū)域在柵格地圖中呈現(xiàn)為黑色,地圖矩陣中標為1,可自由通行區(qū)域在柵格地圖中呈現(xiàn)為白色,地圖矩陣中標為0。路徑規(guī)劃的目的就是在建立好的環(huán)境地圖中找到一條最優(yōu)的可通行路徑,所以使用柵格法建立環(huán)境地圖時,柵格大小的合理設定非常關鍵。
2.3 10乘10的靜態(tài)環(huán)境地圖
10乘10的靜態(tài)環(huán)境地圖代碼
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立環(huán)境地圖%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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 on
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%柵格數(shù)字標識%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x_text = 1:1:n(1)*n(2); %產(chǎn)生所需數(shù)值.
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
建立環(huán)境矩陣,1代表黑色柵格,0代表白色柵格,調(diào)用以上程序,即可得到上述環(huán)境地圖。
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); %得到環(huán)境地圖
2.4 柵格地圖中障礙柵格處路徑約束
移動體柵格環(huán)境中多采用八方向的移動方式,此移動方式在完全可通行區(qū)域不存在運行安全問題,當
移動體周圍存在障礙柵格時此移動方式可能會發(fā)生與障礙物柵格的碰撞問題,為解決此問題加入約束
條件,當在分別與障礙物柵格水平方向和垂直方向的可行柵格兩柵格之間通行時,禁止移動體采用對
角式移動方式。
約束條件的加入,實質(zhì)是改變柵格地圖的鄰接矩陣,將障礙柵格(數(shù)字為“1”的矩陣元素)的對角柵格
設為不可達, 即將對角柵格的距離值改為無窮大。其實現(xiàn)MATLAB代碼如下:
代碼:
%約束移動體在障礙柵格對角運動
%通過優(yōu)化鄰接矩陣實現(xiàn)
%%%%%%%%%%%%%%%%%% 約束移動體移動方式 %%%%%%%%%%%%%%%%%
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;
else
if(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;
end
end
end
if(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;
else
if(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;
end
end
end
if(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;
end
end
if(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;
end
end
if(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;
end
end
end
end
end
2.5 柵格法案例
下面以Djkstra算法為例, 其實現(xiàn)如下:
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;];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立環(huán)境矩陣map%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DrawMap(map); %得到環(huán)境地圖
W=G2D(map); %得到環(huán)境地圖的鄰接矩陣
W(W==0)=Inf; %鄰接矩陣數(shù)值處理
W=OPW(map,W); %優(yōu)化鄰接矩陣
[distance,path]=dijkstra(W,1,100);%設置起始柵格,得到最短路徑距離以及柵格路徑
[x,y]=Get_xy(distance,path,map); %得到柵格相應的x,y坐標
Plot(distance,x,y); %畫出路徑
運行結(jié)果如下:
其中函數(shù)程序:
DrawMap(map) 詳見建立柵格地圖
W=G2D(map) ; 詳見建立鄰接矩陣
[distance, path] =dijkstra(W, 1, 100) 詳見Djk stra算法
[x, y] =Get_xy(distance, path, map) ;
Plot(distance, x, y) ;
?二、部分源代碼
% 基于遺傳算法的柵格法機器人路徑規(guī)劃
clc;
clear;
close all
tic
%testtttttttttttttttt!
% 輸入數(shù)據(jù),即柵格地圖.20行20列
% Grid= [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 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
% 0 0 1 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 0 0 0 0 0 0 0 0 0;
% 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 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 0 0 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 1 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 0 0 0 1 1 1 0 1 1 1 1 0;
% 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0;
% 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0;
% 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0;
% 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0;
% 0 0 0 0 0 0 0 0 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 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];
Grid = [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 0 0 0 1 1 0 0;
0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0;
0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0;
0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0;
0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 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 1 0 0 0 1 1 1;
0 0 1 1 1 1 1 1 1 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 0 1 0 0 0;
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0;
0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0;
0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0;
0 0 1 1 1 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 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0;
0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0;
0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0];
start_num = 0; % 起點編號
end_num = 399; % 終點序號
NP = 200; % 種群數(shù)量
max_gen = 50; % 最大進化代數(shù)
% pc = 0.8; % 交叉概率
% pm = 0.2; % 變異概率
r = 8000; %適應度系數(shù)
a = 2; % 路徑長度比重
b = 5; % 路徑順滑度比重
z = 1;
pc_max=0.8;
pc_min=0.08;
pm_max=0.2;
pm_min=0.02;
new_pop1 = {}; % 元胞數(shù)組,存放路徑
[y, x] = size(Grid);
% 起點所在列(從左到右編號1.2.3…)
start_column = mod(start_num, x) + 1;
% 起點所在行(從上到下編號行1.2.3…)
start_row = fix(start_num / x) + 1; %Y = fix(X) 將 X 的每個元素朝零方向四舍五入為最近的整數(shù)
% 終點所在列、行
end_column = mod(end_num, x) + 1;
end_row = fix(end_num / x) + 1;
%% 種群初始化step1,必經(jīng)節(jié)點,從起始點所在行開始往上,在每行中挑選一個自由柵格,構成必經(jīng)節(jié)點
pass_num = end_row - start_row + 1; %每條路徑的節(jié)點個數(shù)
pop = zeros(NP, pass_num);%生成種群數(shù)量*節(jié)點個數(shù)的矩陣,用于存放每個個體的路徑
for i = 1 : NP %每個個體(每行)循環(huán)操作:
able_to_continuous = 0;
while able_to_continuous == 0 %檢驗是否可以連續(xù),如果不連續(xù)則重新隨機生成路徑
pop(i, 1) = start_num; %每行第一列都為起點(存入起點的編號)
j = 1;
% 此for循環(huán)用于尋找除去起點和終點所在行以外每行中的自由柵格
for row_i = start_row+1 : end_row-1 %柵格的第二行到倒數(shù)第二行循環(huán)
j = j + 1;
% 存放柵格里當前行中的自由柵格序號
free = [];
for column_i = 1 : x %從第一列到第二十列中
% 柵格對應的序號
num = (column_i - 1) + (row_i - 1) * x;
% 如果該柵格為非障礙物
if Grid(row_i, column_i) == 0
% 把此柵格的編號加入free矩陣中
free = [free num];
end
end % 柵格一行里的自由柵格查詢結(jié)束,自由柵格的編號存在了向量中
free_num = length(free);
% 產(chǎn)生小于等于本行自由柵格數(shù)量的一個隨機整數(shù)
index = randi(free_num); %X = randi(imax) 返回一個介于 1 和 imax 之間的偽隨機整數(shù)標量。
% 將柵格中當前行的自由柵格矩陣free中第index個柵格編號作為當前種群的第j個節(jié)點
pop(i, j) = free(index);
end %該個體的每一行的路徑節(jié)點產(chǎn)生完成,存入了pop的第i行中
pop(i, end) = end_num; %pop的每行第最后一列都為終點(存入終點的編號)
%% 種群初始化step2將上述必經(jīng)節(jié)點聯(lián)結(jié)成無間斷路徑
single_new_pop = generate_continuous_path(pop(i, :), Grid, x);
if ~isempty(single_new_pop)%如果這一行種群的路徑不是空的,將這行路徑存入元胞數(shù)組中。
new_pop1(z, 1) = {single_new_pop};
z = z + 1;
able_to_continuous=1;
else
able_to_continuous=0;
end
end
end
?三、運行結(jié)果
?四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1]徐美清,孫晨亮.基于柵格地圖的遺傳算法路徑規(guī)劃[J].科技信息. 2011,(31)文章來源:http://www.zghlxwxcb.cn/news/detail-777273.html
3 備注
簡介此部分摘自互聯(lián)網(wǎng),僅供參考,若侵權,聯(lián)系刪除文章來源地址http://www.zghlxwxcb.cn/news/detail-777273.html
到了這里,關于【路徑規(guī)劃】自適應遺傳算法機器人柵格地圖最短路徑規(guī)劃【含Matlab源碼 3570期】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!