資源簡介
中國省會的TSP問題. 親手寫的,注釋詳細,帶圖形演示,感興趣的朋友來下載吧.

代碼片段和文件信息
clcclear
hold?on
%起點
global?star_point;
star_point=5;
sj0=importdata(‘provincial_?capital_coordinate.txt‘);???????%加載數據(每個點的經緯度)
%整理好數據
x=sj0.data(:1);???%經度
y=sj0.data(:2);???%緯度
landcolor?=?[111];
%載入坐標軸范圍(維度范圍?經度范圍)
ax?=?worldmap([15?53][70?135]);
%載入陸地地區shapefile文件?usegeocoord?將數據視為經緯度
land?=?shaperead(‘gadm36_CHN_1.shp‘?‘UseGeoCoords‘?true);
%顯示陸地?以landcolor做填充顏色
h=geoshow(ax?land?‘FaceColor‘?landcolor);
%顯示地點
point_data.Geometry=‘Point‘;
point_data.Lon=x;
point_data.Lat=y;
geoshow(point_data‘Marker‘?‘*‘);
textm(yxchar(sj0.textdata(2:362)));???%第一個參數為緯度,第二個為經度
%選取起點?%起點要放在頭和尾各一次
x([1?star_point]:)=x([star_point?1]:);
y([1?star_point]:)=y([star_point?1]:);
x=[x;x(1)];
y=[y;y(1)];
sj=[xy];?
sj=sj*pi/180;??%單位化成弧度
point_number=size(sj1);
d=zeros((point_number));??%距離矩陣d的初始值。?
%已知經緯度求兩點之間大圓航線距離,配置好鄰接矩陣d
for?i=1:(point_number-1)
??for?j=i+1:(point_number)
??d(ij)=6370*acos(cos(sj(i1)-sj(j1))*cos(sj(i2))*cos(sj(j2))+sin(sj(i2))*sin(sj(j2)));
??end
end
d=d+d‘;?w=50;?g=(point_number-2);?%w為種群的個數,g為進化的代數
rand(‘state‘sum(clock));?%初始化隨機數發生器
for?k=1:w??%通過改良圈算法選取初始種群
????c=randperm((point_number-2));?%產生1,...,(point_number-2)的一個全排列??
????c1=[1c+1(point_number)];?%生成初始解
????for?t=1:(point_number)?%該層循環是修改圈?
????????flag=0;?%修改圈退出標志
????for?m=1:(point_number-2)
??????for?n=m+2:(point_number-1)
????????if?d(c1(m)c1(n))+d(c1(m+1)c1(n+1)) ???????????c1(m+1:n)=c1(n:-1:m+1);??flag=1;?%修改圈
????????end
??????end
????end
???if?flag==0
??????J(kc1)=1:(point_number);?break?%記錄下較好的解并退出當前層循環
???end
???end
end
J(:1)=0;?J=J/(point_number);?%把整數序列轉換成[01]區間上的實數,即轉換成染色體編碼
for?k=1:g??%該層循環進行遺傳算法的操作?
????A=J;?%交配產生子代A的初始染色體
????c=randperm(w);?%產生下面交叉操作的染色體對?
????for?i=1:2:w??
????????F=2+floor((point_number-2)*rand(1));?%產生交叉操作的地址
????????temp=A(c(i)[F:(point_number)]);?%中間變量的保存值
????????A(c(i)[F:(point_number)])=A(c(i+1)[F:(point_number)]);?%交叉操作
????????A(c(i+1)F:(point_number))=temp;??
????end
????by=[];??%為了防止下面產生空地址,這里先初始化
while?~length(by)
????by=find(rand(1w)<0.1);?%產生變異操作的地址
end
B=A(by:);?%產生變異操作的初始染色體
for?j=1:length(by)
???bw=sort(2+floor((point_number-2)*rand(13)));??%產生變異操作的3個地址
???B(j:)=B(j[1:bw(1)-1bw(2)+1:bw(3)bw(1):bw(2)bw(3)+1:(point_number)]);?%交換位置
end
???G=[J;A;B];?%父代和子代種群合在一起
???[SGind1]=sort(G2);?%把染色體翻譯成1,...(point_number)的序列ind1
???num=size(G1);?long=zeros(1num);?%路徑長度的初始值
???for?j=1:num
???????for?i=1:(point_number-1)
???????????long(j)=long(j)+d(ind1(ji)ind1(ji+1));?%計算每條路徑長度
???????end
???end
?????[slongind2]=sort(long);?%對路徑長度按照從小到大排序
?????J=G(ind2(1:w):);?%精選前w個較短的路徑對應的染色體
?????
?????%記錄下平均路徑長度數據
?????long_mean(k)=mean(long);
end
path=ind1(ind2(1):)?flong=slong(1)??%解的路徑及路徑長度
sj=sj.*180./pi;???????????????????????%坐標弧度化成角度
xx=sj(path1);yy=sj(path2);
lujin.Geometry=‘Line‘;
lujin.Lon=xx;
lujin.Lat=yy;
geoshow(lujin?‘Color‘?‘blue‘)?%畫出路徑
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???14278656??2018-05-07?03:46??TSP_中國省會城市\gadm36_CHN_1.shp
?????文件???????3466??2019-05-17?15:04??TSP_中國省會城市\My_Genetic_Algorithm.asv
?????文件???????3518??2019-05-17?15:07??TSP_中國省會城市\My_Genetic_Algorithm.m
?????文件???????1760??2019-05-09?14:03??TSP_中國省會城市\provincial_?capital_coordinate.txt
?????目錄??????????0??2019-05-17?15:04??TSP_中國省會城市
-----------?---------??----------?-----??----
?????????????14287400????????????????????5
- 上一篇:2018美賽E題優秀論文中英對照
- 下一篇:DEVOPS 成熟度模型
評論
共有 條評論