Если у вас есть многоядерный процессор или доступ к сети процессоров, вы можете использовать функции Parallel Computing Toolbox™ с MultiStart. В этом примере показано, как найти несколько минимумов параллельно для проблемы, используя процессор с двумя ядрами. Проблема такая же, как в Multiple Local Minima Via MultiStart.
Запишите файл функции для вычисления цели:
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,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 подтверждает параллельную обработку в первой строке вывода, которая гласит: «Запуск локальных решателей параллельно».
Завершив работу, завершите работу параллельной среды:
delete(gcp) Parallel pool using the 'local' profile is shutting down.
Пример того, как получить лучшие решения этой проблемы, см. в разделе Пример: Поиск лучшего решения. Можно использовать параллельную обработку вместе с методиками, описанными в этом примере.
Результаты MultiStart прогоны стохастические. Хронометраж пробегов тоже стохастический. Тем не менее в нижеследующей таблице прослеживаются некоторые явные тенденции. Данные для таблицы получены из одного прогона в каждом числе начальных точек, на машине с двумя ядрами.
| Начальные точки | Параллельные секунды | Последовательные секунды |
|---|---|---|
| 50 | 3.6 | 3.4 |
| 100 | 4.9 | 5.7 |
| 200 | 8.3 | 10 |
| 500 | 16 | 23 |
| 1000 | 31 | 46 |
Параллельные вычисления могут быть медленнее, чем последовательные, если используется только несколько начальных точек. По мере увеличения числа начальных точек параллельные вычисления становятся все более эффективными, чем последовательные.
Существует множество факторов, влияющих на ускорение (или замедление) при параллельной обработке. Дополнительные сведения см. в разделе Повышение производительности с помощью параллельных вычислений.