Целочисленное программирование

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Задача целочисленного программирования — это задача математической оптимизации или выполнимости, в которой некоторые или все переменные должны быть целыми числами[1]. Часто термин адресуется к целочисленному линейному программированию (ЦЛП), в котором целевая функция и ограничения (за исключением требования целочисленности) линейны.

Целочисленное программирование является NP-трудной задачей. Специальный случай, 0-1 целочисленное линейное программирование, в которой переменные принимают значения 0 или 1, является одной из 21 NP-полных задач Карпа.

Каноническая и стандартная виды ЦЛП[править | править вики-текст]

Задача целочисленного линейного программирования в каноническом виде выражается как[2]

максимизировать
при условиях
и ,

а в стандартном виде

максимизировать
при условиях
и

где — векторы, а — матрица, все элементы которых являются целыми числами. Заметьте, что, как и в случае линейного программирования, ЦЛП-задача, не находящаяся в стандартном виде, может быть приведена к стандартному виду путём исключения неравенств введением дополнительных и искусственных переменных и заменой переменных, на которые не наложено ограничение неотрицательности, двумя переменными.

Пример[править | править вики-текст]

Целочисленный многогранник с линейным ослаблением

Рисунок справа показывает следующую задачу.

Допустимые целые точки показаны красным и красные пунктирные линии показывают выпуклую оболочку этих точек, которая является наименьшим многоугольником, содержащим все эти точки. Синие линии вместе с координатными осями определяют многоугольник линейного ослабления, который задаётся неравенствами без требования целочисленности. Цель оптимизации — сдвинуть чёрную пунктирную линию так, чтобы она была как можно выше, но касалась пногоугольника. Оптимальные решения целочисленной задачи — точки и , на которых целевая функция принимает значение 2. Единственное решение ослабленной (линейной) задачи — точка , в которой целевая функция принимает значение 2.8. Заметим, что если мы округлим решение задачи линейного программирования до ближайших целых, решение будет недопустимо для ЦЛП.

Доказательство NP-трудности[править | править вики-текст]

Следующее рассуждение является сведением задачи минимизации вершинного покрытия к задаче целочисленного программирования, что доказывает NP-трудность.

Пусть — неориентированный граф. Определим задачу линейного программирования следующим образом:

Если наложить требование, чтобы принимали значения 0 или 1, любое допустимое решение для целочисленного программирования является подмножество вершин. Из первого ограничения следует, что по меньшей мере один конец каждого ребра включена в подмножество. Таким образом, решение даёт покрытие вершин. Кроме того, если задано вершинное покрытие C, можно присвоить значение 1 для любого и 0 для любого , что даёт нам допустимое решение задачи целочисленного программирования. Отсюда мы может заключить, что при минимизации суммы мы получим также минимальное вершинное покрытие[3].

Варианты[править | править вики-текст]

В смешанном целочисленном линейном программировании (СЦЛП) только для части переменных требуется целочисленность, в то время как остальные переменные могут быть нецелочисленными.

В булевом программировании переменные должны принимать значения 0 или 1. Заметим, что любая ограниченная целочисленная переменная может быть выражена как комбинация булевых переменных[4]. Например, если есть целочисленная переменная , её можно выразить через булевых переменных:

Приложения[править | править вики-текст]

Есть две основные причины для использования целых переменных при моделировании задач линейного программирования:

  1. Целочисленные переменные представляют величины, которые могут быть исключительно целыми. Например, невозможно построить 3.7 автомобилей.
  2. Целочисленные переменные представляют решения, которые принимают значения 0 или 1 .

Эти соглашения на практике встречаются часто и, таким образом, целочисленное линейное программирование может быть использовано во многих областях, некоторые из которых коротко освещены ниже.

Производственное планирование[править | править вики-текст]

Смешанное целочисленное программирование имеет много приложений в производстве, включая моделирование календарного планирования. Один из примеров встречается при производственном планировании[en] в сельском хозяйстве для определения выхода продукции, которая может иметь общие ресурсы (такие как земля, труд, расходы, семена, удобрения и т.д.). Возможной целью оптимизации может быть максимизация дохода без выхода за границы имеющихся ресурсов. В некоторых случаях задача может быть выражена как задача линейного программирования, но переменные при этом должны быть целыми.

Планирование[править | править вики-текст]

В этих задачах нужно обеспечить обслуживание и расписание работы транспортной сети. Например, задача может состоять в расстановке автобусов или поездов по маршрутам, чтобы соблюсти расписание, а также обеспечить подвижный состав водителями. Здесь булевы переменные (т.е. принимающее значение 0 или 1) определяют, назначен ли автобус или поезд на маршрут, и назначен ли водитель на конкретный автобус/поезд.

Сети передачи данных[править | править вики-текст]

Целью этой задачи является построение сети передачи данных так, чтобы обеспечить предопределённые требования за минимальную цену[5]. В этой задаче требуется оптимизация как топологии сети, так и пропускной возможности элементов сети. Во многих случаях пропускная способность выражается дискретными величинами, что приводит к целочисленным переменным. Обычно накладываются зависящие от применяемой технологии другие ограничения, которые могут моделироваться целочисленными или булевыми переменными.

Сотовые сети[править | править вики-текст]

Задача планирования частот в мобильных сетях GSM требует распределение допустимых частот по антеннам, чтобы обеспечить связь и минимизировать интерференцию между антеннами[6]. Эту задачу можно сформулировать как задачу линейного программирования, в которой булевы переменные отражают, назначена ли конкретная частота конкретной антенне.

Алгоритмы[править | править вики-текст]

Наивный путь решения задачи ЦЛП — просто игнорировать ограничение целочисленности на переменные x, решить соответствующую задачу ЛП (которая называется линейным ослаблением ограничений задачи ЦЛП), а затем округлить компоненты решения полученной задачи. Однако полученное решение может оказаться не только не оптимальным, оно может оказаться даже недопустимым, то есть некоторые ограничения могут быть нарушены.

Использование полной унимодулярности[править | править вики-текст]

Хотя, в общем случае, целочисленность решения ослабленной задачи не гарантирована, если ЦЛП имеет вид при условиях , где и имеют в качестве элементов целых чисел и является вполне унимодулярной, тогда любое базисное допустимое решение будет целочисленным. Следовательно, решение, которое даёт симплекс-метод, будет заведомо целочисленным[7]. Чтобы показать, что любое базисное решение такой задачи целочисленно, пусть — произвольное допустимое решение. Поскольку допустимо, мы знаем, что . Пусть — элементы, соответствующие базисным столбцам базисного решения . По определению базиса существует некоторая квадратная подматрица матрицы с линейно независимыми столбцами, такая, что .

Поскольку столбцы линейно независимы и матрица квадратная, матрица неособенная, а потому при предположениях, что унимодулярна, выполняется . Поскольку не является особенной, матрица обратима, а потому . По определению, . Здесь означает союзную матрицу для и она целочисленна, поскольку целочисленна. Таким образом,

целочисленна
целочисленен
Любое базисное допустимое решение целочисленно.

Таким образом, если матрица ЦЛП вполне унимодулярна, вместо решения задачи ЦЛП можно использовать линейное ослабление задачи, которое даст целочисленное решение.

Точные алгоритмы[править | править вики-текст]

Если матрица не является вполне унимодулярной, существует ряд алгоритмов, решающих задачу целочисленного линейного программирования точно. Один из классов таких алгоритмов — методы секущих плоскостей (методы Гомори), которые работают путём решения ослабленной линейной задачи с последующим добавлением линейных ограничений, которые отсекают нецелочисленное решение задачи без отсечения целочисленных допустимых решений.

Другой класс алгоритмов — варианты метода ветвей и границ. Например, метод ветвей и отсечений[en], комбинирующий метод ветвей и границ с методами секущих плоскостей. Методы ветвей и границ имеют ряд преимуществ перед алгоритмами, использующими исключительно отсекающие плоскости. Одно из преимуществ — алгоритм можно завершить рано, как только хотя бы одно допустимое целочисленное решение найдено, хотя и не оптимальное. Кроме того, решение ослабленной линейной задачи может быть использовано для оценки, насколько далеко полученное от оптимального. Наконец, методы ветвей и границ можно использовать, чтобы получить несколько оптимальных решений.

Ленстра в 1983 показал[8], что в случае фиксированного числа переменных допустимое решение задачи целочисленного программирования может быть найдено за полиномиальное время.

Эвристические методы[править | править вики-текст]

Поскольку задачи целочисленного линейного программирования NP-трудны, многие задачи трудноразрешимы, так что приходится использовать эвристические методы. Например, может быть использован поиск с запретами[en][9]. Для использования поиска с запретами для решения задачи ЦЛП шаг алгоритма можно определить как увеличение или уменьшение целочисленной переменной, в то время как остальные целочисленные переменные остаются неизменными. Затем находится решение для переменных, на которых ограничение целочисленности не наложено. Для хранения предыдущих попыток может использоваться кратковременная память, в то время как более долговременная память может состоять из значений целочисленных переменных, для которых получены бо́льшие значения целевой функции (в предположении задачи максимизации). Наконец, долгая память может быть использована для поиска целочисленных значений, которые ещё не пробовали.

Другие эвристические методы, которые могут быть применены для решения ЦЛП

Есть также некоторые другие, зависящие от задачи эвристические методы, такие как k-opt эвристика для задачи коммивояжёра. Заметим, что недостатком эвристических методов является то, что в случае неудачи поиска решения метод не определяет, произошло это вследствие отсутствия допустимого решения, или просто алгоритм его найти не может. Далее обычно невозможно определить, насколько близко к оптимальному полученное этим методом решение.

Примечания[править | править вики-текст]

  1. Карманов, 1986, с. 11—12.
  2. Papadimitriou, Steiglitz, 1998.
  3. Erickson.
  4. Williams H.P. Logic and integer programming. — 2009. — Vol. 130. — ISBN 978-0-387-92280-5.
  5. Designing telecommunication networks by integer programming (2012).
  6. Sharma, Deepak Frequency Planning (2010).
  7. Так, например, транспортная задача может рассматриваться как задача линейного программирования и метод потенциалов решения этой задачи является, фактически, симплекс-методом. Базисное решение симплекс-метода соответствует дереву в методе потенциалов, а соответствующая матрица всегда имеет определитель 1. Таким образом, при целочисленных исходных данных решение транспортной задачи симлекс-методом (или методом потенциалов, что равнозначно) всегда получим целочитсленное решение.
  8. Lenstra, 1983.
  9. Glover, 1989, с. 4–32.

Литература[править | править вики-текст]

  • C. H. Papadimitriou, K. Steiglitz. Combinatorial optimization: algorithms and complexity. — Mineola, NY: Dover, 1998. — ISBN 0486402584.
  • Integer Programming Reduction (2015). Архивировано 18 мая 2015 года.
  • H.P. Williams. Logic and integer programming. — 2009. — Т. 130. — (International Series in Operations Research & Management Science). — ISBN 978-0-387-92280-5.
  • H.W. Lenstra Integer programming with a fixed number of variables // Mathematics of operations research. — 1983. — Ноябрь (т. 8, вып. 8).
  • F. Glover Tabu search-Part II // ORSA Journal on computing. — 1989. — Т. 1, вып. 3. — С. 4–32. — DOI:10.1287/ijoc.2.1.4.

Литература для дальнейшего чтения[править | править вики-текст]

  • Карманов В. Г. Математическое программирование. — М.: Наука, 1986. — 288 с.
  • Balinski M. L. Integer Programming: Methods, Uses, Computations // Management Science. — 1965. — Vol. 12, no.3. — P. 253—313. — DOI:10.1287/mnsc.12.3.253.
  • George L. Nemhauser, Laurence A. Wolsey. Integer and combinatorial optimization. — Wiley, 1988. — ISBN 978-0-471-82819-8.
  • Alexander Schrijver. Theory of linear and integer programming. — John Wiley and Sons, 1998. — ISBN 978-0-471-98232-6.
  • Laurence A. Wolsey. Integer programming. — Wiley, 1998. — ISBN 978-0-471-28366-9.
  • Dimitris Bertsimas, Robert Weismantel. Optimization over integers. — Dynamic Ideas, 2005. — ISBN 978-0-9759146-2-5.
  • John K. Karlof. Integer programming: theory and practice. — CRC Press, 2006. — ISBN 978-0-8493-1914-3.
  • H. Paul Williams. Logic and Integer Programming. — Springer, 2009. — ISBN 978-0-387-92279-9.
  • 50 Years of Integer Programming 1958-2008: From the Early Years to the State-of-the-Art / Michael Jünger, Thomas M. Liebling, Denis Naddef, George Nemhauser, William R. Pulleyblank, Gerhard Reinelt, Giovanni Rinaldi, Laurence A. Wolsey. — Springer, 2009. — ISBN 978-3-540-68274-5.
  • Der-San Chen, Robert G. Batson, Yu Dang. Applied Integer Programming: Modeling and Solution. — John Wiley and Sons, 2010. — ISBN 978-0-470-37306-4.

Ссылки[править | править вики-текст]