Вопрос или проблема
В настоящее время я сталкиваюсь с задачей линейного программирования, которую хотел бы решить на C++. Существуют равенства и неравенства, т.е. макс a^{T} x при условии Bx >= c и Dx = e.
Какие активно поддерживаемые библиотеки существуют с хорошим интерфейсом для C++? Что бы вы порекомендовали?
Большое спасибо!
Платформа: Linux (Debian)
Язык программирования: C++ для интерфейса
Лицензия: “бесплатная” (т.е. не обязательно открытая типа “бесплатно”)
Minizinc IDE бесплатна и содержит несколько бесплатных решателей, а также дополнительные сторонние решатели. На странице “программное обеспечение” Minizinc документируется, как реализованы библиотеки и для чего они полезны.
Ответ или решение
Для решения задачи линейного программирования на языке C++ в среде Linux существуют несколько высококачественных библиотек, которые активно поддерживаются и могут удовлетворить ваши требования. Данная область программирования имеет множество решений, каждое из которых имеет свои сильные и слабые стороны. Мы рассмотрим несколько из них, акцентируя внимание на их особенностях, лицензировании и применимости к вашим задачам.
1. Eigen
- Описание: Eigen – это современная библиотека для работы с линейной алгеброй, которая также поддерживает операции, необходимые для решения задач линейного программирования.
- Преимущества:
- Простота в использовании и интеграции в C++ проекты.
- Широкая функциональность, включая матричные операции и численные методы.
- Документация и примеры кода помогают быстро освоить библиотеку.
- Лицензия: MPL2 (Mozilla Public License), что позволяет использовать её без обязательств публикации производных работ.
2. Coin-OR Clp
- Описание: Clp – это библиотека для решения задач линейного программирования, входящая в семью проектов Coin-OR (Computational Infrastructure for Operations Research).
- Преимущества:
- Эффективные алгоритмы для больших задач LP.
- Хорошо документированная C++ API; множество примеров и тестов.
- Активная поддержка и обновления от сообщества.
- Лицензия: EPL (Eclipse Public License); свободное использование в коммерческих и некоммерческих проектах.
3. GLPK (GNU Linear Programming Kit)
- Описание: GLPK – это набор библиотек и программных утилит для линейного и целочисленного программирования.
- Преимущества:
- Поддержка нелинейного программирования и смешанных задач.
- Широкая функциональность, включая возможности для работы с символьными выражениями и драйверами для различных языков.
- Переиспользуемые компоненты для интеграции в другие приложения.
- Лицензия: GPL (GNU General Public License); свободно, но требует обнародования производных работ.
4. Lpsolve
- Описание: lpsolve — это библиотека для решения задач линейного и смешанного целочисленного программирования.
- Преимущества:
- Простой в использовании API.
- Поддержка наиболее распространенных интерфейсов, включая C/C++.
- Возможность решать как малые, так и большие задачи, включая неравенства.
- Лицензия: LGPL (Lesser General Public License); возможность использования в закрытых проектах с минимальными ограничениями.
5. Gurobi
- Описание: Gurobi – это мощный коммерческий решатель для задач линейного, целочисленного и квадратичного программирования.
- Преимущества:
- Один из самых быстрых и эффективных решателей на рынке.
- Хорошая поддержка C++ API и широкий спектр примеров.
- Бесплатная лицензия для учебных и исследовательских учреждений.
- Лицензия: Коммерческая лицензия, но предоставляет бесплатный доступ для академического использования.
Рекомендации
Если вы ищете библиотеку с хорошей производительностью и функциональностью, рекомендуется обратить внимание на Coin-OR Clp и Gurobi (при условии, что вы имеете право использовать последнюю в своей среде). Если же важна возможность интеграции в существующие проекты без ограничения на лицензии, то Eigen или GLPK могут стать отличным выбором.
Заключение
То, какую библиотеку вы выберете, зависит от специфики вашей задачи, требований к производительности и лицензионных ограничений. Исходя из вашего описания, вы имеете доступ к широкому спектру библиотек, которые помогут решить задачу линейного программирования на C++ в системах Linux. Рекомендуется протестировать несколько библиотек на небольших примерах, чтобы оценить их пригодность для ваших нужд.