Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

並列マルチスタート

並列マルチスタートの手順

マルチコア プロセッサをお持ちの場合、またはプロセッサ ネットワークにアクセスできる場合は、MultiStart で Parallel Computing Toolbox™ 関数を使用できます。この例では、2 つのコアを持つプロセッサを使用して、問題に対して複数の最小値を並列に見つける方法を示します。問題は全体的または複数の局所的最小値を見つけると同じです。

  1. 目的関数を計算するための関数ファイルを作成します。

    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
  2. 問題構造を作成します。

    problem = createOptimProblem('fminunc',...
        'objective',@(x)sawtoothxy(x(1),x(2)),...
        'x0',[100,-50],'options',...
        optimoptions(@fminunc,'Algorithm','quasi-newton'));
  3. 問題の構造を実行して検証します。

    [x,fval] = fminunc(problem)
    x =
        8.4420 -110.2602
    
    fval =
      435.2573
  4. MultiStart オブジェクトを作成し、並列処理と反復表示を使用するようにオブジェクトを設定します。

    ms = MultiStart('UseParallel',true,'Display','iter');
  5. 並列処理を設定します。

    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
  6. 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 が出力の最初の行で並列処理を確認していることに注意してください。「ローカル ソルバーを並列で実行します。」

  7. 完了したら、並列環境をシャットダウンします。

    delete(gcp)
    Parallel pool using the 'local' profile is shutting down.

この問題に対するより良い解決策を得る方法の例については、例: より良い解決策を求めて を参照してください。この例で説明した手法とともに並列処理を使用することもできます。

並列コンピューティングによる高速化

MultiStart 実行の結果は確率的です。実行のタイミングも確率的です。それでも、次の表にはいくつかの明確な傾向が表れています。表のデータは、2 つのコアを持つマシンで、開始ポイントの数ごとに 1 回実行して得られたものです。

スタート地点パラレルセコンドシリアル秒
503.63.4
1004.95.7
2008.310
5001623
10003146

開始ポイントをいくつかだけ使用すると、並列コンピューティングはシリアルコンピューティングよりも遅くなる可能性があります。開始点の数が増えるにつれて、並列コンピューティングはシリアルコンピューティングよりもますます効率的になります。

並列処理による速度向上 (または速度低下) に影響する要因は多数あります。詳細については、並列計算によるパフォーマンスの向上を参照してください。

関連するトピック