Минимизируйте функцию со многими локальными минимумами

Пятая функция де Йонга

В этом примере показано, как найти локальный минимум функции с помощью моделируемого отжига. В примере представлены два подхода к минимизации: работа в командной строке и использование задачи Optimize Live Editor.

Пятая функция де Йонга является двумерной функцией со многими (25) локальными минимумами. На следующем графике неясно, какой из этих локальных минимумов является глобальным минимумом.

dejong5fcn

Figure contains an axes. The axes contains 2 objects of type surface, contour.

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

Примечание: Поскольку моделируемый отжиг использует генераторы случайных чисел, каждый раз, когда вы запускаете этот алгоритм, вы можете получить различные результаты. Для получения дополнительной информации см. раздел «Воспроизведение результатов».

Минимизируйте в командной строке

Чтобы запустить моделируемый алгоритм отжига без ограничений, вызовите simulannealbnd в командной строке с помощью целевой функции в dejong5fcn.m, на которую ссылается анонимная функция @dejong5fcn в следующем коде.

rng(10,'twister') % for reproducibility
fun = @dejong5fcn;
[x,fval] = simulannealbnd(fun,[0 0])
Optimization terminated: change in best function value less than options.FunctionTolerance.

x =
  -16.1292  -15.8214

fval =
    6.9034

В результатах:

  • x - конечная точка, возвращенная алгоритмом.

  • fval - значение целевой функции в конечной точке.

Минимизируйте использование задачи оптимизации Live Editor

Можно также запустить минимизацию с помощью задачи Optimize Live Editor, которая обеспечивает визуальный подход.

  1. Создайте новый live скрипт, нажав кнопку New Live Script в разделе File на вкладке Home.

    New Live Script button

  2. Вставьте задачу Optimize Live Editor. Щелкните вкладку Insert, а затем в разделе Code выберите Task > Optimize.

    Inserting Optimize Live Editor task

    Optimize Live Editor task

  3. Для использования при вводе данных о задаче вставьте новый раздел, нажав кнопку Section Break на вкладке Insert. Новые разделы появляются выше и ниже задачи.

  4. В новом разделе над задачей введите следующий код, чтобы определить начальную точку и целевую функцию.

    x0 = [0 0];
    fun = @dejong5fcn;
  5. Чтобы поместить эти переменные в рабочую область, запустите раздел, нажав Ctrl+Enter.

  6. В Specify problem type разделе задачи нажмите кнопку Objective > Nonlinear.

  7. Выберите Solver > simulannealbnd - Simulated annealing algorithm.

  8. В Select problem data разделе задачи выберите Objective function > Function handle и затем fun.

  9. Выберите Initial point (x0) > x0.

    "Solver, objective function, and initial point specified

  10. В Display progress разделе задачи выберите Best value график.

  11. Чтобы запустить решатель, нажмите кнопку options в верхней части окна задачи и выберите Run Section. График появляется в отдельном окне рисунка и в области выхода задачи. Обратите внимание, что ваш график может отличаться от показанного, потому что simulannealbnd является стохастическим алгоритмом.

    Plot showing best function value decreasing to 10.7632 in about 1300 iterations

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

    Optimize returns solution and objectiveValue variables

    Задача Optimize Live Editor возвращает переменные с именем solution и objectiveValue в рабочую область.

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

    disp(solution)
    disp(objectiveValue)
  14. Запустите раздел нажатием Ctrl+Enter.

    disp(solution)
      -32.0285   -0.1280
    disp(objectiveValue)
        10.7632

И задача Optimize Live Editor, и командная строка позволяют вам сформулировать и решить задачи, и они дают одинаковые результаты. Командная строка более упорядочена, но предоставляет меньше помощи для выбора решателя, настройки задачи и выбора опций, таких как функции построения графика. Можно также начать задачу с помощью Optimize, а затем сгенерировать код для использования в командной строке, как в Решать Ограниченную Нелинейную Задачу, Основанную на Решателе.

См. также

Похожие темы