gusucode.com > 《MATLAB神经网络超级学习手册》随书光盘源码程序 > code/14/N14_1/N14_1.m

    clc
clear all; 
%设定城市坐标   
Coord = ...                      
     [ 0.6783 0.4195 0.6    0.2949 0.2727 0.4233 0.4174 0.7752 0.6778 0.7488 0.1621; ... 
       0.2236 0.1634 0.9439 0.2463 0.1293 0.561  0.6414 0.4536 0.7219 0.4609 0.4781] ;  
t0 = 1 ;                       %初始文图 
iLk = 30 ;                     %内循环迭代次数 
oLk = 60 ;                     %外循环最大迭代此时 
lam = 0.9 ;      
istd = 0.001 ;                 %若内循环函数值方差小于istd则停止 
ostd = 0.001 ;                 %若外循环函数值方差小于ostd则停止 
ilen = 5 ;                     %内循环保存的目标函数值个数 
olen = 5 ;                     %外循环保存的目标函数值个数 
%程序主体 
m = length( Coord ) ;          %城市的个数  
fare = distance( Coord ) ;     %路径费用
path = 1 : m ;                 %初始路径
pathfar = pathfare( fare , path ) ;      %路径费用
ores = zeros( 1 , olen ) ;               %外循环保存的目标函数值 
e0 = pathfar ;                           %能量初值 
t = t0 ;                                 %温度 
for out = 1 : oLk                        % 外循环模拟退火过程
     ires = zeros( 1 , ilen ) ;          %内循环保存的目标函数
     for in = 1 : iLk                    %内循环模拟热平衡过程 
         [ newpath , ~ ] = 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 ) ;