模拟退火算法和禁忌搜索算法的matlab源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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-Len1R)~=0)

path(find((Len2-Len1R)~=0),:)=path2(find((Len2-Len1R)~=0),:); %#ok

Len1(find((Len2-Len1R)~=0))=Len2(find((Len2-Len1R)~=0));

[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

相关文档
最新文档