Поиск и устранение проблем оптимизации и советы

В этой таблице описываются типичные задачи оптимизации и содержатся рекомендации по их решению.

Проблема

Рекомендация

Решение найдено по fminbnd или fminsearch не является global минимумом. Глобальный минимум имеет наименьшее значение целевой функции среди всех точек в пространстве поиска.

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

Невозможно оценить целевую функцию f(x) в некоторых точках x. Такие точки называются infeasible.

Измените функцию, чтобы вернуть большое положительное значение для f(x) в недопустимых точках x.

Стандартная программа минимизации, по-видимому, входит в бесконечный цикл или возвращает решение, которое не является минимальным (или не является нулем, в случае fzero).

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

options = optimset('FunValCheck','on')

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

Решатель занимает много времени.

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

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

Неясно, что делает решатель.

Чтобы увидеть, что решатель делает, когда он итерирует:

fminsearch не удается достичь решения.

fminsearch может не достичь решения по разным причинам.

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

  • Неподходящие критерии остановки. Если значение, которое вы задаете для TolFun или TolX слишком маленькая, fminsearch может не осознать, когда он достиг решения. Если значение слишком велико, fminsearch может остановиться далеко от решения.

  • Плохая начальная точка. Попробуйте начать fminsearch из различных начальных точек.

  • Недостаточно итераций. Если у решателя заканчиваются итерации или он застрял, попробуйте перезапустить fminsearch от его конечной точки до достижения лучшего решения. Иногда fminsearch достигает лучшего решения, когда вы увеличиваете значение MaxFunEvals и MaxIter опции от их значения по умолчанию 200*length(x0).

Похожие темы