Ищем алгоритм оптимизации в C ++ для замены Excel Solver - PullRequest
4 голосов
/ 17 апреля 2011

Поскольку Excel Solver довольно медленно запускается на тысячах оптимизаций (причина в том, что он использует электронную таблицу в качестве интерфейса), я пытаюсь реализовать аналогичный (специфичный для проблемы) решатель в C ++ (с Visual Studio 2010, на 64-битной платформе Win 7). Я бы включил DLL через оператор Declare в VBA и уже имел опыт в этом, так что это не проблема.

Моя проблема заключается в минимизации суммы квадратов ошибок между эмпирическими данными и целевой функцией, которая является нелинейной, но гладкой, и проблема будет включать неотрицательность (X> = 0) или даже ограничения положительности (например, X> = 0,00000001), где Х обозначает переменную решения.

Я ищу надежную, проверенную реализацию. Это может быть частью установленной библиотеки. Например, я уже изучил то, что ALGLIB хранит в магазине (см. http://www.alglib.net/optimization/), и кажется, что только один из их алгоритмов принимает ограниченные ограничения. Но я не знаю, чего это стоит, поэтому я Я пытаюсь собрать некоторые мнения.

Или, с другой стороны, было бы целесообразно дополнить алгоритм Левенберга-Марквардта ALGLIB такими базовыми ограничениями, например, отвергнув каждое промежуточное решение, которое не удовлетворяет моим ограничениям? (думаю, это не сработает, но все же стоит спросить)

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

Существуют модификации метода Левенберга-Марквардта, которые добавляют поддержку ограничений неравенства. Я знаю об одной библиотеке, которая реализует такой алгоритм: Левмар (GPL).

Если вы хотите изменить существующий алгоритм, отказ от плохих решений не поможет, оптимизация, скорее всего, застрянет. Но вы можете сделать замену переменной, например, чтобы убедиться, что X> 0,1, вы можете использовать t ^ 2 + 0,1 вместо X. Я использую этот метод в качестве обходного пути из-за отсутствия встроенных рамочных ограничений в моей программе. Вот цитата из Подбора данных в области химических наук Питера Ганса, которая описывает его лучше: https://github.com/wojdyr/fityk/wiki/InequalityConstraints

0 голосов
/ 25 июля 2011

Вы изучали Microsoft Solver Foundation ? Экспресс-версия бесплатна и поставляется с .NET 4.0 dll. Я нашел это довольно простым в использовании. С другой стороны, я не знаю, насколько серьезна проблема, о которой вы говорите: в экспресс-выпуске есть некоторые ограничения на количество переменных.

0 голосов
/ 17 апреля 2011

Мы считаем OPTIF9 и UNCMIN стандартными методами выбора.Вы должны быть в состоянии связать их в библиотеке и вызывать их из C ++, если вы не хотите беспокоиться о компиляции Fortran.

Один из способов ограничить пространство поиска - преобразовать параметры, напримеркак с помощью функции logit.

...