1

matlabのfortranプログラムへのパラメータ入力をグローバルに最適化する必要があります。この関数は、次のように入力を受け入れます。matlabのFORTRAN関数の並列グローバル最適化

z= fort_fun(X,str) 

ここで、Xは10進数のベクトルで、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)を最適化します。

fort_fun(X、str(i)) ""を最適化するためにparforコマンドの各スレッドを構成できる方法を知っている人はいますか?私は、OMPのアナログは、strの入力に適用される "private"修飾子を使用すると考えています。

ありがとうございます!

答えて

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は、2つのネストされた関数の宣言において、より広い範囲を便利に想定しています。