В дополнение к опросу точек mesh алгоритм поиска шаблона может выполнить дополнительный шаг в каждой итерации, названной поиском. В каждой итерации поисковый шаг применяет другой метод оптимизации к текущей точке. Если этот поиск не улучшает текущую точку, шаг опроса выполняется.
Следующий пример иллюстрирует использование метода поиска для проблемы, описанной в Ограниченной Минимизации Используя patternsearch, и Оптимизируйте Live Editor Тэска. В этом случае метод поиска является Положительным Базисным опросом 2 Н MADS. Для сравнения, первый показ проблема без метода поиска.
x = optimvar("x",1,6); prob = optimproblem("Objective",lincontest7(x)); x0.x = [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]; prob.Constraints.Aineq = Aineq*x' <= bineq; prob.Constraints.Aeq = Aeq*x' == beq'; options = optimoptions('patternsearch',... 'PlotFcn',{@psplotbestf,@psplotfuncount}); [x,fval,exitflag,output] = solve(prob,x0,... "Options",options,"Solver","patternsearch");
Solving problem using patternsearch. Optimization terminated: mesh size less than options.MeshTolerance.
Чтобы использовать Положительный Базисный опрос 2 Н MADS в качестве метода поиска, измените SearchFcn
опция.
rng default % For reproducibility options.SearchFcn = @MADSPositiveBasis2N; [x2,fval2,exitflag2,output2] = solve(prob,x0,... "Options",options,"Solver","patternsearch");
Solving problem using patternsearch. 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
занимает много времени, чтобы минимизировать функцию Розенброка. Функция
Функция Розенброка описана и построена в, Решают Ограниченную Нелинейную задачу, Основанную на решателе. Минимум функции Розенброка 0, достигнут в точке [1,1]
. Поскольку patternsearch
не эффективно при минимизации этой функции, используйте различный метод поиска помочь.
Создайте целевую функцию.
dejong2fcn = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
Максимальное количество по умолчанию итераций для patternsearch с двумя переменными 200, и максимальное количество по умолчанию вычислений функции 4000. Увеличьте эти значения к MaxFunctionEvaluations
= 5000 и MaxIterations
= 2000.
opts = optimoptions("patternsearch","MaxFunctionEvaluations",5000,"MaxIterations",2000);
Запустите patternsearch, начинающий с [-1.9 2]
.
x = optimvar("x",1,2); prob = optimproblem("Objective",dejong2fcn(x)); x0.x = [-1.9,2]; [sol,feval,eflag,output] = solve(prob,x0,... "Options",opts,"Solver","patternsearch");
Solving problem using patternsearch. Maximum number of function evaluations exceeded: increase options.MaxFunctionEvaluations.
disp(feval)
0.8560
Оптимизация не завершалась, и результат не очень близко к оптимальному значению 0.
Установите опции использовать fminsearch
как метод поиска, с помощью количества по умолчанию вычислений функции и итераций.
opts = optimoptions("patternsearch","SearchFcn",@searchneldermead);
Повторно выполните оптимизацию.
[sol2,feval2,eflag2,output2] = solve(prob,x0,... "Options",opts,"Solver","patternsearch");
Solving problem using patternsearch. Optimization terminated: mesh size less than options.MeshTolerance.
disp(feval2)
4.0686e-10
Результаты намного лучше при использовании этого метода поиска. fminsearch
более эффективно при нахождении рядом к минимуму функции Розенброка.