![]() |
(紧急求助)请问如何加快matlab执行速度?
各位好,我的TSP禁忌搜索程序运行起来非常慢,48个城市遍历的话要得到比较理想的结果得运行1个多小时...我听老师说把for循环用矩阵来表示会提高运算速度,可是我才疏学浅不知道怎么改,还请各位高手赐教,小丫头我感激不尽~我把程序贴在下面啦~
function TspTS clear All; [COLOR="Magenta"](城市坐标省略)[/COLOR] 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 |
回复: (紧急求助)请问如何加快matlab执行速度?
还有一小段刚才没让发,现在补上
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 |
所有时间均为北京时间。现在的时间是 14:28。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.