登录论坛

查看完整版本 : [MATLAB数学相关] (紧急求助)请问如何加快matlab执行速度?


yueerwan
2009-12-14, 21:52
各位好,我的TSP禁忌搜索程序运行起来非常慢,48个城市遍历的话要得到比较理想的结果得运行1个多小时...我听老师说把for循环用矩阵来表示会提高运算速度,可是我才疏学浅不知道怎么改,还请各位高手赐教,小丫头我感激不尽~我把程序贴在下面啦~
function TspTS
clear All;
(城市坐标省略)
for i=1:48
for j=1:48
DL48(i,j)=((city48(i,1)-city48(j,1))^2+(city48(i,2)-city48(j,2))^2)^0.5;
end
end
dislist=DL48;
Clist=city48;
CityNum=size(dislist,2);
Tlist=zeros(CityNum);%(tabu list)
cl=120;%保留前cl个最好解
bsf=Inf;
tl=ceil(CityNum^0.5);%(tabu length)
l1=220;%候选解个数,不大于n*(n-1)/2
S0=randperm(CityNum);
S=S0;
BSF=S0;
Si=zeros(l1,CityNum);
StopL=90*CityNum;
p=1;
clf;
figure(1);
stop = uicontrol('style','toggle','string','stop', ...
'background','white');
tic;
while (p<StopL)
if l1>CityNum*(CityNum)/2
disp('候选解个数,不大于n*(n-1)/2!系统自动退出!');
l1=(CityNum*(CityNum)/2)^.5;
break;
end
ArrS(p)=F(dislist,S);
i=1;
A=zeros(l1,2);
while i<=l1
M=CityNum*rand(1,2);
M=ceil(M);
if M(1)~=M(2)
m1=max(M(1),M(2));m2=min(M(1),M(2));
A(i,1)=m1;A(i,2)=m2;
if i==1
isdel=0;
else
for j=1:i-1
if A(i,1)==A(j,1)&&A(i,2)==A(j,2)
isdel=1;break;
else
isdel=0;
end
end
end
if ~isdel
i=i+1;
else i=i;
end
else i=i;
end
end
CL=Inf*ones(cl,4);
for i=1:l1
Si(i,:)=S;
Si(i,[A(i,1),A(i,2)])=S([A(i,2),A(i,1)]);
F(i)=F(dislist,Si(i,:));
if i<=cl
CL(i,2)=F(i);
CL(i,1)=i;
CL(i,3)=S(A(i,1));
CL(i,4)=S(A(i,2));
else
for j=1:cl
if F(i)<CL(j,2)
CL(j,2)=F(i);
CL(j,1)=i;
CL(j,3)=S(A(i,1));
CL(j,4)=S(A(i,2));
break;
end
end
end
end
if CL(1,2)<bsf%藐视准则(aspiration criterion)
bsf=CL(1,2);
S=Si(CL(1,1),:);
BSF=S;
for m=1:CityNum
for n=1:CityNum
if Tlist(m,n)~=0
Tlist(m,n)=Tlist(m,n)-1;
end
end
end
Tlist(CL(1,3),CL(1,4))=tl;
else
for i=1:cl
if Tlist(CL(i,3),CL(i,4))==0
S=Si(CL(i,1),:);
for m=1:CityNum
for n=1:CityNum
if Tlist(m,n)~=0
Tlist(m,n)=Tlist(m,n)-1;
end
end
end
Tlist(CL(i,3),CL(i,4))=tl;
break;
end
end
end
p=p+1;
Arrbsf(p)=bsf;
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)],'bo-');
title(['Counter : ',int2str(p*l1),' The Min Distance: ',num2str(bsf)]);
hold off;
pause(0.005);
if get(stop,'value')==1
break;
end
end
toc;
BestShortcut=BSF
theMinDistance=bsf
set(stop,'style','pushbutton','string','close',...
'callback','close(gcf)');
figure(2);
plot(Arrbsf,'r'); hold on;
plot(ArrS,'b');grid;
title('搜索过程');
legend('Best So Far','当前解');
end

yueerwan
2009-12-14, 21:53
还有一小段刚才没让发,现在补上
function F=F(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;
end