1. 程式人生 > >[數學建模(三)]遺傳算法與旅行商問題

[數學建模(三)]遺傳算法與旅行商問題

size log 數學建模 col randperm pre 個數 blog sum

clc,clear
sj=load(data3.txt) %加載敵方100 個目標的數據
x=sj(:,1); 
y=sj(:,2); 
d1=[70,40];   
sj0=[d1;sj;d1];   %增加一個點[70,40]作為首尾
sj=sj0;
d=zeros(102); %距離矩陣d

% 通過向量化的方法計算距離矩陣
amount = size(sj,1); 
dist_matrix = zeros(amount, amount);   
coor_x_tmp1 = sj(:,1) * ones(1,amount);
coor_x_tmp2 = coor_x_tmp1;
coor_y_tmp1 = sj(:,2) * ones(1,amount);
coor_y_tmp2 
= coor_y_tmp1; dist_matrix = sqrt((coor_x_tmp1-coor_x_tmp2).^2 + (coor_y_tmp1-coor_y_tmp2).^2); %存儲各個城市之間距離的矩陣 d=dist_matrix; %設置參數 L=102; w=50; dai=100; %通過改良圈算法選取優良父代A for k=1:w c=randperm(100); %把1到100這些數隨機打亂得到的一個數字序列 c1=[1,c+1,102]; %頭尾增加1,102 flag=1; %設置標誌 while flag>0 flag
=0; for m=1:L-3 for n=m+2:L-1 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)) flag=1; c1(m+1:n)=c1(n:-1:m+1); end end end end J(k,c1)=1:102; %產生了w個(50個)父代A end J=J/102; J(:,1)=0; J(:,102)=1; %頭尾分別為0,1,中間元素介於它們之間 rand(
state,sum(clock)); %遺傳算法實現過程 A=J; for k=1:dai %產生0~1 間隨機數列進行編碼 dai=100 B=A; c=randperm(w); %1.交配產生子代B for i=1:2:w F=2+floor(100*rand(1)); temp=B(c(i),F:102); %兩兩配對 B(c(i),F:102)=B(c(i+1),F:102); B(c(i+1),F:102)=temp; end %2.變異產生子代C by=find(rand(1,w)<0.1); if length(by)==0 by=floor(w*rand(1))+1; end C=A(by,:); L3=length(by); for j=1:L3 bw=2+floor(100*rand(1,3)); bw=sort(bw); C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); end %3.在父代和子代中選擇優良品種作為新的父代 G=[A;B;C]; G=[A;B;C]; TL=size(G,1); [dd,IX]=sort(G,2);temp(1:TL)=0; for j=1:TL for i=1:101 temp(j)=temp(j)+d(IX(j,i),IX(j,i+1)); end end [DZ,IZ]=sort(temp); %從小到大 A=G(IZ(1:w),:); %選擇優良的50個 end path=IX(IZ(1),:) long=DZ(1) xx=sj0(path,1);yy=sj0(path,2); plot(xx,yy,-o)

[數學建模(三)]遺傳算法與旅行商問題