В этом примере показано, как найти локальный минимум функции с помощью моделируемого отжига. В примере представлены два подхода к минимизации: работа в командной строке и использование задачи Optimize Live Editor.
Пятая функция де Йонга является двумерной функцией со многими (25) локальными минимумами. На следующем графике неясно, какой из этих локальных минимумов является глобальным минимумом.
dejong5fcn
Многие стандартные алгоритмы оптимизации застревают в локальных минимумах. Поскольку моделируемый алгоритм отжига выполняет широкий случайный поиск, вероятность попадания в локальный минимум уменьшается.
Примечание: Поскольку моделируемый отжиг использует генераторы случайных чисел, каждый раз, когда вы запускаете этот алгоритм, вы можете получить различные результаты. Для получения дополнительной информации см. раздел «Воспроизведение результатов».
Чтобы запустить моделируемый алгоритм отжига без ограничений, вызовите 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
- значение целевой функции в конечной точке.
Можно также запустить минимизацию с помощью задачи Optimize Live Editor, которая обеспечивает визуальный подход.
Создайте новый live скрипт, нажав кнопку New Live Script в разделе File на вкладке Home.
Вставьте задачу Optimize Live Editor. Щелкните вкладку Insert, а затем в разделе Code выберите Task > Optimize.
Для использования при вводе данных о задаче вставьте новый раздел, нажав кнопку Section Break на вкладке Insert. Новые разделы появляются выше и ниже задачи.
В новом разделе над задачей введите следующий код, чтобы определить начальную точку и целевую функцию.
x0 = [0 0]; fun = @dejong5fcn;
Чтобы поместить эти переменные в рабочую область, запустите раздел, нажав Ctrl+Enter.
В Specify problem type разделе задачи нажмите кнопку Objective > Nonlinear.
Выберите Solver > simulannealbnd - Simulated annealing algorithm.
В Select problem data разделе задачи выберите Objective function > Function handle и затем fun
.
Выберите Initial point (x0) > x0.
В Display progress разделе задачи выберите Best value график.
Чтобы запустить решатель, нажмите кнопку options ⁝ в верхней части окна задачи и выберите Run Section. График появляется в отдельном окне рисунка и в области выхода задачи. Обратите внимание, что ваш график может отличаться от показанного, потому что simulannealbnd
является стохастическим алгоритмом.
Чтобы увидеть решение и лучшее значение целевой функции, смотрите в верхней части задачи.
Задача Optimize Live Editor возвращает переменные с именем solution
и objectiveValue
в рабочую область.
Чтобы просмотреть значения этих переменных, введите следующий код в разделе под задачей.
disp(solution) disp(objectiveValue)
Запустите раздел нажатием Ctrl+Enter.
disp(solution)
-32.0285 -0.1280
disp(objectiveValue)
10.7632
И задача Optimize Live Editor, и командная строка позволяют вам сформулировать и решить задачи, и они дают одинаковые результаты. Командная строка более упорядочена, но предоставляет меньше помощи для выбора решателя, настройки задачи и выбора опций, таких как функции построения графика. Можно также начать задачу с помощью Optimize, а затем сгенерировать код для использования в командной строке, как в Решать Ограниченную Нелинейную Задачу, Основанную на Решателе.