1

我需要全局優化matlab中Fortran程序的參數輸入。該函數接受以如下方式輸入:MATLAB中FORTRAN函數的並行全局優化

z= fort_fun(X,str) 

當X是十進制數和STR的向量是一個字符串。我需要爲1020個str中的每一個識別對應於最優X的最小z值。我可以通過將str聲明爲全局變量,並在父腳本結尾處使用本地定義的函數來執行此過程。然而,爲了更及時地執行我的代碼(< 1個月),我想爲平行PARFOR如下運行這個程序:

parfor i=1:n 
     %code to setupt global optomization problem.... 
     z(i)=optimal output of --- fort_fun(X,str(i)) --- 
    end 

...存儲的z各自最終的優化值。如果我將str聲明爲全局變量,則parfor命令的每個線程將同時優化相同的str(i)。

有誰知道一種方法,我可以配置parfor命令的每個線程來優化「」fort_fun(X,str(i))「」?我相信OMP模擬將使用應用於str輸入的「私有」修飾符。

謝謝!

回答

0

經過一番挖掘,我想出了以下解決方案,它似乎工作。

parfor i=1:1019 
    str=str1(i,:); 
    [x1(i,:),x4(i,1)]=optimal(str,x0); 
end 

function [xf, z]=optimal(str,x0) 
    lb=[0,0,0]; 
    opts = optimoptions(@fmincon,'Algorithm','interior-point','FunctionTolerance',1E-4,... 
     'OptimalityTolerance',1E-4,'StepTolerance',1E-4); 
    problem = createOptimProblem('fmincon','objective',@resulto,'options',opts... 
     ,'x0',x0,'lb',lb); 
    gs = GlobalSearch('FunctionTolerance',1E-4,... 
     'XTolerance',1E-4) 
    [xf, z] = run(gs,problem); 
    function [result]=resulto(X) 
     result=fort_fun (X(1),X(2),X(3),str); 
    end 

end 

以上是代碼,適用於此問題中討論的一般情況。 MATLAB在兩個嵌套函數的聲明中方便地假設了更廣的範圍。