模擬退火演算法解決TSP問題

2021-06-12 05:53:04 字數 3989 閱讀 5198

模擬退火法

模擬退火法簡單解釋:為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期

間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。

所謂的退火是指將固體加熱到足夠高的溫度,使分子呈隨機排列狀態,然後逐步降溫使之冷卻,最後分子以低能狀態排列,固體達到某種穩定狀

態。重要理解:

假設材料在狀態i之下的能量為e(i),那麼材料在溫度t時從狀態i進入狀態j就遵循如下規律:

如果 e(j)<= e(i),接受該狀態被轉移

如果 e(j)> e(i),則狀態轉移以如下的概率被接受:

exp  其中,k 是物理學中的波爾茲曼常數,t 是材料溫度。

演算法關鍵引數和操作的設定:

從演算法的流程上看,模擬退火演算法包括三函式兩準則,即狀態產生函式、狀態接受函式、溫度更新函式、內迴圈終止準則和外迴圈終止準則,這

些環節的設計將決定模擬退火演算法的優化效能。此外,初溫的選擇對模擬退火演算法效能也有很大影響。

狀態產生函式:

原則:設計狀態產生函式(領域函式)的出發點應該是盡可能保證產生的候選解遍布全部的解空間。通常,狀態產生函式由兩部分組成,即產生候

選解的方式和候選解產生的概率分布。

方法:在當前狀態的領域結構內以一定概率方式(均勻分布、正態分佈、指數分布等)產生

狀態接受函式:

原則:函式一般以概率的方式給出,不同接受函式的差別主要在於接受概率的形式不同。設計狀態接受概率,應該遵循以下原則:

(1)在固定溫度下,接受使目標函式下降的候選解的概率要大於使目標函式上公升的候選解概率;

(2)隨溫度的下降,接受使目標函式上公升的解的概率要逐漸減少;

(3)當溫度趨於零時,只能接受目標函式下降的解。

方法:狀態接受函式的引入是模擬退火演算法實現全域性搜尋的最關鍵的因素,模擬退火演算法中通常用 min[1,exp(-△c/t)]作為狀態接受函式。

初始溫度:

初始溫度、溫度更新函式、內迴圈終止準則和外迴圈終止準則通常被稱為退火歷程。

原則:通過理論分析可以得到初溫的解析式,但解決實際問題時難以得到精確的引數;實際應用時往往要讓初溫充分大。實驗表明:初溫越大,

獲得高質量解的機率越大,但花費較多的計算時間。

方法:(1)均勻抽樣一組狀態,以各狀態目標值的方差為初溫;

(2)隨機產生一組狀態,確定兩兩狀態間的最大目標差值,根據差值,利用一定的函式確定初溫,譬如 t0 =-△/lnpr,其中pr 為初始接受函式;

(3)利用經驗公式。

溫度更新函式:

溫度更細函式,即溫度的下降方式,用於在外迴圈中修改溫度值。

內迴圈終止準則:

常用的metropolis 抽樣準則:

(1)檢驗目標函式的均值是否穩定;

(2)連續若干步的目標值變化較小;

(3)按一定的步數抽樣。

外迴圈終止準則

(1)設定終止溫度的閾值;

(2)設定外迴圈迭代次數;

(3)演算法搜尋到的最優值連續若干步保持不變;

(4)概率分析方法。

模擬退火的基本思想:

(1) 初始化:初始溫度t(充分大),初始解狀態s(是演算法迭代的起點), 每個t值的迭代次數l

(2) 對k=1,……,l做第(3)至第6步:

(3) 產生新解s′

(4) 計算增量δt′=c(s′)-c(s),其中c(s)為評價函式

(5) 若δt′<0則接受s′作為新的當前解,否則以概率exp(-δt′/t)接受s′作為新的當前解.

(6) 如果滿足終止條件則輸出當前解作為最優解,結束程式。終止條件通常取為連續若干個新解都沒有被接受時終止演算法。

(7) t逐漸減少,且t->0,然後轉第2步。

以下是例項程式:

[plain]view plain

copy

print?

main.m 檔案  

zuobiao=[0.37 0.75 0.45 0.76 0.71 0.07 0.42 0.59 0.32 0.6 0.3 0.67 0.62 0.67 0.20 ...  

0.35 0.27 0.94 0.82 0.37 0.61 0.42 0.6 0.39 0.53 0.4 0.63 0.5 0.98 0.68;  

0.91 0.87 0.85 0.75 0.72 0.74 0.71 0.69 0.64 0.64 0.59 0.59 0.55 0.55 0.5...  

0.45 0.43 0.42 0.38 0.27 0.26 0.25 0.23 0.19 0.19 0.13 0.08 0.04 0.02 0.85];  

plot(zuobiao(1,:),zuobiao(2,:),'g*'),hold on  

plot(zuobiao(1,:),zuobiao(2,:))  

length=max(size(zuobiao));  

%求初始距離..  

zhixu=randperm(length);  %隨機生成乙個路線經過點的順序  

temp=zuobiao(1,:);  

newzuobiao(1,:)=temp(zhixu);  

temp=zuobiao(2,:);  

newzuobiao(2,:)=temp(zhixu);  

newzuobiao;  

f=juli(newzuobiao);  

%引數定義區--------------------------------------  

%初始溫度為10000  

tmax=100;  

tmin=0.001;  

%溫度下降速率  

down=0.95;  

%退火演算法的函式..  

figure  

t=tmax;  

while t>tmin    

for n=1:500  

newzuobiao=newpath(zuobiao,length);  

newf=juli(newzuobiao);  

if newfzuobiao=newzuobiao;  

f=newf;  

elseif   randzuobiao=newzuobiao;  

f=newf;  

end  

end  

huatu=[zuobiao,zuobiao(:,1)];  

plot(huatu(1,:),huatu(2,:)),hold on  

plot(huatu(1,:),huatu(2,:),'ro'),hold off  

pause(0.00001);  

t=t*down;  

f;  

end  

newpath.m 檔案(隨機的交換兩個點的座標)  

function zuobiao=newpath(zuobiao,length)  

%隨機交換兩個點的座標..  

a=ceil(rand(1,2)*length);  

qian=a(1);  

hou=a(2);  

temp=zuobiao(:,qian);  

zuobiao(:,qian)=zuobiao(:,hou);  

zuobiao(:,hou)=temp;  

juli.m 檔案(計算按某種方式圍成的圈的總路程)  

function lucheng=juli(zuobiao)  

length=max(size(zuobiao));  

s=0;  

for i=2:length  

s=s+sqrt(sum((zuobiao(:,i)-zuobiao(:,i-1)).^2));  

end  

if length~=2  

s=s+sqrt(sum((zuobiao(:,1)-zuobiao(:,length)).^2));  

end  

lucheng=s;  

模擬退火 解決 TSP 問題

tsp問題求解 n個城市之間有一定距離,現在讓選擇乙個城市出發,然後到達所有的城市,最後回到原點每個城市只到達一次,求出一條路徑並且求出最短的距離 tsp問題是乙個np問題,但是可以求近似解,通過模擬退火演算法實現,源 include include include include include ...

模擬退火演算法解決TSP例項

本文參考了以下文章 也建議直接去看他們的文章,我這裡只是提供了python版本的 和初學者需要的一些 注釋 模擬退火演算法理論 模擬退火演算法例項 關於模擬退火演算法之前只看理論,到頭來還是一知半解,而今抬手程式設計,發現很簡單的乙個例項就能讓你記得更牢,何樂而不為?原始碼是c 的,我看懂了之後通過...

TSP 模擬退火

都知道tsp是經典的np問題,從乙個點開始遍歷所有點,不重複,求最短路徑。可以用列舉終點,跑流量為2的最小費用,圖論來做,時間複雜度為 費用流已經用到堆優化了。顯然點,邊較多將無法承受。如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。先隨機生成一些解,然後隨機挑兩個點,開始試...