matlab最短路径问题(旅行商模型)—模拟退火算法禁忌搜索算法解决中国省会间最短路径问题

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab最短路径问题(旅行商模型)—模拟退火算法禁忌搜索算法解决中国省会间最短路径问题相关的知识,希望对你有一定的参考价值。

matlab最短路径问题(模拟退火算法、禁忌搜索算法)

模拟退火算法

%%%  模拟退火算法源程序 
%  此题以中国31省会城市的最短旅行路径为例 
%  clear;clc; 
function [MinD,BestPath]=MainAneal(pn) 
% CityPosition存储的为每个城市的二维坐标x和y 
CityPosition=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;... 
               4196 1044;4312  790;4386  570;3007 1970;2562 1756;2788 1491;2381 
1676;... 
               1332  695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 
2838;... 
               4263 2931;3429 1908;3507 2376;3394 2643;3439 3201;2935 3240;3140 
3550;... 
               2545 2357;2778 2826;2370 2975]; 
figure(1); 
plot(CityPosition(:,1),CityPosition(:,2),'o') 
 
m=size(CityPosition,1);%城市的数目 
% 
D = sqrt((CityPosition(:,ones(1,m)) - CityPosition(:,ones(1,m))').^2 + ... 
         (CityPosition(:,2*ones(1,m)) - CityPosition(:,2*ones(1,m))').^2); 
path=zeros(pn,m); 
for i=1:pn 
    path(i,:)=randperm(m);  
end 
 
iter_max=100;%i 
m_max=5;%  
Len1=zeros(1,pn);Len2=zeros(1,pn);path2=zeros(pn,m); 
t=zeros(1,pn); 
T=1e5; tau=1e-5; 
N=1; 
while T>=tau         
      iter_num=1;  
      m_num=1;  
      while m_num<m_max && iter_num<iter_max 
            for i=1:pn 
                Len1(i)=sum([D(path(i,1:m-1)+m*(path(i,2:m)-1)) 
D(path(i,m)+m*(path(i,1)-1))]);  
                path2(i,:)=ChangePath2(path(i,:),m);  
                Len2(i)=sum([D(path2(i,1:m-1)+m*(path2(i,2:m)-1)) 
D(path2(i,m)+m*(path2(i,1)-1))]); 
            end 
            R=rand(1,pn); 
            if find((Len2-Len1<t&exp((Len1-Len2)/T)>R)~=0)                 
path(find((Len2-Len1<t&exp((Len1-Len2)/T)>R)~=0),:)=path2(find((Len2-Len1<t&exp((Len1-L
en2)/T)>R)~=0),:); %#ok<FNDSB> 
                
Len1(find((Len2-Len1<t&exp((Len1-Len2)/T)>R)~=0))=Len2(find((Len2-Len1<t&exp((Len1-Le
n2)/T)>R)~=0)); 
                [TempMinD,TempIndex]=min(Len1); 
                TracePath(N,:)=path(TempIndex,:); %#ok<AGROW> 
                Distance(N)=TempMinD; %#ok<AGROW> 
                N=N+1; 
                else 
                m_num=m_num+1; 
            end 
end 
            iter_num=iter_num+1; 
            T=T*0.9; 
end 
[MinD,Index]=min(Distance); 
BestPath=TracePath(Index,:);%disp(MinD) 
%画出路线图 
figure(2); 
plot(CityPosition(BestPath(1:end-1),1),CityPosition(BestPath(1:end-1),2),'r*-'); 
 
function p2=ChangePath2(p1,CityNum) 
while(1) 
     R=unidrnd(CityNum,1,2); 
     if abs(R(1)-R(2)) > 0 
         break; 
     end 
end 
I=R(1);J=R(2); 
if I<J 
   p2(1:I)=p1(1:I); 
   p2(I+1:J)=p1(J:-1:I+1); 
   p2(J+1:CityNum)=p1(J+1:CityNum); 
else 
   p2(1:J-1)=p1(1:J-1); 
   p2(J:I+1)=p1(I+1:-1:J); 
   p2(I:CityNum)=p1(I:CityNum); 
end 
 

禁忌搜索算法

%%%  禁忌搜索算法解决TSP问题  %此题以中国31省会城市的最短旅行路径为例 
%禁忌搜索是对局部领域搜索的一种扩展,是一种全局逐步寻优算法,搜索过程可以接受劣解,有较强的爬山能力.领域结构对收敛性有很大影响。 
function [BestShortcut,theMinDistance]=TabuSearch 
clear; 
clc; 
Clist=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;... 
    4196 1044;4312  790;4386  570;3007 1970;2562 1756;2788 1491;2381 1676;... 
    1332  695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;... 
    4263 2931;3429 1908;3507 2376;3394 2643;3439 3201;2935 3240;3140 3550;... 
    2545 2357;2778 2826;2370 2975]; 
CityNum=size(Clist,1);%TSP问题的规模,即城市数目 
dislist=zeros(CityNum);  
for i=1:CityNum 
    for j=1:CityNum 
        dislist(i,j)=((Clist(i,1)-Clist(j,1))^2+(Clist(i,2)-Clist(j,2))^2)^0.5;        
    end 
end 
TabuList=zeros(CityNum);% (tabu list) 
TabuLength=round((CityNum*(CityNum-1)/2)^0.5);%禁忌长度(tabu length) 
Candidates=200;%候选集的个数 (全部领域解个数) 
CandidateNum=zeros(Candidates,CityNum);%候选解集合 
S0=randperm(CityNum);%随机产生初始解 
BSF=S0; 
BestL=Inf; 
clf;  
figure(1); 
stop = uicontrol('style','toggle','string','stop','background','white'); 
tic; 
p=1; 
StopL=80*CityNum; 
while p<StopL 
    if Candidates>CityNum*(CityNum-1)/2 
        disp('候选解个数不大于n*(n-1)/2!'); 
        break; 
    end 
    ALong(p)=Fun(dislist,S0);      
     
    i=1; 
    A=zeros(Candidates,2); 
    while i<=Candidates         
        M=CityNum*rand(1,2); 
        M=ceil(M);         if M(1)~=M(2) 
            A(i,1)=max(M(1),M(2)); 
            A(i,2)=min(M(1),M(2)); 
                if i==1 
                isa=0; 
            else 
                for j=1:i-1 
                    if A(i,1)==A(j,1) && A(i,2)==A(j,2) 
                        isa=1; 
                        break; 
                    else 
                        isa=0; 
                    end 
                end 
            end  
            if ~isa 
               i=i+1; 
            else  
            end             
        else  
        end 
    end 
     
    BestCandidateNum=100;%保留前BestCandidateNum个最好候选解 
    BestCandidate=Inf*ones(BestCandidateNum,4); 
    F=zeros(1,Candidates); 
    for i=1:Candidates 
        CandidateNum(i,:)=S0; 
        CandidateNum(i,[A(i,2),A(i,1)])=S0([A(i,1),A(i,2)]); 
        F(i)=Fun(dislist,CandidateNum(i,:)); 
        if i<=BestCandidateNum 
            BestCandidate(i,2)=F(i); 
            BestCandidate(i,1)=i; 
            BestCandidate(i,3)=S0(A(i,1)); 
            BestCandidate(i,4)=S0(A(i,2));    
        else 
            for j=1:BestCandidateNum 
                if F(i)<BestCandidate(j,2) 
                    BestCandidate(j,2)=F(i); 
                    BestCandidate(j,1)=i; 
                    BestCandidate(j,3)=S0(A(i,1)); 
                    BestCandidate(j,4)=S0(A(i,2)); 
                    break; 
                end                         end 
        end 
    end 
    %对BestCandidate  
    [JL,Index]=sort(BestCandidate(:,2));  
    SBest=BestCandidate(Index,:); 
    BestCandidate=SBest; 
     
      if BestCandidate(1,2)<BestL 
        BestL=BestCandidate(1,2); 
        S0=CandidateNum(BestCandidate(1,1),:);         
        BSF=S0; 
        for m=1:CityNum 
            for n=1:CityNum 
                if TabuList(m,n)~=0 
                    TabuList(m,n)=TabuList(m,n)-1; 
                end 
            end 
        end 
        TabuList(BestCandidate(1,3),BestCandidate(1,4))=TabuLength; 
    else   
        for  
i=1:BestCandidateNum 
            if  TabuList(BestCandidate(i,3),BestCandidate(i,4))==0 
                S0=CandidateNum(BestCandidate(i,1),:);                 
            for m=1:CityNum 
                for n=1:CityNum 
                    if TabuList(m,n)~=0 
                        TabuList(m,n)=TabuList(m,n)以上是关于matlab最短路径问题(旅行商模型)—模拟退火算法禁忌搜索算法解决中国省会间最短路径问题的主要内容,如果未能解决你的问题,请参考以下文章

matlab解决TSP问题(货郎担问题,旅行商问题)的模拟退火算法

TSP基于matlab GUI模拟退火算法求解旅行商问题含Matlab源码 1083期

TSP基于matlab遗传和模拟退火算法求解中国省会城市旅行商问题含Matlab源码 1254期

配送路径规划基于matlab模拟退火算法求解单配送中心多客户多车辆最短路径规划问题含Matlab源码 1604期

路径规划蚁群算法求解两点最短路径matlab

模拟退火算法-旅行商问题-matlab实现