У меня есть ограниченная невыпуклая 2-D функция, минимум которой я бы хотел найти. Функция довольно плавная. Оценка это дорого. Допустимая ошибка составляет около 3% от области функции в каждой оси.
Я попытался запустить реализацию алгоритма DIRECT в библиотеке NLOPT, но он не дал значительного улучшения по сравнению с поиском методом грубой силы с точки зрения количества оценок функций, необходимых для требуемой точности, и были некоторые отклонения.
Какие другие глобальные решатели оптимизации я должен рассмотреть?
optimization
Виктор Мэй
источник
источник
Ответы:
Я хотел бы предложить несколько иной подход по сравнению с другими ответами, хотя @barron косвенно обсуждал то же самое.
Вместо прямой оптимизации вашей функции, т. Е. Путем оценки ее по ряду точек точек, которые (будем надеяться) сходятся к (локальному) оптимуму, вы можете использовать концепцию суррогатного моделирования , которая очень хорошо подходит для задач описываемого вами типа (высокая стоимость, гладкая, ограниченная, низкая размерность, т.е. менее 20 неизвестных).Икс1, х2, … , ХК суррогатное моделирование
В частности, суррогатное моделирование работает путем создания модельной функции вашей истинной функции F ∈ R d → R . Ключевым моментом является то, что хотя c, конечно, не совсем точно представляет f , его гораздо дешевле оценить.c ∈ Rd→ R е∈ Rd→ R с е
Итак, типичный процесс оптимизации будет выглядеть следующим образом:
В общем, это то, что подразумевается под EGO, Efficient Global Optimization, как предложил @barron. Я хотел бы подчеркнуть, что для вашего приложения это кажется совершенно подходящим - вы получаете удивительно точную модель, основанную на сравнительно небольшом количестве оценок , и затем можете использовать любой алгоритм оптимизации, какой захотите. Также часто интересно то, что теперь вы можете оценить c на сетке и построить ее, тем самым получая представление об общем виде f . Еще один интересный момент заключается в том, что большинство методов суррогатного моделирования также предоставляют статистические оценки ошибок, что позволяет оценить неопределенность.е с е
Как построить конечно, остается открытым вопросом, но часто используются модели Кригинга или так называемые модели отображения пространства.с
Конечно, все это довольно трудоемко, но многие другие люди сделали очень хорошие реализации. В Matlab я знаю только о программном наборе инструментов DACE DACE бесплатно. TOMLAB также может предлагать пакет Matlab, но стоит денег - однако я считаю, что он также работает в C ++ и обладает гораздо большими возможностями, чем когда-либо у DACE. (Примечание: я являюсь одним из разработчиков новой версии DACE, которая скоро будет выпущена, которая предложит дополнительную поддержку EGO.)
Надеюсь, что этот грубый обзор помог вам, пожалуйста, задавайте вопросы, если есть какие-то моменты, которые можно сделать более ясными, или что-то, что я пропустил, или если вы хотите получить дополнительные материалы по этому вопросу.
источник
Видеть
Л.М. Риос, Н.В. Сахинидис, Оптимизация без производных: обзор алгоритмов и сравнение программных реализаций
для очень полезного недавнего сравнения решателей.
DOI: 10.1007 / s10898-012-9951-й
источник
Для гладкой функции метод Efficient Global Optimization должен работать достаточно хорошо и быть значительно более эффективным, чем DIRECT. Реализации доступны в TOMLAB (я не использовал его сам) и DAKOTA (с которым у меня был некоторый успех).
источник
Поскольку функция гладкая, метод Ньютона будет в подавляющем большинстве наиболее эффективным методом поиска минимума. Поскольку функция не является выпуклой, вам придется применять обычные приемы, чтобы сделать метод Ньютона сходящимся (модификация Левенберга-Марквардта, поиск строк или область доверия для глобализации). Если вы не можете получить производные своей функции, попробуйте либо вычислить ее с помощью конечных разностей, либо использовать обновление BFGS. Если вы подозреваете, что проблема имеет более одного локального минимума, можно просто запустить метод Ньютона из группы случайно или не очень случайно выбранных точек и посмотреть, где они сходятся.
источник
Поскольку ваши оценки дорогостоящие, вам нужно использовать параллельные вычисления оценок нескольких функций.
Я бы порекомендовал вам взглянуть на этот код . Математика позади описана здесь .
источник