[問題] 我寫的程式跑好久已回收

看板MATLAB作者 (ICK)時間15年前 (2010/06/07 14:42), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串1/1
各位大大好 我想請問個小問題, 這是一個ACO,去找w參數解的問題.. 我看別人的paper, 跑1000的iteration大概20 CPU Time就跑出F=0.6的w了 但我的花了iteration為1000,大概跑出F=0.001的w. 而且要花600 的CPU Time = = 各位大大,請問問題在哪? 我想了好久. XD 是使用的資料數太多還是? 幫我抓到問題點,小弟我給他五百P幣..Orz BestRegards ------------------------------------ clear all; tic; U=[-24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]; for ci=1:49 U(2,ci)=1; end Best_UU(1,1:49)=U(1,1:49); for d2=1:49 Best_UU_index(1,d2)=d2; end Best_F=0; F_Time=0; for ci=1:600 yd(ci)=0.1*sin(pi*ci/100); end PMAT(1:49,1:49)=1; for pk2=1:49 PMAT(pk2,pk2)=0; end PMAT_0(1,1:49)=1; for iteration=1:500 y(1)=0; Best_UU_index(2,1:49)=1; %依照上一次的最佳路徑亂數跑出十隻ant,此十ant會跟上一次的最佳路徑差一點點 for k=1:10 for m=1:49 if m==1 Tij=PMAT_0(1,Best_UU_index(1,m)); Tsum=sum(PMAT_0(1,1:49)); Tr=Tsum*rand(1); c=1;Taco=0; Taco=Tij+Taco; while Taco<Tr Taco=Tij+Taco; c=c+1; end Hint=Best_UU_index(1,m)+c-1; Hint=rem(Hint,50); if Hint==0 Hint=1; end while Best_UU_index(2,Hint)==0 && sum(Best_UU_index(2,1:49))~=0 Hint=rem(Hint+1,50); if Hint==0 Hint=1; end end UU_index(k,m)=Hint; UU(k,m)=U(1,Hint); Best_UU_index(2,Hint)=0; else Tij=PMAT(Best_UU_index(1,m-1),Best_UU_index(1,m)); Tsum=sum(PMAT(Best_UU_index(1,m-1),1:49)); Tr=Tsum*rand(1); c=1;Taco=0; Taco=Tij+Taco; while Taco<Tr Taco=Tij+Taco; c=c+1; end Hint=Best_UU_index(1,m)+c-1; Hint=rem(Hint,50); if Hint==0 Hint=1; end while Best_UU_index(2,Hint)==0 && sum(Best_UU_index(2,1:49))~=0 Hint=rem(Hint+1,50); if Hint==0 Hint=1; end end UU_index(k,m)=Hint; UU(k,m)=U(1,Hint); Best_UU_index(2,Hint)=0; end end Best_UU_index(2,1:49)=1; for ci=1:600 e(ci)=(yd(ci)-y(ci)); if ci==1 te(ci)=0; else te(ci)=e(ci)-e(ci-1); end u(ci)=evalNFN(2*e(ci),5*te(ci),UU(k,1:49)); y(ci+1)=y(ci)/(1+y(ci)*y(ci))+u(ci)*u(ci)*u(ci); end F_initi(k)=1/sum(e); end [F,F_max_k_index]=max(F_initi); %Peromon MATR Best_F=F; Best_UU=UU(F_max_k_index,1:49); Best_UU_index(1,1:49)=UU_index(F_max_k_index,1:49); F_Time=F_Time+1; %先把所PMAT裡的值蒸發 PMAT_0(1,1:49)=0.9*PMAT_0(1,1:49); PMAT(1:49,1:49)=0.9*PMAT(1:49,1:49); %PMAT的最佳路徑更新 PMAT_0(1,Best_UU_index(1,1))=PMAT_0(1,Best_UU_index(1,1))+0.1*Best_F; for pk3=1:48 PMAT(Best_UU_index(1,pk3),Best_UU_index(1,pk3+1))=PMAT(Best_UU_index(1,pk3),Best_UU_index(1,pk3+1))+0.1*Best_F; end end PMAT_0_save=PMAT_0; PMAT_save=PMAT; nainal_trip_index(1,1:49)=0; nainal_trip_nuber(1,1:49)=0; %取出最好的trip index [nainal_trip_nuber(1),nainal_trip_index(1)]=max(PMAT_0(1,1:49)); PMAT_0(1,nainal_trip_index(1))=0; PMAT(1:49,nainal_trip_index(1))=0; for pk7=1:49 [nainal_trip_nuber(pk7+1),nainal_trip_index(pk7+1)]=max(PMAT(nainal_trip_index(pk7),1:49)); PMAT(1:49,nainal_trip_index(pk7+1))=0; end %轉成nuro FUZZY 的w for pk8=1:49 w(pk8)=U(1,nainal_trip_index(pk8)); end comp(1,1:49)=w; comp(2,1:49)=Best_UU; toc; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.216.71 ※ 編輯: psw 來自: 140.116.216.71 (06/07 15:00)

06/07 15:05, , 1F
不清楚你做的東西. 但是你的 for loop 好像有點多
06/07 15:05, 1F
是啊..我也是逼不得已的...XD ※ 編輯: psw 來自: 140.116.216.71 (06/07 16:30)

06/07 16:38, , 2F
先練習把最前面兩個for loop去掉吧。
06/07 16:38, 2F

06/07 16:38, , 3F
跑一下profile看bottle neck在哪裡。
06/07 16:38, 3F
是evalNFN這個function佔用最多次的時間.. 而且高逹5萬次的呼叫.. 這個function是去估計每一個ant的fitness,是很重要的部份,裡面也精減到不行了 不太可能對他再修改了.. (淚奔) 〒△〒 ※ 編輯: psw 來自: 140.116.216.71 (06/07 17:10) ※ 編輯: psw 來自: 140.116.216.71 (06/07 19:42)
文章代碼(AID): #1C39JOW_ (MATLAB)