Если у вас есть многоядерный процессор или доступ к сети процессора, можно использовать функции Parallel Computing Toolbox™ с MultiStart. Этот пример показывает, как найти несколько минимумов параллельно для проблемы, с помощью процессора с двумя ядрами. Проблема эквивалентна в Нескольких Локальных Минимумах Через 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 |
Параллельные вычисления могут быть медленнее, чем последовательный, когда вы используете только несколько стартовых точек. Как количество увеличений стартовых точек, параллельные вычисления становятся все больше более эффективными, чем последовательный.
Существует много факторов, которые влияют на ускорение (или замедление) с параллельной обработкой. Для получения дополнительной информации смотрите Улучшающую Производительность с Параллельными вычислениями (Optimization Toolbox).