Этот пример показывает важность выбора соответствующего решателя для задач оптимизации. Это также показывает, что одна точка негладкости может вызвать проблемы для решателей Optimization Toolbox™.
В целом таблицы решений решателя дают представление, на котором решатель, вероятно, будет работать лучше всего на вашу проблему. Для сглаженных проблем см. Таблицу решений Оптимизации (Optimization Toolbox). Для несглаженных проблем см. Таблицу для Выбора Solver сначала, и для получения дополнительной информации консультируйтесь с Характеристиками Решателя Global Optimization Toolbox.
Функция несглаженно в точке 0, которая является точкой минимизации. Вот 2D график с помощью матричной нормы для точки 4-D .
figure x = linspace(-5,5,51); [xx,yy] = meshgrid(x); zz = zeros(size(xx)); for ii = 1:length(x) for jj = 1:length(x) zz(ii,jj) = sqrt(norm([xx(ii,jj),yy(ii,jj);0,0])); end end surf(xx,yy,zz) xlabel('x(1)') ylabel('x(2)') title('Norm([x(1),x(2);0,0])^{1/2}')
Этот пример использует матричную норму для матричного x
2 на 6. Матричная норма относится к сингулярному разложению, которое не так сглаженно как Евклидова норма. Смотрите 2-норму Матрицы (MATLAB).
patternsearch
patternsearch
является рекомендуемым первым решателем, который попробует за несглаженные проблемы. См. Таблицу для Выбора Решателя. Запустите patternsearch
с ненулевого матричного x0
2 на 6 и попытайтесь определить местоположение минимума . Для этой попытки и всех других, используют опции решателя по умолчанию.
Возвратите решение, которое должно быть близким нулем, значением целевой функции, которое должно аналогично быть близким нулем и количеством функциональных взятых оценок.
fun = @(x)norm([x(1:6);x(7:12)])^(1/2);
x0 = [1:6;7:12];
rng default
x0 = x0 + rand(size(x0))
x0 = 2×6
1.8147 2.1270 3.6324 4.2785 5.9575 6.1576
7.9058 8.9134 9.0975 10.5469 11.9649 12.9706
[xps,fvalps,eflagps,outputps] = patternsearch(fun,x0);
Optimization terminated: mesh size less than options.MeshTolerance.
xps,fvalps,eflagps,outputps.funccount
xps = 2×6
10-4 ×
0.1116 -0.1209 0.3503 -0.0520 -0.1270 0.2031
-0.3082 -0.1526 0.0623 0.0652 0.4479 0.1173
fvalps = 0.0073
eflagps = 1
ans = 10780
patternsearch
достигает хорошего решения, как проявлено выходным флагом 1. Однако это принимает 10 000 функциональных оценок, чтобы сходиться.
fminsearch
Документация утверждает, что fminsearch
иногда может обрабатывать разрывы, таким образом, это - разумная опция.
[xfms,fvalfms,eflagfms,outputfms] = fminsearch(fun,x0);
Exiting: Maximum number of function evaluations has been exceeded - increase MaxFunEvals option. Current function value: 3.197063
xfms,fvalfms,eflagfms,outputfms.funcCount
xfms = 2×6
2.2640 1.1747 9.0693 8.1652 1.7367 -1.2958
3.7456 1.2694 0.2714 -3.7942 3.8714 1.9290
fvalfms = 3.1971
eflagfms = 0
ans = 2401
Используя опции по умолчанию, fminsearch
исчерпывает функциональные оценки, прежде чем он будет сходиться к решению. Выйдите флаг 0 указывает на это отсутствие сходимости. Решение, о котором сообщают, плохо.
particleswarm
particleswarm
рекомендуется как следующий решатель попробовать. Смотрите Выбор Между Решателями для Несглаженных проблем.
[xpsw,fvalpsw,eflagpsw,outputpsw] = particleswarm(fun,12);
Optimization ended: relative change in the objective value over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
xpsw,fvalpsw,eflagpsw,outputpsw.funccount
xpsw = 1×12
10-12 ×
-0.0386 -0.1282 -0.0560 0.0904 0.0771 -0.0541 -0.1189 0.1290 -0.0032 0.0165 0.0728 -0.0026
fvalpsw = 4.5222e-07
eflagpsw = 1
ans = 37200
particleswarm
находит еще более точное решение, чем patternsearch
, но принимает 35 000 функциональных оценок. Выйдите флаг 1 указывает, что решение хорошо.
ga
ga
является популярным решателем, но не рекомендуется как первый решатель попробовать. Смотрите, как хорошо это работает над этой проблемой.
[xga,fvalga,eflagga,outputga] = ga(fun,12);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
xga,fvalga,eflagga,outputga.funccount
xga = 1×12
-0.0061 -0.0904 0.0816 -0.0484 0.0799 -0.1925 0.0048 0.3581 0.0848 0.0232 0.0237 -0.1294
fvalga = 0.6257
eflagga = 1
ans = 68600
ga
не находит столь же хорошее решение как patternsearch
или particleswarm
, и берет о вдвое большем количестве функциональных оценок в качестве particleswarm
. Выйдите флаг 1 вводит в заблуждение в этом случае.
fminunc
от Optimization Toolboxfminunc
не рекомендуется для несглаженных функций. Смотрите, как это выполняет на этом.
[xfmu,fvalfmu,eflagfmu,outputfmu] = fminunc(fun,x0);
Local minimum possible. fminunc stopped because the size of the current step is less than the value of the step size tolerance.
xfmu,fvalfmu,eflagfmu,outputfmu.funcCount
xfmu = 2×6
-0.5844 -0.9726 -0.4356 0.1467 0.3263 -0.1002
-0.0769 -0.1092 -0.3429 -0.6856 -0.7609 -0.6524
fvalfmu = 1.1269
eflagfmu = 2
ans = 442
Решение fminunc
не так хорошо как решение ga
. Однако fminunc
достигает довольно плохого решения в относительно немногих функциональных оценках. Выйдите из флага 2 средних значения, необходимо заботиться, условия оптимальности первого порядка не соблюдают в решении, о котором сообщают.
fmincon
от Optimization Toolboxfmincon
может иногда минимизировать несглаженные функции. Смотрите, как это выполняет на этом.
[xfmc,fvalfmc,eflagfmc,outputfmc] = fmincon(fun,x0);
Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
xfmc,fvalfmc,eflagfmc,outputfmc.funcCount
xfmc = 2×6
10-9 ×
-0.0891 0.0840 -0.0830 0.0869 0.1062 0.0682
0.1168 -0.0740 -0.0239 -0.0461 -0.0520 -0.0683
fvalfmc = 1.4435e-05
eflagfmc = 2
ans = 991
fmincon
с опциями по умолчанию производит точное решение меньше чем после 1 000 функциональных оценок. Выйдите флаг 2 не означает, что решение неточно, но что условия оптимальности первого порядка не соблюдают. Это вызвано тем, что градиент целевой функции не является нулем в решении.
Выбор соответствующего решателя приводит к лучше, более быстрые результаты. Эти сводные данные показывают, насколько разрозненный результаты могут быть. Качеством решения является 'Poor'
, если значение целевой функции больше, чем 0,1, 'Good'
, если значение меньше, чем 0,01, и 'Mediocre'
в противном случае.
Solver = {'patternsearch';'fminsearch';'particleswarm';'ga';'fminunc';'fmincon'}; SolutionQuality = {'Good';'Poor';'Good';'Poor';'Poor';'Good'}; FVal = [fvalps,fvalfms,fvalpsw,fvalga,fvalfmu,fvalfmc]'; NumEval = [outputps.funccount,outputfms.funcCount,outputpsw.funccount,... outputga.funccount,outputfmu.funcCount,outputfmc.funcCount]'; results = table(Solver,SolutionQuality,FVal,NumEval)
results=6×4 table
Solver SolutionQuality FVal NumEval
_______________ _______________ __________ _______
'patternsearch' 'Good' 0.0072656 10780
'fminsearch' 'Poor' 3.1971 2401
'particleswarm' 'Good' 4.5222e-07 37200
'ga' 'Poor' 0.62572 68600
'fminunc' 'Poor' 1.1269 442
'fmincon' 'Good' 1.4435e-05 991
Другое представление результатов.
figure hold on for ii = 1:length(FVal) clr = rand(1,3); plot(NumEval(ii),FVal(ii),'o','MarkerSize',10,'MarkerEdgeColor',clr,'MarkerFaceColor',clr) text(NumEval(ii),FVal(ii)+0.2,Solver{ii},'Color',clr); end ylabel('FVal') xlabel('NumEval') title('Reported Minimum and Evaluations By Solver') hold off
В то время как particleswarm
достигает самого низкого значения целевой функции, он делает так путем принятия в три раза больше функциональных оценок, чем patternsearch
, и более чем в 30 раз больше, чем fmincon
.
fmincon
обычно не рекомендуется для несглаженных проблем. Это эффективно в этом случае, но этот случай имеет всего одну несглаженную точку.