patternsearch и Optimize Задача интерактивного редактораВ этом примере показано, как решить проблему минимизации с ограничением с помощью задачи «Оптимизировать интерактивный редактор», которая предлагает визуальный подход, и командной строки.
Проблема заключается в использовании линейных и нелинейных ограничений при минимизации нелинейной функции с помощью patternsearch. Целевая функция:
fTx,
где
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 в задаче «Оптимизация интерактивного редактора»Создайте новый сценарий в реальном времени, нажав кнопку «Создать сценарий в реальном времени» в разделе «Файл» на вкладке «Главная».

Вставка задачи «Оптимизировать интерактивный редактор». Перейдите на вкладку Вставка, а затем в разделе Код выберите Задача > Оптимизировать.


Укажите тип проблемы
В разделе Задание типа задачи нажмите кнопку Цель > Нелинейный.
Нажмите кнопки «Зависимости» > «Линейное неравенство» и «Линейное равенство».
Выберите «Решатель» > «Поиск массива» - «Поиск массива».
Выбор данных проблемы
Введите переменные проблемы в разделе Выберите данные проблемы задачи. Для определения целевой функции выберите Целевая функция > Дескриптор функции и выберите F.
Установите ограничения неравенства в значение A и b. Установите ограничения равенства в значение Aeq и beq.
Чтобы задать начальную точку, сначала необходимо создать новый раздел над задачей. Для этого нажмите кнопку «Разрыв сечения» на вкладке «Вставка». В новом разделе над задачей введите следующий код начальной точки.
x0 = [2 1 0 9 1 0]';
Запустить раздел для размещения x0 в рабочую область. Чтобы запустить раздел, поместите курсор в раздел и нажмите Ctrl + Enter или щелкните синюю полосатую полосу слева от номера строки.
В разделе Select problem data задачи задайте x0 в качестве начальной точки.
Задать параметры решателя
Поскольку эта проблема линейно ограничена, укажите дополнительную опцию решателя. Разверните раздел Задание параметров решателя и нажмите кнопку Добавить. Задайте для параметра «Параметры опроса» > «Метод опроса» значение GSSPositiveBasis2N. Дополнительные сведения об эффективности методов опроса GSS для проблем с линейными ограничениями см. в разделе Сравнение эффективности параметров опроса.
Задать параметры отображения
В разделе «Отображение хода выполнения» задачи выберите функции печати «Наилучшее значение» и «Размер сетки».
Ваша настройка выглядит следующим образом:

Запустить решатель и проверить результаты
Чтобы запустить решатель, нажмите кнопку опций ⁝ в правом верхнем углу окна задачи и выберите Выполнить раздел.

Графики отображаются в отдельном окне рисунка и в области вывода задания.

Чтобы получить точку решения и значение целевой функции в решении, посмотрите в верхней части задачи.

Optimize Задача Live Editor возвращает решение в переменной с именем solution и возвращает значение целевой функции в переменной с именем objectiveValue. Просмотрите эти значения, введя следующий код в раздел под задачей, а затем запустив раздел, или введя код в командной строке MATLAB ®.
disp(solution)
8.5165
-6.1094
4.0989
1.2877
-4.2348
2.1812disp(objectiveValue)
1.9195e+03
Включить нелинейные зависимости
Добавьте к проблеме следующие нелинейные ограничения.
Чтобы включить эти ограничения, сначала нажмите кнопку «Ограничения» > «Нелинейные».

В разделе Выбор данных проблемы в разделе Ограничения выберите Нелинейная > Локальная функция и нажмите кнопку Создать. Функция появится в новом разделе под задачей. Отредактируйте результирующий код, чтобы он содержал следующие строки.
function [c, ceq] = double_ineq(x) c = [-1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) - 10]; ceq = []; end
В разделе «Нелинейные зависимости» выберите «double_ineq».
Алгоритм нелинейных ограничений вызывает patternsearch для выполнения многих оценок функций. В разделе Задать опции решателя (Specify solver options) щелкните знак «плюс» справа от текущих опций, чтобы отобразить дополнительные опции. Затем увеличьте максимальный предел оценки функции до 5e4.

Запустите задачу еще раз, чтобы повторно запустить оптимизацию.

Просмотрите значение решения и целевой функции.
disp(solution)
7.2083
-1.3873
4.9579
-3.1393
-3.1843
4.7457disp(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+03patternsearch создает первую пару графиков, показанных в примере задания «Оптимизировать интерактивный редактор».
Чтобы включить нелинейные ограничения, сохраните следующий код в файле с именем 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+03patternsearch также создает вторую пару графиков, показанных в примере задания «Оптимизировать интерактивный редактор».
Задача «Оптимизировать интерактивный редактор» и командная строка позволяют формулировать и решать задачи, и они дают одинаковые результаты. Командная строка является более удобной, но предоставляет меньше возможностей для выбора решателя, настройки проблемы и выбора таких параметров, как функции печати. Можно также запустить проблему с помощью команды Оптимизировать (Optimize), а затем создать код для использования в командной строке, как в разделе Решение ограниченной нелинейной проблемы на основе решателя (Solver-Based).