parfeval を使用したバックグラウンドでの関数の評価
この例では、parfeval を使用してバックグラウンドで関数を評価することにより、単純な最適化の問題を解決する方法を示します。parfeval を使用してバックグラウンドで関数を評価する際には、Future オブジェクトを作成します。結果が利用可能になったときに結果を収集し、結果が良好な場合に最適化ループを早期に終了することができます。
後で同じ計算を再現するために、乱数発生器のシードに既定値を使用します。
rng("default")目的関数 objFun は、行ベクトル x を入力として取り、関数の出力を表すスカラー値を返します。目的関数と、最適化ループの反復回数を定義します。目的関数を評価する x 値の候補をランダムに生成します。最小値とインデックス変数を初期化します。
objFun = @(x) x(1)^2 + x(2)^2; numIterations = 500; xCandidates = rand(numIterations,2); minFval = inf; minIndex = inf;
parfeval を使用して、x 候補のセットごとにバックグラウンドで目的関数を評価します。
parfeval を使用してバックグラウンドで計算を実行するときに、この関数は各計算について Future オブジェクトを作成し、プールのキューに追加します。ワーカーがアイドルになるまで、future はキューに残ります。ワーカーがアイドルになると、キューが空でない場合は future の計算が開始されます。ワーカーが future を完了すると、future はキューから削除され、そのワーカーはアイドルになります。
効率性を高めるため、Future オブジェクトの配列を事前に割り当てます。
f(1:numIterations) = parallel.FevalFuture; for i = 1:numIterations f(i) = parfeval(objFun,1,xCandidates(i,:)); end
Starting parallel pool (parpool) using the 'Processes' profile ... 08-Jul-2024 15:36:55: Job Queued. Waiting for parallel pool job with ID 26 to start ... Connected to parallel pool with 6 workers.
future が完了すると、その State プロパティは 'finished' になり、Read プロパティは false になります。fetchNext 関数を使用すると、処理が完了した時点で future から結果を取得できます。fetchNext が配列 f 内の次の未読の future からの出力を取得すると、MATLAB はその future の Read プロパティを true に設定します。
前と同じ反復回数で for ループを実行します。各反復で、fetchNext を使用して次の完了した future のインデックスと値を取得します。次に、新しい値と既存の最小値を比較し、より小さい値が見つかった場合に最小値とそのインデックスを更新します。
0.01 以下の値が見つかった場合は、解を表示してループを早期に終了します。
for idx = 1:numIterations [completedIndex, fval] = fetchNext(f); if fval < minFval minFval = fval; minIndex = completedIndex; end if minFval <= 0.01 fprintf("Best solution found: x = [%f,%f], fval = %f\n", ... xCandidates(minIndex,1),xCandidates(minIndex,2),minFval); break; end end
Best solution found: x = [0.031833,0.093820], fval = 0.009816
残りの future をキャンセルします。
cancel(f);
clear f;