模拟退火算法和禁忌搜索算法的matlab源程序
WORD 格式可编辑 %%%模拟退火算法源程序 %此题以中国 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 0 break; end end I=R(1);J=R(2); if IJ 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 专业知识分享 WORD 格式可编辑 %%%禁忌搜索算法解决 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 pCityNum*(CityNum-1)/2 disp( 候选解个数不大于 n*(n-1)/2! ); break; end ALong(p)=Fun(dislist,S0); i=1; A=zeros(Candidates,2); while i=Candidates 专业知识分享 WORD 格式可编辑 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) 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; BestCandi