В этом примере показана важность выбора подходящего решателя для задач оптимизации. Это также показывает, что одна точка неравномерности может вызвать проблемы для решателей Optimization Toolbox™.
Как правило, таблицы решений решателя содержат указания, какой решатель, скорее всего, лучше всего подойдет для решения проблемы. Сведения о проблемах сглаживания см. в разделе Таблица решений по оптимизации. Для получения дополнительной информации см. раздел Таблица для выбора решателя, а также дополнительные сведения см. в разделе Характеристики решателя панели инструментов глобальной оптимизации.
Функция | | 1/2 несимметрична в точке 0, которая является точкой минимизации. Вот график 2-D с использованием матричной нормы для 1) x (2) 00].
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}')
![Figure contains an axes. The axes with title Norm([x(1),x(2);0,0])^{1/2} contains an object of type surface.](../examples/globaloptim/win64/SolverPerformanceWithANonsmoothProblemExample_01.png)
В этом примере используется норма матрицы для матрицы 2 на 6 x. Матричная норма относится к сингулярному разложению, которое не так гладко, как евклидова норма. См. раздел 2-Norm матрицы.
patternsearchpatternsearch является рекомендуемым первым решателем, который пытается решить проблемы, не связанные с работой. См. раздел Таблица для выбора решателя. Начать patternsearch из ненулевой матрицы 2 на 6 x0и попытайтесь найти минимальное значение f. Для этой попытки и для всех остальных используйте опции решателя по умолчанию.
Верните решение, которое должно быть около нуля, значение целевой функции, которое также должно быть около нуля, и количество выполненных оценок функций.
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 указывает на отсутствие сходимости. Решение, о котором сообщается, является плохим.
particleswarmparticleswarm рекомендуется в качестве следующего решателя. См. Выбор между решателями для неконтактных проблем.
[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 указывает, что решение является хорошим.
gaga является популярным решателем, но не рекомендуется в качестве первого решателя. Посмотрите, как хорошо это работает над этой проблемой.
[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 = 65190
ga не находит такого хорошего решения, как patternsearch или particleswarmи занимает примерно в два раза больше оценок функций, чем particleswarm. Флаг выхода 1 вводит в заблуждение в данном случае.
fminunc из панели инструментов оптимизацииfminunc не рекомендуется для несмутных функций. Посмотрите, как он работает на этом.
[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 = 429
fminunc решение не так хорошо, как ga решение. Однако fminunc достигает довольно плохого решения при относительно немногих оценках функций. Флаг выхода 2 означает, что вы должны быть осторожны, условия оптимальности первого порядка не выполняются в сообщаемом решении.
fmincon из панели инструментов оптимизацииfmincon иногда может минимизировать несмотные функции. Посмотрите, как он работает на этом.
[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-10 ×
-0.1407 0.8738 0.9526 0.5668 0.8921 0.6830
0.4008 -0.1290 0.0410 -0.6440 0.0190 -0.2374
fvalfmc = 1.3212e-05
eflagfmc = 2
ans = 863
fmincon с опциями по умолчанию дает точное решение после менее чем 1000 оценок функций. Флаг выхода 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 65190
{'fminunc' } {'Poor'} 1.1269 429
{'fmincon' } {'Good'} 1.3212e-05 863
Другой взгляд на результаты.
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 обычно не рекомендуется для несмутных проблем. Он эффективен в данном случае, но у этого случая есть только один немыслимый момент.