В настоящее время я пытаюсь решить проблему нелинейной минимизации с ограничениями, реализованную в функции "fmincon" в matlab. Мои ожидания: минимизировать (fun1, x0, uB, lB, fun2), где x0 - начальное состояние, fun1 - функция, которую нужно минимизировать, uB - верхние границы, lB - нижние границы, а fun2 - функция, которая обеспечивает векторы нелинейных равенств / неравенства, как описано в http://www.mathworks.com/help/optim/ug/fmincon.htmlкак неконтролируемая функция. Эти векторы также меняются итерациями (они нелинейно зависят от x_n, n-й итерации вектора решения). В реализации Matlab они имеют форму c (x) <= 0. Это последний кусок кода, который нужно перенести с matlab на c ++, и я много пытался найти подходящую библиотеку c ++, содержащую этот алгоритм. Вот почему я ищу здесь помощь, и я был бы очень признателен, если бы вы предоставили свой опыт.
Хороший пример того, что я хочу сделать, это первый на этой странице http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b Единственное отличие состоит в том, что я тоже нужны границы ...
Заранее спасибо.
Питер
источник
Ответы:
Если ваша функция не дифференцируема, вы должны быть осторожны с тем, как вы используете конечные различия. Если вы хотите использовать производную информацию, ваш лучший выбор, вероятно, является своего рода полуодолговым методом ньютоновского типа. Набор заметок, описывающих такие методы, можно найти здесь .
Двенадцать-тридцать переменных, вероятно, находятся в верхней части того, что выполнимо методами поиска по шаблону (также называемому прямым поиском). Недавний обзорный доклад Риоса и Сахинидиса в Журнале глобальной оптимизации о методах оптимизации без производных (таких как методы поиска по шаблону) можно найти здесь , наряду с сопутствующей веб-страницей . Менее недавний обзорный документ об этих методах Колды, Льюиса и Торцзона в SIAM Review можно найти здесь . Эти методы довольно хорошо работают с дорогими оценками функций и не обязательно требуют дифференцируемости или производной информации.
Многие из этих методов требуют некоторой выпуклости, чтобы гарантировать сходимость к глобальному оптимуму, поэтому, если вы решите свою проблему строго, вам может потребоваться объединить эти методы выше с помощью стратегии ветвления и ограничения. Однако, если вы не заботитесь о строгости, такой подход, как MATLAB,
fmincon
может сработать достаточно хорошо (больше нет никаких гарантий). Конечные различия, скорее всего, дадут вам элемент субдифференциала вашей недифференцируемой функции, который может быть достаточным для вашего экземпляра задачи и конкретных входных данных, чтобы получить достаточно точный результат для ваших целей. В этом случае вам, вероятно, следует взглянуть на библиотеки, упомянутые в ответах на вопрос Кристиана, связанный в его комментарии.источник
Если все, что вам нужно, это библиотека C ++ для решения задач нелинейной оптимизации, вы можете использовать RobOptim . Хотя RobOptim изначально разрабатывался с учетом задач оптимизации робототехники, он подходит для любых задач нелинейной оптимизации. Он предоставляет простой интерфейс C ++ с плагинами для нескольких нелинейных решателей ( Ipopt , NAG и т. Д.). Использование таких оболочек облегчает использование другого решателя НЛП. Если вы не можете предоставить градиенты, вычисление с конечной разностью может быть выполнено автоматически.
Это открытый исходный код, поэтому вы можете проверить исходный код на GitHub: https://github.com/roboptim/
Анализ, выполненный @Geoff Oxberry, важен для выбора нелинейного решателя, который будет вызываться RobOptim. Обратите внимание, что при работе с такого рода решателями настройка параметров может оказать огромное влияние на производительность, и вы все равно можете застрять в локальных минимасах (это действительно зависит от типа проблемы, с которой вы сталкиваетесь).
Примечание: я один из разработчиков этого проекта.
источник