2012-03-02 107 views
2

我想寫一個簡單的通用並行代碼來最小化MATLAB中的函數。這個想法很簡單,主要有:優化,減少變量和MATLAB parfor

parfor k = 1:N 
    (...find a good solution xcurrent with cost fcurrent ...) 
    % keep best current value 
    fmin = min(fmin,fxcurrent) 
end 

這工作得很好,因爲FMIN是減少變量,因而我可以用這個結構來更新當前的最佳值。

但是,我無法找到保存(或存儲)最佳當前解決方案(「xcurrent」)的很好的優雅方式。

我如何跟蹤迄今爲止找到的最佳解決方案?換句話說,如果當前值嚴格小於fmin,如何保存xcurrent(受限於並行循環在MATLAB中施加的約束)?

[當然,串行版本是微不足道的,只是前面加上

if fxcurrent < fmin; 
xbest = xcurrent; 
end; 

但這並不在PARFOR循環工作。]

浮現在腦海中的一些方法:

  • 我可以只存儲所有的解決方案和成本(使用切片變量),但這是巨大的內存效率低下(迭代次數N非常大,而且解決方案本身非常大)。

  • 類似地,我可以使用一個(或集矩陣)減少變量和做:

    solutionset = [solutionset,xcurrent] 
    

但這幾乎是壞在存儲器需求方面。

  • 每當解決方案得到改進時,我也可以將xcurrent保存到磁盤。

我試圖尋找一個更簡單的解決方案,但沒有什麼是非常有用的。

這個問題似乎是明確的(所以它不像其他問題,輸出可能取決於迭代順序),但我找不到一個優雅的方式來做到這一點。

如果我錯過了明顯的事情,並提前致謝,請提前道歉!

+0

這取決於您通過「保持跟蹤」所瞭解的內容。你只是想要某種顯示,只是現在的價值 - 或者你需要整個開發?請澄清。 – bdecaf 2012-03-02 16:06:25

+0

謝謝。我只是想保存它,或者存儲它以備後用。我將編輯原始帖子以澄清。 – user1245359 2012-03-02 16:41:57

+0

起初我會建議保留所有xcurrent,然後再做最低限度的搜索。但是你寫了一些關於記憶的東西 - N太大了? – bdecaf 2012-03-02 18:22:07

回答

0

謝謝,所以我在這裏複製建議。

只是一個想法 - 如果你寫自己的約簡函數 - 基本上只包含if塊和一個保存或輸出?

+0

謝謝!看來這是「推薦」的方式。在文檔([鏈接](http://www.mathworks.de/help/toolbox/distcomp/brdqtjj-1.html))中,我找到了一個示例(在「使用自定義縮減功能」標題下),非常接近我想要做的事情。非常感謝! – user1245359 2012-03-03 21:50:47

0

無論如何,您大概需要在內存中維護多個xcurrent結構,因爲必須爲每個執行循環體的worker創建一個單獨的副本。我會嘗試將你的循環分成一個外部並行部分和一個內部連續部分 - 這將允許你將xcurrent的拷貝數分別調整到總迭代次數。

內部(串行)循環可以使用正常的if fxcurrent < fmin; xmin = xcurrent; end構造來更新其最佳解決方案,並且外部(並行)循環可以使用切片來存儲所有解決方案。作爲最後一步,您從(小)集合中選擇最佳解決方案。