3

複数のファイルからなるプログラム複合体があり.mます。プログラムはそのうちの 1 つ (メイン) を呼び出して実行tests.mし、そこからoptFun.m別のパラメーターを計算する場所を呼び出します。これらのパラメータはwhileループ内で計算され、値が一定回数 (たとえば 4500) 変更されないと終了します。プログラムは正常に動作しますが、200 の異なる値のセットを取得するには、200 回実行する必要があります。さらに、12 コアを超えるコンピューターを使用できるため.m、ステートメントを含むメイン ファイルを少し変更してparfor、matlab の 12 ワーカーをデプロイしました。私の目標は、1 回のラウンドで 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');

matlab の 12 個のワーカーを実行しましたが、最適または正しい結果に到達する前にプログラムが停止したようです。whileループの4500回の繰り返しに達する前に、私のプログラムのパラメータソリューションが出力されているようです。私は12の異なるソリューションを取得しますが、一部の変数の値を共有する12のワーカーのように見えるため、他のワーカーがソリューションを十分に改善するか、それらのいくつかの合計が正しいソリューションと見なされると停止します。何が起こっているのかを理解するのを手伝ってもらえますか?

よろしくお願いします。

4

1 に答える 1

0

私は過去に同様の問題を抱えていました。for ループの「独立した」評価は、すべてが使用する共通変数を介して解の収束に関する情報を交換しないと確信していますか? convergence=zeros(1);たとえば、 の外側で を定義し、parforその後の optFun.m のすべての呼び出しで同じ変数を使用するようにします。これは、配列内に中間値を格納する関数にも適用される場合があります。

これが本当にあなたの問題であるかどうかはわかりませんが (コード サンプルはありません)、そうかもしれません。その場合、評価ごとに独立したコンテナーを作成することをお勧めします (たとえばzeros(NoEvals,NoThingsToStore)、データを互いに独立して保持するマトリックス)。

于 2013-01-22T19:50:11.493 に答える