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在两个嵌套函数的声明中方便地假设了更广的范围。