Hamilton圈求单个旅行商问题(TSP)
利用Hamilton圈可以求解一个旅行商从起点城市出发,遍历其它城市之后的回到起点城市的问题。当然,通过修改代码,可以将问题转变问求从起点城市出发,回到其它终点城市的问题。本文代码主要来自于《数学建模算法与应用》,想要了解更多可以购买该书籍。
下面是主要的代码:
function[circle,long]=modifycircle(a,L,b)
for k=1:L
flag=0;%退出标志%
for m=1:L-2%m为算法中的i
for n=m+2:L
if a(b(m),b(n))+a(b(m+1),b(n+1))<a(b(m),b(m+1))+a(b(n),b(n+1))
b(m+1:n)=b(n:-1:m+1);
flag=flag+1
end
end
end
if flag ==0
long=0
for i=1:L
long=long+a(b(i),b(i+1));
end
circle=b;
return
end
end
%该部分主要是hamilton圈的子函数
clear all
ZB=load('经纬度.txt');
ZB1=ZB;
ZB=ZB*pi/180;
a=length(ZB);
dis=zeros(a);
for i=1:a-1
for j=i+1:a
dis(i,j)=6370*acos(cos(ZB(i,1)-ZB(j,1))*cos(ZB(i,2))*cos(ZB(j,2))+sin(ZB(i,2))*sin(ZB(j,2)));
end
end
dis=dis+dis';L=size(dis,1);
c=[1,2:30,1];
[circle,long]=modifycircle(dis,L,c);%调用修改圈的子函数%
%修改圈%
%%%%%%%%%打点%%%%%%%%%%%%
% x=ZB1(:,1);
% y=ZB1(:,2);
% axis([min(x)-1 max(x)+1 min(y)-1 max(y)+1]);
% plot(x,y,'b*')
% text(x(1),y(1),'*','color','k')
% axis([min(x) max(x) min(y) max(y)])
xx=ZB1(circle,1);yy=ZB1(circle,2);
plot(xx,yy,'-*')
for i=1:size(ZB1,1) %用这个循环
text(ZB1(i,1),ZB1(i,2),['',num2str(i-1)]);
end
text(ZB1(circle(1),1),ZB1(circle(1),2),'起点')
xlabel('传感器经度');
ylabel('传感器纬度');
title('最优路径示意图')
%给出经纬度信息,将利用公式求解各个点之间的距离,然后调用上面的子函数。
最后的图形如上。