2013-02-13 41 views
1

我在編碼一個簡單的Genetic Algorithm(GA)的過程。可能有無數的地方我不必要地使用了for循環。我想了解如何提高MATLAB效率以及如何回答我的問題。據我所知,我成功了,但我不確定。此代碼定義的區域是單點crossover如何在數組內將另一行的某一部分與另一部分交換?

這是我曾嘗試...

crossPoints=randi([1 24],popSize/2,1); 

for popNo=2:2:popSize 
    isolate=chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end); 
    isolate([1 2],:)=isolate([2 1],:); 
    chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end)=isolate; 
end 

chromoChild=chromoParent; 
  • 其中,「交叉點」是在該點兩個二進制之間的單點交叉 編碼爲chromosomes是必需的。
  • 「popSize」是population的大小,通過我的代碼需要 是偶數
  • 「分離」定義的它們都需要彼此
  • 「chromoParent被交換 2行的部分'是被要求是 由單點交叉
  • 改變初始羣體‘chromoChild’被所得的人口
  • 兩個‘chromoParent’和‘chromoChild’由 大小的數組來表示,popSize×25二進制字符

你能指出我在思考這個問題的方式有錯誤?什麼是最有效的方法(在計算時間)實現相同的事情?如果你可以儘可能廣泛,這將有助於我開始將我在這裏學習的原則應用於我的其他代碼。

謝謝。

回答

2

您的代碼看起來不錯。如果你願意,你可以通過一些非常簡單的索引減少環路一行說明:

chromoParent( popNo-1:popNo, crossPoints(popNo/2,1)+1:end) = ... 
    chromoParent(popNo:-1:popNo-1,crossPoints(popNo/2,1)+1:end); 

這可能是稍快,但與任何優化,你應該先簡介它(我的猜測是這些線對整個CPU時間的貢獻很小)。

+0

不知道你所說的什麼'你應該第一個配置文件它。如果這是一個簡單的概念,你可以告訴我嗎?或者如果涉及更多,也許你可以指向我一個很好的資源。謝謝。 – 2013-02-13 23:20:07

+2

@DeanKayton:當您配置文件代碼,你測量每行的執行時間,它允許你確定你的代碼的瓶頸。 [這裏的文件鏈接到Matlab的分析器(http://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html) – Jonas 2013-02-13 23:29:54

相關問題