|
<>%this program is written by 刘学智. Finished time is 05.1.23 16:03 <BR>%utilizing it solving TSP problem by simulating stealing algorithm<BR>%[fval,route]=sa_tsp(d,10,0.1,.87)<BR>%d=[0 2 1 2 0 0 1 0 1 2 1 1 1 1<BR>%2 0 1 4 1 0 1 1 1 3 1 0 2 1<BR>%1 1 0 1 0 0 0 3 1 1 0 2 2 1<BR>%2 4 1 0 1 1 2 1 0 2 1 0 1 1<BR>%0 1 0 1 0 2 0 1 1 1 0 1 1 2<BR>%0 0 0 1 2 0 1 2 1 1 1 2 1 2<BR>%1 1 0 2 0 1 0 1 1 1 0 2 2 1<BR>%0 1 3 1 1 2 1 0 1 2 1 4 2 2<BR>%1 1 1 0 1 1 1 1 0 1 1 1 3 1<BR>%2 3 1 2 1 1 1 2 1 0 1 0 0 3<BR>%1 1 0 1 0 1 0 1 1 1 0 3 1 1<BR>%1 0 2 0 1 2 2 4 1 0 3 0 1 0<BR>%1 2 2 1 1 1 2 2 3 0 1 1 0 4<BR>%1 1 1 1 2 2 1 2 1 3 1 0 4 0];</P>
<>%the result is fval=2; route=14 9 4 13 10 12 2 6 3 11 7 5 1 8</P>
<>function [fval,route]=sa_tsp(d,t0,tf,alpha)<BR>%d is the distance matrix;t0,tf is the initial and finil temperature;<BR>%alpha is controling temperature coeffient<BR>n=length(d);%the number of cities<BR>L=100*n;%the length of Markov chain<BR>route=randperm(n);%the initial traveling route<BR>fval=value(route,d);%the initial goal value<BR>t=t0;ii=0;<BR>tic<BR>while t>tf<BR> for i=1<BR> [fval_after,route_after]=exchange(route,d);<BR> if fval_after<fval<BR> route=route_after;<BR> fval=fval_after;<BR> elseif exp((fval-fval_after)*2/t)>rand<BR> route=route_after;<BR> fval=fval_after;<BR> else route=route;<BR> fval=fval;<BR> end<BR> end<BR> t=alpha*t;<BR> ii=ii+1;fval_sequence(ii)=fval;<BR>end<BR>plot(1:ii,fval_sequence);%plot the convergence figure<BR>toc<BR>%----------------------------------------------------------------<BR>function fval=value(route,d)%used for reckoning the goal value of the selected traveling route<BR>n=length(d);<BR>fval=0;<BR>for i=1:n-1<BR> fval=fval+d(route(i),route(i+1));<BR>end<BR>%fval=fval+d(route(n),route(1));% if'%'is omited,it computes a circle,else<BR>%a chain------------------------------------------------------------------<BR>function [fval_after,route_after]=exchange(route,d)<BR>%changing traveling route by inversing the sequence between two selected 2 locations <BR>n=length(d);<BR>location1=ceil(n*rand);<BR>location2=ceil(n*rand);%the location of two exchanged number<BR>loc1=min(location1,location2);loc2=max(location1,location2);<BR>middle_route=fliplr(route(loc1:loc2));%the part route which has been exchanged<BR>route_after=[route(1:loc1-1) middle_route route(loc2+1:n)];%the after traveling route<BR>fval_after=value(route_after,d);<BR>%----------------------------------------------------------------</P> |
|