Я хотел бы предложить несколько иной подход по сравнению с другими ответами, хотя @barron косвенно обсуждал то же самое.
Вместо прямой оптимизации вашей функции, т. Е. Путем оценки ее по ряду точек точек, которые (будем надеяться) сходятся к (локальному) оптимуму, вы можете использовать концепцию суррогатного моделирования , которая очень хорошо подходит для задач описываемого вами типа (высокая стоимость, гладкая, ограниченная, низкая размерность, т.е. менее 20 неизвестных).Икс1, х2, … , ХКсуррогатное моделирование
В частности, суррогатное моделирование работает путем создания модельной функции вашей истинной функции F ∈ R d → R . Ключевым моментом является то, что хотя c, конечно, не совсем точно представляет f , его гораздо дешевле оценить.c ∈ Rd→ Rе∈ Rd→ Rсе
Итак, типичный процесс оптимизации будет выглядеть следующим образом:
- Оцените в множестве j начальных точек x 1 , x 2 , … , x j . Обратите внимание, что производные не нужны. Также обратите внимание, что эти точки должны быть равномерно распределены по всему пространству поиска, например, с помощью выборки из латинского гиперкуба или аналогичной конструкции, заполняющей пространство.еJИкс1, х2, … , ХJ
- На основе этого исходного набора данных создайте модельную функцию . Вы можете использовать перекрестную проверку для проверки вашей модели (то есть использовать только подмножество исходных j точек для создания c , а затем использовать оставшуюся часть набора данных, чтобы проверить, насколько хорошо c предсказывает эти значения)сJсс
- Используйте критерий, такой как критерий ожидаемого улучшения (EI), чтобы выяснить, где «заполнить» больше выборок, чтобы сделать более точным путем выборки f . На самом деле это гораздо лучше изучено теоретически, чем может показаться, и критерий EI очень хорошо изучен. Критерий EI также не является жадным критерием, поэтому вы оба получаете хорошее общее улучшение точности модели, в то же время отдавая приоритет точности рядом с потенциальным оптимумом.се
- Если ваша модель недостаточно точна, повторите шаг 3, в противном случае используйте свою любимую процедуру оптимизации, чтобы найти оптимальный , который будет очень дешев для оценки (так что вы можете использовать любую процедуру, какую хотите, даже те, которые требуют производных, или просто оцените функцию в мелкой сетке).с
В общем, это то, что подразумевается под EGO, Efficient Global Optimization, как предложил @barron. Я хотел бы подчеркнуть, что для вашего приложения это кажется совершенно подходящим - вы получаете удивительно точную модель, основанную на сравнительно небольшом количестве оценок , и затем можете использовать любой алгоритм оптимизации, какой захотите. Также часто интересно то, что теперь вы можете оценить c на сетке и построить ее, тем самым получая представление об общем виде f . Еще один интересный момент заключается в том, что большинство методов суррогатного моделирования также предоставляют статистические оценки ошибок, что позволяет оценить неопределенность.есе
Как построить конечно, остается открытым вопросом, но часто используются модели Кригинга или так называемые модели отображения пространства.с
Конечно, все это довольно трудоемко, но многие другие люди сделали очень хорошие реализации. В Matlab я знаю только о программном наборе инструментов DACE DACE бесплатно. TOMLAB также может предлагать пакет Matlab, но стоит денег - однако я считаю, что он также работает в C ++ и обладает гораздо большими возможностями, чем когда-либо у DACE. (Примечание: я являюсь одним из разработчиков новой версии DACE, которая скоро будет выпущена, которая предложит дополнительную поддержку EGO.)
Надеюсь, что этот грубый обзор помог вам, пожалуйста, задавайте вопросы, если есть какие-то моменты, которые можно сделать более ясными, или что-то, что я пропустил, или если вы хотите получить дополнительные материалы по этому вопросу.