Параллельный MultiStart

Шаги для Parallel MultiStart

Если у вас есть многоядерный процессор или доступ к процессорной сети, можно использовать функции Parallel Computing Toolbox™ с MultiStart. Этот пример показывает, как найти несколько минимумов параллельно для задачи, используя процессор с двумя ядрами. Задача та же, что и в Multiple Local Minima Via MultiStart.

  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,eflag,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 запуски являются стохастическими. Время запусков также является стохастическим. Тем не менее некоторые явные тренды очевидны в следующей таблице. Данные для таблицы были получены из одного запуска в каждом количестве стартовых точек, на машине с двумя ядрами.

Начальные точкиПараллельные секундыПоследовательные секунды
503.63.4
1004.95.7
2008.310
5001623
10003146

Параллельные вычисления могут быть медленнее последовательных, когда вы используете всего несколько начальных точек. Когда количество начальных точек увеличивается, параллельные вычисления становятся все более эффективными, чем последовательные.

Существует много факторов, которые влияют на ускорение (или замедление) с параллельной обработкой. Для получения дополнительной информации смотрите Улучшение эффективности при параллельных вычислениях.

Похожие темы