-
遺傳算法
前引:
1、TSP問題
1.1 TSP問題定義
旅行商問題(Traveling Salesman Problem,TSP)稱之為貨擔郎問題,TSP問題是一個經典組合優化的NP完全問題,組合優化問題是對存在組合排序或者搭配優化問題的一個概括,也是現實諸多領域相似問題的簡化形式。 -
1.2 TSP問題解法
傳統精確算法:窮舉法,動態規划
近似處理算法:貪心算法,改良圈算法,雙生成樹算法
智能算法:模擬退火,粒子群算法,蟻群算法,遺傳算法等 -
遺傳算法:
性質:全局優化的自適應概率算法
2.1 遺傳算法簡介
遺傳算法的實質是通過群體搜索技術,根據適者生存的原則逐代進化,最終得到最優解或准最優解。它必須做以下操作:初始群體的產生、求每一個體的適應度、根據適者生存的原則選擇優良個體、被選出的優良個體兩兩配對,通過隨機交叉其染色體的基因並隨機變異某些染色體的基因生成下一代群體,按此方法使群體逐代進化,直到滿足進化終止條件。
2.2 實現方法
根據具體問題確定可行解域,確定一種編碼方法,能用數值串或字符串表示可行解域的每一解。
對每一解應有一個度量好壞的依據,它用一函數表示,叫做適應度函數,一般由目標函數構成。
確定進化參數群體規模、交叉概率、變異概率、進化終止條件。
案例實操
我方有一個基地,經度和緯度為(70,40)。假設我方飛機的速度為1000km/h。我方派一架飛機從基地出發,偵察完所有目標,再返回原來的基地。在每一目標點的偵察時間不計,求該架飛機所花費的時間(假設我方飛機巡航時間可以充分長)。已知100個目標的經度、緯度如下表所列:





3.2 模型及算法
求解的遺傳算法的參數設定如下:
種群大小M=50;最大代數G=100;
交叉率pc=1,交叉概率為1能保證種群的充分進化;
變異概率pm=0.1,一般而言,變異發生的可能性較小。
-
編碼策略:

-
初始種群:

-
目標函數:

-
交叉操作:

-
變異操作:

-
選擇:

算法圖:

代碼實現:
clc,clear, close all
sj0=load('data12_1.txt');
x=sj0(:,1:2:8); x=x(:);
y=sj0(:,2:2:8); y=y(:);
sj=[x y]; d1=[70,40];
xy=[d1;sj;d1]; sj=xy*pi/180; %單位化成弧度
d=zeros(102); %距離矩陣d的初始值
for i=1:101
for j=i+1:102
d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*...
cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));
end
end
d=d+d'; w=50; g=100; %w為種群的個數,g為進化的代數
for k=1:w %通過改良圈算法選取初始種群
c=randperm(100); %產生1,...,100的一個全排列
c1=[1,c+1,102]; %生成初始解
for t=1:102 %該層循環是修改圈
flag=0; %修改圈退出標志
for m=1:100
for n=m+2:101
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:102; break %記錄下較好的解並退出當前層循環
end
end
end
J(:,1)=0; J=J/102; %把整數序列轉換成[0,1]區間上實數即染色體編碼
for k=1:g %該層循環進行遺傳算法的操作
A=J; %交配產生子代A的初始染色體
c=randperm(w); %產生下面交叉操作的染色體對
for i=1:2:w
F=2+floor(100*rand(1)); %產生交叉操作的地址
temp=A(c(i),[F:102]); %中間變量的保存值
A(c(i),[F:102])=A(c(i+1),[F:102]); %交叉操作
A(c(i+1),F:102)=temp;
end
by=[]; %為了防止下面產生空地址,這里先初始化
while ~length(by)
by=find(rand(1,w)<0.1); %產生變異操作的地址
end
B=A(by,:); %產生變異操作的初始染色體
for j=1:length(by)
bw=sort(2+floor(100*rand(1,3))); %產生變異操作的3個地址
%交換位置
B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
end
G=[J;A;B]; %父代和子代種群合在一起
[SG,ind1]=sort(G,2); %把染色體翻譯成1,...,102的序列ind1
num=size(G,1); long=zeros(1,num); %路徑長度的初始值
for j=1:num
for i=1:101
long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); %計算每條路徑長度
end
end
[slong,ind2]=sort(long); %對路徑長度按照從小到大排序
J=G(ind2(1:w),:); %精選前w個較短的路徑對應的染色體
end
path=ind1(ind2(1),:), flong=slong(1) %解的路徑及路徑長度
xx=xy(path,1);yy=xy(path,2);
plot(xx,yy,'-o') %畫出路徑
以上整個代碼中沒有調用GA工具箱。
GA工具箱:解決的是線性或者非線性約束(或者同時存在)的問題。
GA工具箱可以分為GUI界面和非GUI界面
實現效果:
最短距離:3.9365e+04 km 最短時間:39.4h
巡航路徑:

