【Matlab學習筆記】遺傳演算法
下面在Matlab中使用遺傳演算法解決最優路線規劃問題。
假定一架飛機從A點出發,依次飛過40個點,視察該40個點是否發生火災,然後返回A點。 已知A點和39個巡邏點的經緯度,求規劃一個最短巡邏路線。
已知A點的經緯度是:E70,N40.
其他40個點的經緯度為:
代碼如下:
%%遺傳演算法,計算N個城市之間的巡查最佳線路
load(tuihuo.mat);
A1 = [70,40];
B =[A1;A;A1] ; %初始基地的位置與全部過路點形成一個環線
d = zeros(42); %初始化距離d的矩陣
B = B.*pi/180;
for i = 1:41
for j = i+1:42
d(i,j) = 6370*acos(cos(B(i,1)-B(j,1))*cos(B(i,2))*cos(B(j,2))+sin(B(i,2))*sin(B(j,2)));
%d(i,j) = ((B(i,1)-B(j,1))^2 + (B(i,2) - B(j,2))^2)^0.5
end
end
d = d + d;
w = 50; g = 100; %遺傳50個族群,一共100代
rand(state,sum(clock));%初始化隨機過程
for k = 1:w
c = randperm(40);%產生40的隨機序列
c1 = [1,c+1,42];
for t = 1:42 %該層循環是修改層
flag = 0; %修改層退出的標誌
for m = 1:40
for n = m+2:41
if d(c1(m),c1(n))+d(c1(m+1),c1(n+1)) < d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
c1(m+1:n) = c1(n:-1:m+1); flag = 1;%修改這個族群
end
end
end
if flag == 0
J(k,c1) = 1:42; %記錄較好的族群然後退出當前循環
break;
end
end
end
J(:,1) = 0;J = J/42;
for k = 1:g %該層循環進行遺傳演算法操作
A = J; %交配產生的子代B的初始染色體,A為全部族群
c = randperm(w);%產生交叉染色體配對
for i = 1:2:w
F = 2+floor(40*rand(1));
temp = A(c(i),[F:42]); %交叉操作
A(c(i),[F:42]) = A(c(i+1),[F:42]); %選擇的單數族c(i)與雙數族c(i+1)雜交
A(c(i+1),F:42) = temp;
end
by = [];
while ~length(by)
by = find(rand(1,w)<0.1);
end
C = A(by,:); %產生變異的初始染色體
for j = 1:length(by)
bw = sort(2+floor(40*rand(1,3))); %產生變異的3個地址
C(j,:) = C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:42]); %交換位置
end
G = [J;A;C] ;%混合父子兩代
[SG,ind1] = sort(G,2);
num = size(G,1);long = zeros(1,num);
for j = 1:num
for i = 1:41
long(j) = long(j)+d(ind1(j,i),ind1(j,i+1)); %計算每條路徑的長度
end
end
[slong,ind2] = sort(long);
J = G(ind2(1:w),:)
end
path = ind1(ind2(1),:);flong = slong(1);
xx = B(path,1);yy = B(path,2);
plot(xx,yy,.-);
得到結果如下:
推薦閱讀:
※025 Reverse Nodes in k-Group[H]
※4. Median of Two Sorted Arrays(hard)