TSP 模擬退火

2022-04-01 06:39:30 字數 1699 閱讀 3573

都知道tsp是經典的np問題,從乙個點開始遍歷所有點,不重複,求最短路徑。

可以用列舉終點,跑流量為2的最小費用,圖論來做,時間複雜度為 ​費用流已經用到堆優化了。顯然點,邊較多將無法承受。

如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。

先隨機生成一些解,然後隨機挑兩個點,開始試探轉移。

這裡,幾乎是按照退火演算法模板寫的了,有初始化,有狀態轉移,有接受準則。

clc, clear

sj0=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問題

模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...