模拟退火算法和禁忌搜索算法的matlab源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%%% 模拟退火算法源程序
% 此题以中国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 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 path(find((Len2-Len1 Len1(find((Len2-Len1 [TempMinD,TempIndex]=min(Len1); TracePath(N,:)=path(TempIndex,:); %#ok Distance(N)=TempMinD; %#ok 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 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 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