patternsearch
и Optimize
Задача Live EditorВ этом примере показано, как решить ограниченную задачу минимизации с помощью и Оптимизировать задачи Live Editor, которая предлагает визуальный подход и командную строку.
Проблема включает использующие линейные и нелинейные ограничения при минимизации нелинейной функции с patternsearch
. Целевая функция
где
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 ]'; F = @(x)0.5*x'*H*x + f'*x;
Эта целевая функция также включена с вашим программным обеспечением в файле lincontest7.m
.
Линейные ограничения
где
A = [-8 7 3 -4 9 0]; b = 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]';
Введите предыдущие секции кода, чтобы получить переменные задачи в вашу рабочую область перед продолжением.
patternsearch
в оптимизируют задачу Live EditorСоздайте новый live скрипт путем нажатия кнопки New Live Script в разделе File по вкладке Home.
Вставьте Оптимизировать задачу Live Editor. Кликните по вкладке Insert и затем, в разделе Code, выберите Task > Optimize.
Задайте проблемный тип
В разделе Specify problem type задачи нажмите кнопку Objective > Nonlinear.
Нажмите кнопки Constraints > Linear inequality и Linear equality.
Выберите Solver > patternsearch - Pattern search.
Выберите Problem Data
Введите переменные задачи в раздел Select problem data задачи. Чтобы задать целевую функцию, выберите Objective function > Function handle и выберите F.
Установите ограничения неравенства на A
и b
. Установите ограничения равенства на Aeq
и beq
.
Чтобы установить начальную точку, сначала необходимо создать новый раздел выше задачи. Для этого нажмите кнопку Section Break на вкладке Insert. В новом разделе выше задачи введите следующий код для начальной точки.
x0 = [2 1 0 9 1 0]';
Запустите раздел, чтобы поместить x0
в рабочую область. Чтобы запустить раздел, установите курсор в раздел и нажмите Ctrl+Enter или кликните по синей чередуемой панели слева от номера строки.
В разделе Select problem data задачи, набор x0
как начальная точка.
Задайте опции решателя
Поскольку эта проблема линейно ограничивается, задайте дополнительную опцию решателя. Расширьте раздел Specify solver options задачи, и затем нажмите кнопку Add. Установите Poll settings > Poll method на GSSPositiveBasis2N
. Для получения дополнительной информации о КПД методов опроса GSS для линейно ограниченных проблем, смотрите, Сравнивают КПД Опций Опроса.
Опции дисплея аппарата
В разделе Display progress задачи выберите функции построения графика Mesh size и Best value.
Ваша настройка выглядит так:
Запустите решатель и исследуйте результаты
Чтобы запустить решатель, кликните по кнопке ⁝ опций в правом верхнем из окна задачи и выберите Run Section.
Графики появляются в отдельном окне рисунка и в области вывода задачи.
Чтобы получить точку решения и значение целевой функции в решении, посмотрите во главе задачи.
Optimize
Задача Live Editor возвращает решение в переменной под названием solution
и возвращает значение целевой функции в переменной под названием objectiveValue
. Просмотрите эти значения путем ввода следующего кода в разделе ниже задачи и затем выполнения раздела, или путем ввода кода в командной строке MATLAB®.
disp(solution)
8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812
disp(objectiveValue)
1.9195e+03
Включайте нелинейные ограничения
Добавьте следующие нелинейные ограничения в проблему.
Чтобы включать эти ограничения, сначала нажмите кнопку Constraints > Nonlinear.
В разделе Select problem data, под Constraints, выбирают Nonlinear > Local function и затем нажимают кнопку New. Функция появляется в новом разделе ниже задачи. Отредактируйте получившийся код, чтобы содержать следующие линии.
function [c, ceq] = double_ineq(x) c = [-1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) - 10]; ceq = []; end
В ограничительном разделе Nonlinear выберите double_ineq.
Нелинейные ограничительные причины алгоритма patternsearch
взять много вычислений функции. В разделе Specify solver options кликните по знаку "плюс" справа от текущих опций, чтобы отобразить дополнительные опции. Затем увеличьте максимальный предел вычисления функции 5e4.
Запустите задачу снова, чтобы повторно выполнить оптимизацию.
Просмотрите значение функции решения и целевой функции.
disp(solution)
7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457
disp(objectiveValue)
2.4018e+03
Значение целевой функции выше, чем значение в проблеме без нелинейных ограничений. Предыдущее решение не выполнимо относительно нелинейных ограничений.
Графики показывают многим меньше итераций, чем прежде, потому что нелинейный ограничительный алгоритм изменяется patternsearch
алгоритм, чтобы включать другой внешний контур, чтобы решить модифицированную задачу. Внешний контур уменьшает модификацию до проблемы в каждой главной итерации. В этом случае алгоритм делает только четыре внешних итерации. Для получения дополнительной информации алгоритма смотрите Нелинейный Ограничительный Алгоритм решателя.
patternsearch
в командной строкеЧтобы решить исходную задачу (только линейные ограничения) в командной строке, выполните следующий код.
x0 = [2 1 0 9 1 0]'; options = optimoptions('patternsearch',... 'PollMethod','GSSPositiveBasis2N',... 'PlotFcn',{'psplotbestf','psplotmeshsize'}); lb = []; ub = []; nonlcon = []; [x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Optimization terminated: mesh size less than options.MeshTolerance. x = 8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812 fval = 1.9195e+03
patternsearch
генерирует первую пару графиков, показанных в Оптимизировать примере задачи Live Editor.
Чтобы включать нелинейные ограничения, сохраните следующий код в файл с именем double_ineq.m
на пути MATLAB.
function [c, ceq] = double_ineq(x) c = [-1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) - 10]; ceq = []; end
Чтобы позволить решателю выполнение до завершения с нелинейными ограничениями, увеличьте позволенное число вычислений функции.
options.MaxFunctionEvaluations = 5e4;
Решите задачу включая нелинейные ограничения.
nonlcon = @double_ineq; [x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = 7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457 fval = 2.4018e+03
patternsearch
также генерирует вторую пару графиков, показанных в Оптимизировать примере задачи Live Editor.
И Оптимизировать задача Live Editor и командная строка позволяют вам формулировать и решать проблемы, и они дают идентичные результаты. Командная строка более оптимизирована, но обеспечивает меньше справки для выбора решателя, подготовки проблема и выбора опций, таких как функции построения графика. Можно также запустить, использование задач Оптимизируют, и затем генерируют код для использования командной строки, когда в Решают Ограниченную Нелинейную задачу, Основанную на решателе.