このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
並列マルチスタート
並列マルチスタートの手順
マルチコア プロセッサをお持ちの場合、またはプロセッサ ネットワークにアクセスできる場合は、MultiStart
で Parallel Computing Toolbox™ 関数を使用できます。この例では、2 つのコアを持つプロセッサを使用して、問題に対して複数の最小値を並列に見つける方法を示します。問題は全体的または複数の局所的最小値を見つけると同じです。
目的関数を計算するための関数ファイルを作成します。
function f = sawtoothxy(x,y) [t r] = cart2pol(x,y); % change to polar coordinates h = cos(2*t - 1/2)/2 + cos(t) + 2; g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ... .*r.^2./(r+1); f = g.*h; end
問題構造を作成します。
problem = createOptimProblem('fminunc',... 'objective',@(x)sawtoothxy(x(1),x(2)),... 'x0',[100,-50],'options',... optimoptions(@fminunc,'Algorithm','quasi-newton'));
問題の構造を実行して検証します。
[x,fval] = fminunc(problem)
x = 8.4420 -110.2602 fval = 435.2573
MultiStart
オブジェクトを作成し、並列処理と反復表示を使用するようにオブジェクトを設定します。ms = MultiStart('UseParallel',true,'Display','iter');
並列処理を設定します。
parpool
Starting parpool using the 'local' profile ... connected to 4 workers. ans = Pool with properties: Connected: true NumWorkers: 4 Cluster: local AttachedFiles: {} IdleTimeout: 30 minute(s) (30 minutes remaining) SpmdEnabled: true
50 個の開始ポイントで問題を実行します。
[x,fval,exitflag,output,manymins] = run(ms,problem,50);
Running the local solvers in parallel. Run Local Local Local Local First-order Index exitflag f(x) # iter F-count optimality 17 2 3953 4 21 0.1626 16 0 1331 45 201 65.02 34 0 7271 54 201 520.9 33 2 8249 4 18 2.968 ... Many iterations omitted ... 47 2 2740 5 21 0.0422 35 0 8501 48 201 424.8 50 0 1225 40 201 21.89 MultiStart completed some of the runs from the start points. 17 out of 50 local solver runs converged with a positive local solver exit flag.
実行インデックスがランダムに見えることに注意してください。並列
MultiStart
は開始ポイントを予測できない順序で実行します。MultiStart
が出力の最初の行で並列処理を確認していることに注意してください。「ローカル ソルバーを並列で実行します。」完了したら、並列環境をシャットダウンします。
delete(gcp)
Parallel pool using the 'local' profile is shutting down.
この問題に対するより良い解決策を得る方法の例については、例: より良い解決策を求めて を参照してください。この例で説明した手法とともに並列処理を使用することもできます。
並列コンピューティングによる高速化
MultiStart
実行の結果は確率的です。実行のタイミングも確率的です。それでも、次の表にはいくつかの明確な傾向が表れています。表のデータは、2 つのコアを持つマシンで、開始ポイントの数ごとに 1 回実行して得られたものです。
スタート地点 | パラレルセコンド | シリアル秒 |
---|---|---|
50 | 3.6 | 3.4 |
100 | 4.9 | 5.7 |
200 | 8.3 | 10 |
500 | 16 | 23 |
1000 | 31 | 46 |
開始ポイントをいくつかだけ使用すると、並列コンピューティングはシリアルコンピューティングよりも遅くなる可能性があります。開始点の数が増えるにつれて、並列コンピューティングはシリアルコンピューティングよりもますます効率的になります。
並列処理による速度向上 (または速度低下) に影響する要因は多数あります。詳細については、並列計算によるパフォーマンスの向上を参照してください。