1. 程式人生 > >模擬退火解TSP問題MATLAB代碼

模擬退火解TSP問題MATLAB代碼

func 問題 ... new font tla \n nat plot

分別把前四個函數存成m文件,再運行最後一個。

swap.m
function [ newpath , position ] = swap( oldpath , number )
% 對 oldpath 進 行 互 換 操 作
% number 為 產 生 的 新 路 徑 的 個 數
% position 為 對 應 newpath 互 換 的 位 置
m = length( oldpath ) ; % 城 市 的 個 數
newpath = zeros( number , m ) ;
position = sort( randi( m , number , 2 ) , 2 ); % 隨 機 產 生 交 換 的 位 置
for i = 1 : number
newpath( i , : ) = oldpath ;
% 交 換 路 徑 中 選 中 的 城 市
newpath( i , position( i , 1 ) ) = oldpath( position( i , 2 ) ) ;
newpath( i , position( i , 2 ) ) = oldpath( position( i , 1 ) ) ;
end


pathfare.m
function [ objval ] = pathfare( fare , path )
% 計 算 路 徑 path 的 代 價 objval
% path 為 1 到 n 的 排 列 ,代 表 城 市 的 訪 問 順 序 ;
% fare 為 代 價 矩 陣 , 且 為 方 陣 。
[ m , n ] = size( path ) ;
objval = zeros( 1 , m ) ;
for i = 1 : m
for j = 2 : n
objval( i ) = objval( i ) + fare( path( i , j - 1 ) , path( i , j ) ) ;
end
objval( i ) = objval( i ) + fare( path( i , n ) , path( i , 1 ) ) ;
end


distance.m
function [ fare ] = distance( coord )
% 根 據 各 城 市 的 距 離 坐 標 求 相 互 之 間 的 距 離
% fare 為 各 城 市 的 距 離 , coord 為 各 城 市 的 坐 標
[ v , m ] = size( coord ) ; % m 為 城 市 的 個 數
fare = zeros( m ) ;
for i = 1 : m % 外 層 為 行
for j = i : m % 內 層 為 列
fare( i , j ) = ( sum( ( coord( : , i ) - coord( : , j ) ) .^ 2 ) ) ^ 0.5 ;
fare( j , i ) = fare( i , j ) ; % 距 離 矩 陣 對 稱
end
end


myplot.m
function [ ] = myplot( path , coord , pathfar )
% 做 出 路 徑 的 圖 形
% path 為 要 做 圖 的 路 徑 ,coord 為 各 個 城 市 的 坐 標
% pathfar 為 路 徑 path 對 應 的 費 用
len = length( path ) ;
clf ;
hold on ;
title( [ ‘近似最短路徑如下,路程為‘ , num2str( pathfar ) ] ) ;
plot( coord( 1 , : ) , coord( 2 , : ) , ‘ok‘);
pause( 0.4 ) ;
for ii = 2 : len
plot( coord( 1 , path( [ ii - 1 , ii ] ) ) , coord( 2 , path( [ ii - 1 , ii ] ) ) , ‘-b‘);
x = sum( coord( 1 , path( [ ii - 1 , ii ] ) ) ) / 2 ;
y = sum( coord( 2 , path( [ ii - 1 , ii ] ) ) ) / 2 ;
text( x , y , [ ‘(‘ , num2str( ii - 1 ) , ‘)‘ ] ) ;
pause( 0.4 ) ;
end
plot( coord( 1 , path( [ 1 , len ] ) ) , coord( 2 , path( [ 1 , len ] ) ) , ‘-b‘ ) ;
x = sum( coord( 1 , path( [ 1 , len ] ) ) ) / 2 ;
y = sum( coord( 2 , path( [ 1 , len ] ) ) ) / 2 ;
text( x , y , [ ‘(‘ , num2str( len ) , ‘)‘ ] ) ;
pause( 0.4 ) ;
hold off ;


clear;
% 程 序 參 數 設 定
Coord = ... % 城 市 的 坐 標 Coordinates
[ 0.6683 0.6195 0.4    0.2439 0.1707 0.2293 0.5171 0.8732 0.6878 0.8488 ; ...
  0.2536 0.2634 0.4439 0.1463 0.2293 0.761  0.9414 0.6536 0.5219 0.3609 ] ;
t0 = 1 ; % 初 溫 t0
iLk = 20 ; % 內 循 環 最 大 叠 代 次 數 iLk
oLk = 50 ; % 外 循 環 最 大 叠 代 次 數 oLk
lam = 0.95 ; % λ lambda
istd = 0.001 ; % 若 內 循 環 函 數 值 方 差 小 於 istd 則 停 止
ostd = 0.001 ; % 若 外 循 環 函 數 值 方 差 小 於 ostd 則 停 止
ilen = 5 ; % 內 循 環 保 存 的 目 標 函 數 值 個 數
olen = 5 ; % 外 循 環 保 存 的 目 標 函 數 值 個 數
% 程 序 主 體
m = length( Coord ) ; % 城 市 的 個 數 m
fare = distance( Coord ) ; % 路 徑 費 用 fare
path = 1 : m ; % 初 始 路 徑 path
pathfar = pathfare( fare , path ) ; % 路 徑 費 用 path fare
ores = zeros( 1 , olen ) ; % 外 循 環 保 存 的 目 標 函 數 值
e0 = pathfar ; % 能 量 初 值 e0
t = t0 ; % 溫 度 t
for out = 1 : oLk % 外 循 環 模 擬 退 火 過 程
ires = zeros( 1 , ilen ) ; % 內 循 環 保 存 的 目 標 函 數 值
for in = 1 : iLk % 內 循 環 模 擬 熱 平 衡 過 程
[ newpath , v ] = swap( path , 1 ) ; % 產 生 新 狀 態
e1 = pathfare( fare , newpath ) ; % 新 狀 態 能 量
% Metropolis 抽 樣 穩 定 準 則
r = min( 1 , exp( - ( e1 - e0 ) / t ) ) ;
if rand < r
path = newpath ; % 更 新 最 佳 狀 態
e0 = e1 ;
end
ires = [ ires( 2 : end ) e0 ] ; % 保 存 新 狀 態 能 量
% 內 循 環 終 止 準 則 :連 續 ilen 個 狀 態 能 量 波 動 小 於 istd
if std( ires , 1 ) < istd
break ;
end
end
ores = [ ores( 2 : end ) e0 ] ; % 保 存 新 狀 態 能 量
% 外 循 環 終 止 準 則 :連 續 olen 個 狀 態 能 量 波 動 小 於 ostd
if std( ores , 1 ) < ostd
break ;
end
t = lam * t ;
end
pathfar = e0 ;
% 輸 入 結 果
fprintf( ‘近似最優路徑為:\n ‘ )
%disp( char( [ path , path(1) ] + 64 ) ) ;
disp(path)
fprintf( ‘近似最優路徑路程\tpathfare=‘ ) ;
disp( pathfar ) ;
myplot( path , Coord , pathfar ) ;

  

模擬退火解TSP問題MATLAB代碼