parfeval
を使用したバックグラウンドでの関数の評価
この例では、parfeval
を使用してバックグラウンドで関数を評価することにより、単純な最適化の問題を解決する方法を示します。結果が利用可能になったときに結果を収集し、結果が良好な場合に最適化ループを早期に終了することができます。
後で同じ計算を再現するために、乱数発生器のシードに既定値を使用します。
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
候補のセットごとにバックグラウンドで目的関数を評価します。効率性を高めるため、future オブジェクトの配列を事前に割り当てます。
futures(1:numIterations) = parallel.FevalFuture; for i = 1:numIterations futures(i) = parfeval(objFun,1,xCandidates(i,:)); end
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to parallel pool with 6 workers.
結果が利用可能になったら結果を取得し、新しい最小値が見つかった場合に関数の最小値とインデックスを更新します。最小値が一定のしきい値未満である場合は、ループを早期に終了します。
for idx = 1:numIterations [completedIndex, fval] = fetchNext(futures); if fval < minFval minFval = fval; minIndex = completedIndex; end if minFval <= 0.01 fprintf("Minimum found at x = [%f,%f]\n", ... xCandidates(minIndex,1),xCandidates(minIndex,2)); break; end end
Minimum found at x = [0.031833,0.093820]
残りの future をキャンセルします。
cancel(futures);
clear futures;
見つかった最適解を表示します。
fprintf("Best solution found: x = [%f,%f], fval = %f\n", ... xCandidates(minIndex,1),xCandidates(minIndex,2),minFval);
Best solution found: x = [0.031833,0.093820], fval = 0.009816