В дополнение к опросу точек ячеистой сети алгоритм поиска шаблона может выполнять необязательный шаг на каждой итерации, называемой поиском. В каждой итерации шаг поиска применяет другой метод оптимизации к текущей точке. Если этот поиск не улучшает текущую точку, выполняется шаг опроса.
В следующем примере показано использование метода поиска для задачи, описанной в разделе Минимизация с ограничением с помощью задачи «Поиск массива» и «Оптимизировать оперативный редактор». В этом случае методом поиска является опрос MADS Positive Basis 2N. Для сравнения сначала запустите проблему без метода поиска.
x0 = [2 1 0 9 1 0]; Aineq = [-8 7 3 -4 9 0]; bineq = 7; Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3]; beq = [84 62 65 1]; options = optimoptions('patternsearch',... 'PlotFcn',{@psplotbestf,@psplotfuncount}); [x,fval,exitflag,output] = patternsearch(@lincontest7,x0,... Aineq,bineq,Aeq,beq,[],[],[],options);
Optimization terminated: mesh size less than options.MeshTolerance.

Чтобы использовать опрос MADS Positive Basis 2N в качестве метода поиска, измените SearchFcn вариант.
rng default % For reproducibility options.SearchFcn = @MADSPositiveBasis2N; [x2,fval2,exitflag2,output2] = patternsearch(@lincontest7,x0,... Aineq,bineq,Aeq,beq,[],[],[],options);
Optimization terminated: mesh size less than options.MeshTolerance.

Обе оптимизации достигли одного и того же значения целевой функции. Использование метода поиска сокращает число оценок функций и число итераций.
table([output.funccount;output2.funccount],[output.iterations;output2.iterations],... 'VariableNames',["Function Evaluations" "Iterations"],... 'RowNames',["Without Search" "With Search"])
ans=2×2 table
Function Evaluations Iterations
____________________ __________
Without Search 1462 136
With Search 1283 118
patternsearch требуется много времени, чтобы минимизировать функцию Розенброка. Функция:
1-x1) 2.
Функция Розенброка описана и нанесена на график в разделе Решение ограниченной нелинейной задачи на основе решателя. Минимум функции Розенброка равен 0, достигаемый в точке [1,1]. Поскольку patternsearch не является эффективным для минимизации этой функции, используйте другой метод поиска, чтобы помочь.
Создайте целевую функцию.
dejong2fcn = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
Максимальное число итераций по умолчанию для поиска массива с двумя переменными равно 200, а максимальное число оценок функций по умолчанию - 4000. Увеличить эти значения до MaxFunctionEvaluations = 5000 и MaxIterations = 2000.
opts = optimoptions('patternsearch','MaxFunctionEvaluations',5000,'MaxIterations',2000);
Выполнить поиск массива, начиная с [-1.9 2].
[x,feval,eflag,output] = patternsearch(dejong2fcn,...
[-1.9,2],[],[],[],[],[],[],[],opts);Maximum number of function evaluations exceeded: increase options.MaxFunctionEvaluations.
disp(feval)
0.8560
Оптимизация не была завершена, и результат не очень близок к оптимальному значению 0.
Настройка параметров для использования fminsearch в качестве метода поиска, используя количество оценок и итераций функций по умолчанию.
opts = optimoptions('patternsearch',opts,'SearchFcn',@searchneldermead);
Повторно запустите оптимизацию.
[x2,feval2,eflag2,output2] = patternsearch(dejong2fcn,...
[-1.9,2],[],[],[],[],[],[],[],opts);Optimization terminated: mesh size less than options.MeshTolerance.
disp(feval2)
4.0686e-10
Результаты гораздо лучше при использовании этого метода поиска. fminsearch более эффективно приближается к минимуму функции Розенброка.