禁忌搜尋演算法(Tabu Search)
阿新 • • 發佈:2019-02-11
由7層不同的絕緣材料構成的一種絕緣體,應如何排列順序,可獲得最好的絕緣效能。
編碼方式:順序編碼
初始編碼:2-5-7-3-4-6-1
目標值:極大化目標值。
鄰域移動:兩兩交換
TabuSize:3 NG:5
四、TS演算法解決TSP問題:
%%一個旅行商人要拜訪全國31個省會城市,且每個城市只能拜訪一次,求所有路徑之中的最小值 %%%禁忌搜尋演算法求解TSP問題%%%%%%%%%%%%%%%%%%%%% 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];%全國31個省會城市座標 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; %best so far; BestL=Inf; %當前最佳解距離 p=1; %記錄迭代次數 StopL=2000; %最大迭代次數 figure(1); stop = uicontrol('style','toggle','string'... ,'stop','background','white'); tic; %用來儲存當前時間 %%%%%%%%%%%%%%%%%%%%%%禁忌搜尋迴圈%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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的 是生成隨機的200 X 2 的矩陣矩陣A。每一個元素都是在1-31之間的 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); %這相當於是產生一個S0的鄰域... 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)-1; % 更新禁忌表 end end end TabuList(BestCandidate(i,3),BestCandidate(i,4))=TabuLength; % 更新禁忌表 break; end end end ArrBestL(p)=BestL; for i=1:CityNum-1 plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'bo-'); hold on; end plot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2)],'ro-'); title(['迭代次數:',int2str(p),' 優化最短距離:',num2str(BestL)]); hold off; pause(0.005); if get(stop,'value')==1 break; end %儲存中間結果為圖片 if (p==1||p==5||p==10||p==20||p==60||p==150||p==400||p==800||p==1500||p==2000) filename=num2str(p); fileformat='jpg'; saveas(gcf,filename,fileformat); end p=p+1; %迭代次數加1 end toc; %用來儲存完成時間 BestShortcut=BSF; %最佳路線 theMinDistance=BestL; %最佳路線長度 set(stop,'style','pushbutton','string','close', 'callback','close(gcf)'); figure(2); plot(ArrBestL,'b'); xlabel('迭代次數'); ylabel('目標函式值'); title('適應度進化曲線'); grid; hold on; %%figure(3) %%plot(toc-tic,'b'); %%grid; %%title('執行時間'); %%legend('Best So Far','當前解');
%%%%%適配值函式%%%%%%%%%%%%%%%%%%%%%
function F=Fun(dislist,s)
DistanV=0;
n=size(s,2);
for i=1:(n-1)
DistanV=DistanV+dislist(s(i),s(i+1));
end
DistanV=DistanV+dislist(s(n),s(1));
F=DistanV;