Хотя смешанно-целочисленное линейное программирование (MILP) действительно является NP-полным, существуют разрешимые (нетривиальные) примеры смешанно-целочисленного линейного программирования.
NP-полная означает, что смешанное целочисленное линейное программирование:
а) разрешимый за полиномиальное время с помощью недетерминированной машины Тьюринга (часть NP)
б) полиномиальное время, сводимое к 3-SAT (полная часть; для остальной части обсуждения эта часть действительно не имеет значения)
O ( 2N)N
Это утверждение не означает, что «маленькие» экземпляры неразрешимы. К сожалению, я не могу точно сказать, что значит маленький для экземпляра MILP. Я решаю проблемы, которые имеют 3000 или более двоичных переменных решения на регулярной основе. В зависимости от формулировки проблемы, проблемы могут занимать менее 0,01 секунды (что имеет место для относительно недостаточно ограниченных задач) или более часа (что имеет место для задач, в которых активно много ограничений), поскольку проблемы кажутся иметь благоприятную структуру. Я могу сказать, что современные решения для LP могут решать LP с несколькими миллионами непрерывных переменных решения, и что без специальной структуры очень маловероятно, что экземпляр проблемы будет где-то между 1000 и 10,
Если вы думаете, что у вас есть разрешимый экземпляр MILP, вам нужно использовать алгоритм ветвления и ограничения или ветвления и разреза. Лучшие реализации - это CPLEX и Gurobi . Оба они являются коммерческими продуктами, которые имеют бесплатное академическое лицензирование, если вы копаете достаточно. Если вам действительно нужен решатель с открытым исходным кодом, проекты в сообществе COIN-OR являются более подходящими, хотя пакеты с исходным кодом иногда бывают хитрыми. Наиболее значимые проекты были бы СВС ветвей и покрой решатель , симфонический решатель , ВСР ветвей по сниженным ценам решатель , и абак ветвей и покрой решатель . Все эти проекты потребуют нескольких пакетов от COIN-OR., из-за его модульной структуры.
Если вы хотите попробовать несколько решателей, лучше всего использовать интерфейс Open Solver от COIN-OR . Имейте в виду, что некоторые части этого интерфейса позволят вам установить только основные параметры решателя, а чтобы установить дополнительные параметры для решателей, вам следует обратиться к спискам рассылки COIN-OR для получения более подробной информации. Коммерческие решатели MILP НАМНОГО (иногда на порядок и более) быстрее, чем решатели с открытым исходным кодом. Другим вариантом прототипирования является использование языка алгебраического моделирования, такого как GAMS или AMPL . Оба пакета программ являются коммерческими, но имеют пробные версии, которые можно использовать в небольших проблемных случаях. Для более крупных проблемных случаев вы можете отправить файлы GAMS или AMPL вNEOS сервер должен быть решен; этот сервер доступен для общественности.
Если у вас достаточно большой экземпляр MILP, то ни один из этих решателей не будет работать хорошо. Вы могли бы преобразовать целочисленные переменные в непрерывные переменные, решить проблему, а затем округлить до ближайшего набора целочисленных переменных, который является возможным решением вашей проблемы. Оптимальное решение релаксации LP вашей MILP даст вам нижнюю границу для оптимального значения целевой функции вашей MILP (конечно, при условии минимизации), а выполнимое решение вашей MILP даст вам верхнюю границу для оптимальной цели значение функции вашего MILP.
Если вам действительно повезло и ваша матрица ограничений полностью унимодулярна , то вы можете использовать LP-решатель для генерации целочисленных решений для вашей MILP, и вы можете эффективно решить свою проблему, несмотря на ее большой размер. Другие классы задач имеют алгоритмы быстрой аппроксимации, такие как задачи о ранце и проблемы с заготовкой . Специализированные алгоритмы разложения MILP также существуют для задач, которые имеют особую структуру, хотя я не знаком с подробностями, так как эти темы несколько специализированы и выходят за рамки моей диссертации.
Я не знаю полностью полиномиальной схемы аппроксимации времени (FPTAS) специально для MILP, хотя существует FPTAS класса задачи, который включает MILP (см. Эту статью). Я рекомендую использовать один из описанных выше смешанных целочисленных решателей линейного программирования в сочетании с ограничением по времени и соответствующими допусками на разрывы оптимальности. Это даст вам наилучшее из возможных выполнимых решений для вашей MILP в течение срока, и, если решатель успешно завершит работу до истечения срока, выполнимое решение будет оптимальным в пределах установленных вами допусков разрыва оптимальности. Этот курс действий все еще даст вам границы качества решения, потому что ваше допустимое решение будет верхней границей, а решатель может дать вам соответствующую нижнюю оценку. Граница не гарантируется в пределах определенного фактора оптимального решения, но с другой стороны, любой FPTAS станет более дорогим, поскольку приближение станет лучше.
Самая важная вещь, которую вы можете сделать, прежде чем согласиться на составление MILP, - это выбрать самый сильный состав, который вы можете найти; Вы можете найти совет о том, как выбрать сильные формулировки, в разделе « Введение в линейную оптимизацию » Берцимаса и Цициклиса. Основная идея состоит в том, чтобы выбрать формулировку, ограничения которой определяют многогранник, который находится как можно ближе к выпуклой оболочке формулировки (также см. Эти примечания к курсу ). Выбор сильной формулировки может иметь огромное значение во времени, которое требуется для решения проблемы.