exponenta event banner

Ограниченная минимизация с помощью patternsearch и Optimize Задача интерактивного редактора

В этом примере показано, как решить проблему минимизации с ограничением с помощью задачи «Оптимизировать интерактивный редактор», которая предлагает визуальный подход, и командной строки.

Описание проблемы

Проблема заключается в использовании линейных и нелинейных ограничений при минимизации нелинейной функции с помощью patternsearch. Целевая функция:

F (x) = 12xTHx + 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⋅x≤b,Aeq⋅x=beq,

где

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 в задаче «Оптимизация интерактивного редактора»

  1. Создайте новый сценарий в реальном времени, нажав кнопку «Создать сценарий в реальном времени» в разделе «Файл» на вкладке «Главная».

    New Live Script button

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

    Insert Optimize Live Editor task.

    Optimize Live Editor task initial screen

  3. Укажите тип проблемы

    В разделе Задание типа задачи нажмите кнопку Цель > Нелинейный.

  4. Нажмите кнопки «Зависимости» > «Линейное неравенство» и «Линейное равенство».

  5. Выберите «Решатель» > «Поиск массива» - «Поиск массива».

  6. Выбор данных проблемы

    Введите переменные проблемы в разделе Выберите данные проблемы задачи. Для определения целевой функции выберите Целевая функция > Дескриптор функции и выберите F.

  7. Установите ограничения неравенства в значение A и b. Установите ограничения равенства в значение Aeq и beq.

  8. Чтобы задать начальную точку, сначала необходимо создать новый раздел над задачей. Для этого нажмите кнопку «Разрыв сечения» на вкладке «Вставка». В новом разделе над задачей введите следующий код начальной точки.

    x0 = [2 1 0 9 1 0]';
  9. Запустить раздел для размещения x0 в рабочую область. Чтобы запустить раздел, поместите курсор в раздел и нажмите Ctrl + Enter или щелкните синюю полосатую полосу слева от номера строки.

  10. В разделе Select problem data задачи задайте x0 в качестве начальной точки.

  11. Задать параметры решателя

    Поскольку эта проблема линейно ограничена, укажите дополнительную опцию решателя. Разверните раздел Задание параметров решателя и нажмите кнопку Добавить. Задайте для параметра «Параметры опроса» > «Метод опроса» значение GSSPositiveBasis2N. Дополнительные сведения об эффективности методов опроса GSS для проблем с линейными ограничениями см. в разделе Сравнение эффективности параметров опроса.

  12. Задать параметры отображения

    В разделе «Отображение хода выполнения» задачи выберите функции печати «Наилучшее значение» и «Размер сетки».

    Ваша настройка выглядит следующим образом:

    patternsearch solver, function handle F, initial point x0, linear constraints A, b, Aeq, beq, poll algorithm GSSPositiveBasis2N, plots Best value and Mesh size

  13. Запустить решатель и проверить результаты

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

    Run the solver; the keyboard equivalent is Ctrl+Enter.

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

    Plots show the objective function value decreasing with iterations to 1919 and the mesh size eventually decreasing below 1e-6.

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

    Optimize returns "solution" and "objectiveValue" variables

    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
  15. Включить нелинейные зависимости

    Добавьте к проблеме следующие нелинейные ограничения.

    −1.5+x1x2+x1−x2≤0−x1x2−10≤0.

    Чтобы включить эти ограничения, сначала нажмите кнопку «Ограничения» > «Нелинейные».

    Include a nonlinear constraint.

  16. В разделе Выбор данных проблемы в разделе Ограничения выберите Нелинейная > Локальная функция и нажмите кнопку Создать. Функция появится в новом разделе под задачей. Отредактируйте результирующий код, чтобы он содержал следующие строки.

    function [c, ceq] = double_ineq(x)
    c = [-1.5 + x(1)*x(2) + x(1) - x(2);
        -x(1)*x(2) - 10];
    ceq = [];
    end
  17. В разделе «Нелинейные зависимости» выберите «double_ineq».

  18. Алгоритм нелинейных ограничений вызывает patternsearch для выполнения многих оценок функций. В разделе Задать опции решателя (Specify solver options) щелкните знак «плюс» справа от текущих опций, чтобы отобразить дополнительные опции. Затем увеличьте максимальный предел оценки функции до 5e4.

    Max function evals = 5e4

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

    The top plot shows four iterations with a best function value of 2401.77. The bottom plot shows the mesh size decreasing to 1e-9.

  20. Просмотрите значение решения и целевой функции.

    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 создает первую пару графиков, показанных в примере задания «Оптимизировать интерактивный редактор».

Чтобы включить нелинейные ограничения, сохраните следующий код в файле с именем 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 также создает вторую пару графиков, показанных в примере задания «Оптимизировать интерактивный редактор».

Задача «Оптимизировать интерактивный редактор» и командная строка позволяют формулировать и решать задачи, и они дают одинаковые результаты. Командная строка является более удобной, но предоставляет меньше возможностей для выбора решателя, настройки проблемы и выбора таких параметров, как функции печати. Можно также запустить проблему с помощью команды Оптимизировать (Optimize), а затем создать код для использования в командной строке, как в разделе Решение ограниченной нелинейной проблемы на основе решателя (Solver-Based).

См. также

Связанные темы