Этот пример показывает эффекты некоторых опций для поиска шаблона. Опции включают графический вывод, критерий остановки и другие алгоритмические средства управления для ускорения решения.
Проблемой минимизировать является квадратичная функция шести переменных subect к линейному равенству и ограничениям неравенства. Целевая функция, lincontest7
, включена с программным обеспечением Global Optimization Toolbox.
type lincontest7
function y = lincontest7(x); %LINCONTEST7 objective function. % y = LINCONTEST7(X) evaluates y for the input X. Make sure that x is a column % vector, whereas objective function gets a row vector. % Copyright 2003-2004 The MathWorks, Inc. x = x'; %Define a quadratic problem in terms of H and f (From web unknown source) H = [36 17 19 12 8 15; 17 33 18 11 7 14; 19 18 43 13 8 16; 12 11 13 18 6 11; 8 7 8 6 9 8; 15 14 16 11 8 29]; f = [ 20 15 21 18 29 24 ]'; y = 0.5*x'*H*x + f'*x;
Задайте указатель на функцию @lincontest7
как целевая функция.
objectiveFcn = @lincontest7;
Целевая функция принимает вектор - строку из длины шесть. Задайте начальную точку для оптимизации.
x0 = [2 1 0 9 1 0];
Создайте линейные ограничительные матрицы, представляющие ограничения Aineq*x <= Bineq
и Aeq*x = Beq
. Для получения дополнительной информации смотрите Линейные Ограничения (Optimization Toolbox).
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 8; 1 0 0 0 0 0]; Beq = [84 62 65 1];
Запустите решатель patternsearch
и наблюдайте, сколько итераций и функциональных оценок требуется, чтобы найти решение.
[X1,Fval,Exitflag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,Aeq,Beq);
Optimization terminated: mesh size less than options.MeshTolerance.
fprintf('The number of iterations was : %d\n', Output.iterations);
The number of iterations was : 244
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 1895
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : 2189.03
Контролируйте процесс оптимизации путем определения двух функций построения графика. Задайте функции построения графика как опцию PlotFcn
при помощи optimoptions
. Одна функция построения графика, psplotbestf
, строит лучшее значение целевой функции в каждой итерации. Другая функция построения графика, psplotfuncount
, строит число раз, целевая функция выполнена в каждой итерации. Установите эти две функции построения графика в массиве ячеек.
opts = optimoptions(@patternsearch,'PlotFcn',{@psplotbestf,@psplotfuncount});
Запустите решатель patternsearch
. С тех пор нет никаких ограничений верхней или нижней границы и никаких нелинейных ограничений, не передают пустые массивы ([]
) для седьмых, восьмых, и девятых аргументов.
[X1,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq, ...
Aeq,Beq,[],[],[],opts);
Optimization terminated: mesh size less than options.MeshTolerance.
Начальный размер mesh
Алгоритм поиска шаблона использует набор рациональных базисных векторов, чтобы сгенерировать поисковые направления. Это выполняет поиск вдоль поисковых направлений с помощью текущего размера mesh. Решатель запускается с начального размера mesh 1
по умолчанию. Чтобы запустить начальный размер mesh в 10
, установите опцию InitialMeshSize
:
options = optimoptions(opts,'InitialMeshSize',10);
Поймайте в сети масштабирование
Mesh может масштабироваться, чтобы улучшить минимизацию плохо масштабированной задачи оптимизации. Шкала используется, чтобы вращать шаблон определенной степенью и шкалой вдоль поисковых направлений. Опция шкалы находится на (true
) по умолчанию, но может быть выключена, если проблема хорошо масштабируется. В целом, если проблема плохо масштабируется, устанавливание этой опции к true
может помочь в сокращении количества функциональных оценок. Для этой целевой функции, набор ScaleMesh
к false
, потому что lincontest7
является хорошо масштабируемой целевой функцией.
opts = optimoptions(opts,'ScaleMesh',false);
Поймайте в сети акселератор
Прямые методы поиска требуют многих функциональных оценок по сравнению с основанными на производной методами оптимизации. Алгоритм поиска шаблона может быстро найти окружение оптимальной точки, но может быть медленным в обнаружении самого минимума. Это - стоимость не использования производных. Решатель patternsearch
может сократить количество функциональных оценок с помощью акселератора. Когда акселератор находится на (opts.AccelerateMesh = true
), размер mesh законтрактован быстро после того, как некоторый минимальный размер mesh достигнут. Эта опция рекомендуется только для сглаженных проблем, в противном случае можно потерять некоторую точность. Акселератор от (false
) по умолчанию. Здесь, установите AccelerateMesh
на true
, потому что целевая функция сглаженна.
opts = optimoptions(opts,'AccelerateMesh',true);
Запустите решатель patternsearch
.
[X2,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq, ...
Aeq,Beq,[],[],[],opts);
Optimization terminated: mesh size less than options.MeshTolerance.
fprintf('The number of iterations was : %d\n', Output.iterations);
The number of iterations was : 200
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 1327
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : 2189.03
Они установка опции сокращает количество итераций и количество функциональных оценок, и нет никакой очевидной потери точности.
Что такое MeshTolerance, StepTolerance и FunctionTolerance?
MeshTolerance
является допуском на размере mesh. Если размер mesh является меньше, чем MeshTolerance
, остановки решателя. StepTolerance
используется в качестве минимального допуска на изменении в текущей точке к следующему вопросу. FunctionTolerance
используется в качестве минимального допуска на изменении в значении функции от текущей точки до следующего вопроса.
Установите MeshTolerance
на 1e-7, который в десять раз меньше, чем значение по умолчанию. Эта установка может увеличить число функциональных оценок и итераций, и может привести к более точному решению.
opts.MeshTolerance = 1e-7;
Алгоритм поиска шаблона может использовать дополнительный поиск в каждой итерации. Эта опция называется SearchFcn
. Когда вы устанавливаете SearchFcn
, тот поиск сделан сначала перед поиском mesh. Если SearchFcn
успешен, patternsearch
пропускает поиск mesh, обычно названный PollFcn
, для той итерации. Если метод поиска неудачен в улучшении текущей точки, patternsearch
выполняет опрос.
Существует пять различных опций метода поиска. Эти методы поиска включают searchga
и searchneldermead
, которые являются двумя различными алгоритмами оптимизации. Рекомендуется использовать эти методы только для первой итерации, которая является значением по умолчанию. Используя эти методы неоднократно в каждой итерации не может улучшить результаты и мог быть в вычислительном отношении дорогим. Один другая рука, searchlhs
, который генерирует латинские точки гиперкуба, может использоваться в каждой итерации или возможно каждых 10 итерациях. Другой выбор для методов поиска включает методы Опроса, такие как положительное основание N+1 или положительное основание 2 Н.
Рекомендуемая стратегия состоит в том, чтобы использовать положительное основание N+1 (который требует в большинстве точек N+1, чтобы создать шаблон) как метод поиска, и положительное основание 2 Н (который требует, чтобы 2 Н указали, чтобы создать шаблон) как метод опроса. Обновите структуру опций, чтобы использовать positivebasisnp1
в качестве метода поиска. Начиная с положительного основания 2 Н является PollFcn
по умолчанию, не устанавливайте ту опцию.
opts.SearchFcn = @positivebasisnp1;
Запустите решатель patternsearch
.
[X5,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,Aeq,Beq, ...
[],[],[],opts);
Optimization terminated: mesh size less than options.MeshTolerance.
fprintf('The number of iterations was : %d\n', Output.iterations);
The number of iterations was : 70
fprintf('The number of function evaluations was : %d\n', Output.funccount);
The number of function evaluations was : 867
fprintf('The best function value found was : %g\n', Fval);
The best function value found was : 2189.03
С этими опциями, общим количеством итераций и функционального уменьшения оценок. Это уменьшение происходит даже при том, что допуск mesh меньше, чем предыдущее значение, и, как вы видите в выходных сообщениях, допуск mesh является останавливающимся критерием, который останавливает решатель.