2013-01-19 52 views
3

我有一個程序化合物的幾個.m文件。該程序運行調用其中一個(主)名爲tests.m,從那裏我打電話另一個optFun.m我在哪裏計算不同的參數。這些參數是在while循環內計算得出的,當它們的數值沒有多次變化時(例如4500),循環結束。 該程序工作正常,但我必須執行它像200次,以獲得200套不同的值。此外,我可以使用具有12個內核的計算機,因此我已經更改了主要的.m文件,包括parfor聲明,以部署12位matlab工作人員。我的目標是在一輪中獲得12種不同的解決方案(執行初始程序)。並行化程序

function [] = tests(Num) 
matlabpool open local 12; 
y = zeros(itermax,15); 
z = zeros(itermax,9); 
parfor i = 1:itermax 
    [iternum tTot SolOpt ImpCostMAX minABFmax ABFmax ImportCosteABS] =... 
      optFun(N, K, AntNum,... 
        q, eps, Rt, Rs, theta, maxiter,... 
        strcat(particad,num2str(i))); 
    y(i,:) = [ i; iternum; tTot; SolOpt; ImpCostMAX(1); ImpCostMAX(2);... 
       q; eps; N; K; AntNum; maxiter;... 
       SolOpt/ImpCostMAX(1); SolOpt/ImpCostMAX(2); SolOpt/N]; 
    z(i,:) = [ i; minABFmax(1); minABFmax(2); minABFmax(3); ABFmax(1);... 
       ABFmax(2); ABFmax(3);... 
       ImportCosteABS(1); ImportCosteABS(2)]; 
end %parfor 

matlabpool close; 
dlmwrite(nombre, y, 'delimiter', ' ','precision', '%9.5f'); 
dlmwrite(b, z, 'delimiter', ' ','precision', '%9.5f'); 

我已經運行了12名工人MATLAB的,但現在程序似乎停止達到最佳的或正確的結果之前。看來我的程序的參數解決方案在達到while循環的4500次迭代之前被輸出。 雖然我獲得了12個不同的解決方案看起來像12名工作人員共享某些變量的值,所以當其他工作人員改進解決方案時足以停止或者其中幾個人的總和被認爲是正確的解決方案。 你能幫我理解發生了什麼嗎?

非常感謝你提前 問候

+1

您可能想要提供一個代碼示例而不是描述代碼 –

+0

您能否確保實際上發生意外的行爲?因此,請將其中一個輸入/輸出組合分開運行,看看它是否真的不同。 –

+0

謝謝你的回答。我已經分開運行了,我意識到有什麼不對。我可以使用普通循環進行測試。該計劃需要一段時間才能獲得解決方案。感謝和問候。 – user1993416

回答

0

我已經在過去類似的問題。您確定for循環的「獨立」評估不通過它們都使用的通用變量來交換有關解決方案收斂的信息嗎?假設您在parfor之外定義convergence=zeros(1);,然後讓所有後續的optFun.m調用使用相同的變量。這可能也適用於存儲數組中的中間值的函數。

雖然我不能說這是否確實是你的問題(沒有代碼示例),它可能就是這樣。在這種情況下,我建議爲每個評估創建一個獨立的容器(例如,一個zeros(NoEvals,NoThingsToStore)矩陣,他們將保持數據彼此獨立)。

+0

嗨阿圖爾,我懷疑你是對的。我現在沒有看到什麼是共享變量,但我會做一些測試。 Funtion'tests.m'只設置一些參數並調用optFun.m。並且它們返回的值將它們保存在z()和y()數組中,每個worker都在一行中。 – user1993416