都知道tsp是經典的np問題,從乙個點開始遍歷所有點,不重複,求最短路徑。
可以用列舉終點,跑流量為2的最小費用,圖論來做,時間複雜度為 費用流已經用到堆優化了。顯然點,邊較多將無法承受。
如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。
先隨機生成一些解,然後隨機挑兩個點,開始試探轉移。
這裡,幾乎是按照退火演算法模板寫的了,有初始化,有狀態轉移,有接受準則。
clc, clearsj0=load('
sj.txt');
x=sj0(:,[1:2:8]);x=x(:);
y=sj0(:,[2:2:8]);y=y(:);
sj=[x y]; d1=[70,40
]; sj=[d1;sj;d1]; sj=sj*pi/180
;d=zeros(102
);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
)));
endendd=d+d'
;path=;long=inf;
rand(
'state
',sum(clock)); %初始化隨機數發生器
for j=1:1000 %求較好的初始解
path0=[1
1+randperm(100),102]; temp=0
;
for i=1:101
temp=temp+d(path0(i),path0(i+1
)); end
if temp
path=path0; long=temp;
endend
e = 0.1^30
;l = 20000
;at = 0.999
;t = 1;
for k = 1
:l c = 2+floor(100*rand(1,2
)); c =sort(c);
c1 = c(1
); c2 = c(2
);
df=d(path(c1-1),path(c2))+d(path(c1),path(c2+1))-d(path(c1-1),path(c1))-d(path(c2),path(c2+1
));
if df < 0
path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102
)];
long = long+df;
elseif exp(-df/t)>rand
path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102
)];
long=long+df;
endt = t*at;
if t
break
; end
end
xx = sj(path,1
);yy = sj(path,2
);plot(xx,yy,'-*
');
模擬退火求解TSP問題
1.尋找下乙個解 2.計算下乙個解的能量 3.決定是否接受這個解 4.降溫 double randfloat double t0 1000000 tk 1,t t0,d 0.9999 int x initx 當前解 初始解 int anse,nowe 全域性最優解的能量,當前解的能量 anse no...
模擬退火 解決 TSP 問題
tsp問題求解 n個城市之間有一定距離,現在讓選擇乙個城市出發,然後到達所有的城市,最後回到原點每個城市只到達一次,求出一條路徑並且求出最短的距離 tsp問題是乙個np問題,但是可以求近似解,通過模擬退火演算法實現,源 include include include include include ...
模擬退火演算法解決TSP問題
模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...