Каковы преимущества использования Gurobi с AMPL по сравнению с прямым API Gurobi (java, C#, C++ и т. д.) для решения больших задач MIP? Есть ли преимущества в производительности при использовании Gurobi API вместо AMPL?
Использование gurobi с java против gurobi с ampl
Ответы (2)
Вплоть до середины 90-х единственными практическими вариантами использования решателя MIP для крупномасштабных задач (за исключением электронных таблиц) были
- создание файлов mps
- используя низкоуровневый интерфейс C (известный как вызываемая библиотека в cplex)
- с использованием языка домена, такого как AMPL или GAMS.
В то время для моделей MIP нетривиальной сложности модели AMPL были бы гораздо более лаконичными, удобочитаемыми и простыми в обслуживании. Даже сегодня модель AMPL будет больше похожа на математическую формулировку, чем на что-либо еще.
Одним из преимуществ AMPL являются его структуры данных, однако сегодня стандартные библиотеки для C#, Java и C++ имеют отличные структуры данных. Еще одним преимуществом AMPL является то, что его синтаксис выглядит очень интуитивно понятным.
subject to {j in J} sum {i in I} x[i,j] <= b[j]
но новый C++0x и последние версии Java имеют синтаксис, который более точно имитирует этот.
AMPL переносим между решателями, однако интерфейсы между решателями не сильно различаются. Хотя перенос приложения с одного решателя на другой — нетривиальная задача, для меня это не было такой большой проблемой, как попытка переключения баз данных (скажем, с MySQL на Postgres).
У AMPL есть некоторые специфические недостатки. Для большинства бизнес-приложений внедрение AMPL в проект означает добавление еще одного языка программирования. Время, потраченное на изучение AMPL, будет полезно только для написания моделей математического программирования. AMPL имеет крошечную пользовательскую базу по сравнению с Java, C# или даже C++, а усовершенствования базовой технологии исходят только от одной небольшой компании (полной очень умных людей, но, тем не менее, одной маленькой компании). Если вы хотите использовать гибридный подход к решению вашей проблемы оптимизации (например, стратегию генерации столбцов с эвристикой для создания дополнительных столбцов), вам остается только кое-что. Если вы хотите сделать что-то вроде запуска вашего решателя до 1% оптимальности, но работать не менее 10 секунд, вы не можете сделать это с AMPL, но можете сделать это с обратными вызовами, используя один из API Gurobi.
Python может предложить лучшее из обоих миров. Это язык программирования общего назначения, который имеет широкий спектр областей применения. У Gurobi есть собственный Python API, но есть и внутренние языки для предметной области, такие как PuLP и Pyomo, переносимый между решателями.
Есть несколько преимуществ использования AMPL с Gurobi по сравнению с Gurobi API:
- Возможность легко переключаться на другие решатели, если вам это понадобится в будущем.
- Декларативные модели AMPL обычно проще для чтения и являются более высокоуровневыми, чем процедурный код, который используется для создания задач через API.
- AMPL изолирует процесс решателя, что может быть полезно для больших задач. Например, если решателю не хватает памяти, это не повлияет на AMPL.
- AMPL предоставляет встроенные функции для импорта данных и экспорта в базы данных и электронные таблицы.
- AMPL имеет активное сообщество, которое, возможно, больше, чем у любого отдельного решателя, включая Gurobi. Например, Группа Google AMPL насчитывает более 1700 участников и быстро растет. Конечно, AMPL не может конкурировать с языками общего назначения, такими как C++ или Java, с точки зрения пользовательской базы, но только небольшая часть пользователей C++ или Java занимается математической оптимизацией.
При прямом использовании Gurobi API могут быть преимущества в производительности, по крайней мере, собственный C API. Однако накладные расходы, добавляемые AMPL, обычно невелики по сравнению со временем решения, особенно в случае проблем MIP.
Отказ от ответственности: я разработчик программного обеспечения в AMPL.