exponenta event banner

Задать параметры сетки

Расширение и сжатие сетки

MeshExpansionFactor и MeshContractionFactor опции определяют, насколько размер сетки расширяется или сжимается при каждой итерации. Со значением по умолчанию MeshExpansionFactor значение 2, поиск шаблона умножает размер сетки на 2 после каждого успешного опроса. Со значением по умолчанию MeshContractionFactor значение 0.5, поиск шаблона умножает размер сетки на 0.5 после каждого неудачного опроса.

Можно просмотреть расширение и сжатие размера сетки во время поиска массива, задав @psplotmeshsize в качестве PlotFcn вариант. Чтобы также отобразить значения размера сетки и целевой функции в командной строке, установите Display опция для 'iter'.

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

  1. Введите в командной строке следующее:

    x0 = [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];
  2. Создание параметров для использования GSSPositiveBasis2N метод опроса, итеративное отображение и печать размера сетки.

    options = optimoptions('patternsearch',...
        'PollMethod','GSSPositiveBasis2N',...
        'PlotFcn',@psplotmeshsize,...
        'Display','iter');
  3. Выполните оптимизацию.

    [x,fval,exitflag,output] = patternsearch(@lincontest7,x0,...
        Aineq,bineq,Aeq,beq,[],[],[],options);

Чтобы более четко увидеть изменения размера сетки, измените ось Y на логарифмическое масштабирование следующим образом:

  1. Выберите пункт Свойства осей (Axes Properties) в меню Правка (Edit) в окне печати.

  2. В редакторе свойств перейдите на вкладку «Линейки».

  3. Установите YScale в Log.

Обновление этих настроек в редакторе свойств MATLAB ® показывает график на следующем рисунке.

Первые 5 итераций приводят к успешным опросам, поэтому размеры сетки постоянно увеличиваются в течение этого времени. Вы можете увидеть, что первый неудачный опрос происходит в итерации 6, посмотрев на экран командной строки.

Iter     f-count          f(x)      MeshSize     Method
    0        1        2273.76             1      
    1        2        2251.69             2     Successful Poll
    2        3        2209.86             4     Successful Poll
    3        4        2135.43             8     Successful Poll
    4        5        2023.48            16     Successful Poll
    5        6        1947.23            32     Successful Poll
    6       15        1947.23            16     Refine Mesh

Обратите внимание, что при успешной итерации 5 размер сетки удваивается для следующей итерации. Но при итерации 6, которая неудачна, размер сетки умножается 0.5.

Посмотреть, как MeshExpansionFactor и MeshContractionFactor повлиять на поиск шаблона, установить MeshExpansionFactor кому 3.0 и набор MeshContractionFactor кому 2/3.

options = optimoptions(options,'MeshExpansionFactor',3.0,...
    'MeshContractionFactor',2/3);
[x,fval,exitflag,output] = patternsearch(@lincontest7,x0,...
    Aineq,bineq,Aeq,beq,[],[],[],options);

Конечное значение целевой функции приблизительно совпадает с предыдущими настройками, но решателю требуется больше времени для достижения этой точки.

При изменении масштаба оси Y на логарифмический отображается график размера сетки, как показано на следующем рисунке.

Обратите внимание, что размер сетки увеличивается быстрее с MeshExpansionFactor установить в значение 3.0, по сравнению со значением по умолчанию 2.0и уменьшается медленнее с MeshContractionFactor установить в значение 2/3, по сравнению со значением по умолчанию 0.5.

Ускоритель сетки

Ускоритель сетки может ускорить процесс поиска массива до оптимальной точки за счет уменьшения числа итераций, необходимых для достижения допуска сетки. Когда размер сетки ниже определенного значения, поиск массива сжимает размер сетки на коэффициент, меньший, чем MeshContractionFactor фактор. Ячеистый ускоритель применяется только к алгоритмам GPS и GSS.

Примечание

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

Чтобы использовать ускоритель сетки, установите AccelerateMesh опция для true.

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

  1. Введите в командной строке следующее:

    x0 = [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];
  2. Создайте параметры, включая ускоритель сетки.

    options = optimoptions('patternsearch',...
        'PollMethod','GSSPositiveBasis2N',...
        'Display','iter','AccelerateMesh',true);
  3. Выполните оптимизацию.

    [x,fval,exitflag,output] = patternsearch(@lincontest7,x0,... 
       Aineq,bineq,Aeq,beq,[],[],[],options);

patternsearch завершает в 78 итерациях, по сравнению с 84 итерациями, когда ускоритель сетки не включен. Эффект ускорителя сетки можно увидеть на итеративном экране. Выполните пример с ускорением сетки и без него. Размеры сетки одинаковы до итерации 70, но отличаются при итерации 71. В окне команд MATLAB отображаются следующие строки для итераций 70 и 71 без акселератора.

Iter     f-count        f(x)       MeshSize      Method
   70      618        1919.54     6.104e-05     Refine Mesh
   71      630        1919.54     3.052e-05     Refine Mesh

Обратите внимание, что размер сетки умножается на 0.5, значение по умолчанию MeshContractionFactor.

Для сравнения в окне команд отображаются следующие строки для тех же номеров итераций, что и в ускорителе.

Iter     f-count        f(x)       MeshSize      Method
   70      618        1919.54     6.104e-05     Refine Mesh
   71      630        1919.54     1.526e-05     Refine Mesh

В этом случае размер сетки умножается на 0.25.

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