Линейное программирование ( ЛП ), также называемое линейной оптимизацией , представляет собой метод достижения наилучшего результата (например, максимальной прибыли или наименьших затрат) в математической модели , требования и цели которой представлены линейными отношениями . Линейное программирование является частным случаем математического программирования (также известного как математическая оптимизация ).
Более формально, линейное программирование - это метод оптимизации линейной целевой функции , подчиняющейся ограничениям линейного равенства и линейного неравенства . Его допустимая область - выпуклый многогранник , который является множеством, определяемым как пересечение конечного числа полупространств , каждое из которых определяется линейным неравенством. Его целевая функция - это вещественная -значная аффинная (линейная) функция, определенная на этом многограннике. Алгоритм линейного программирования находит точку в многограннике , где эта функция имеет наибольшее (или наименьшее) значение, если такая точка существует.
Линейные программы — это задачи, которые можно выразить в стандартной форме как
Здесь компоненты — это переменные, которые необходимо определить, и — заданные векторы , а — заданная матрица . Функция, значение которой необходимо максимизировать ( в данном случае), называется целевой функцией . Ограничения и задают выпуклый многогранник , по которому должна быть оптимизирована целевая функция.
Линейное программирование может применяться в различных областях изучения. Оно широко используется в математике и, в меньшей степени, в бизнесе, экономике и некоторых инженерных задачах. Существует тесная связь между линейными программами, собственными уравнениями, моделью общего равновесия Джона фон Неймана и моделями структурного равновесия ( подробнее см. в разделе «Двойственная линейная программа» ). [1] [2] [3] Отрасли, в которых используются модели линейного программирования, включают транспорт, энергетику, телекоммуникации и производство. Оно оказалось полезным при моделировании различных типов задач в планировании , маршрутизации , составлении расписаний , назначении и проектировании.
Проблема решения системы линейных неравенств восходит, по крайней мере, к Фурье , который в 1827 году опубликовал метод их решения [4] и в честь которого назван метод исключения Фурье–Моцкина .
В конце 1930-х годов советский математик Леонид Канторович и американский экономист Василий Леонтьев независимо друг от друга занялись практическим применением линейного программирования. Канторович сосредоточился на производственных графиках, а Леонтьев исследовал экономические приложения. Их новаторская работа в значительной степени игнорировалась в течение десятилетий.
Переломный момент наступил во время Второй мировой войны, когда линейное программирование стало жизненно важным инструментом. Оно нашло широкое применение в решении сложных военных задач, включая транспортную логистику, планирование и распределение ресурсов. Линейное программирование оказалось бесценным в оптимизации этих процессов с учетом критических ограничений, таких как затраты и доступность ресурсов.
Несмотря на свою первоначальную безвестность, успехи военного времени выдвинули линейное программирование в центр внимания. После Второй мировой войны метод получил широкое признание и стал краеугольным камнем в различных областях, от исследования операций до экономики. Незамеченный вклад Канторовича и Леонтьева в конце 1930-х годов в конечном итоге стал основополагающим для более широкого принятия и использования линейного программирования в оптимизации процессов принятия решений. [5]
Работа Канторовича изначально была проигнорирована в СССР . [6] Примерно в то же время, что и Канторович, голландско-американский экономист Т. К. Купманс сформулировал классические экономические проблемы как линейные программы. Позднее Канторович и Купманс разделили Нобелевскую премию по экономике 1975 года . [4] В 1941 году Фрэнк Лорен Хичкок также сформулировал транспортные проблемы как линейные программы и дал решение, очень похожее на более поздний симплекс-метод . [7] Хичкок умер в 1957 году, и Нобелевская премия не присуждается посмертно.
С 1946 по 1947 год Джордж Б. Данциг независимо разработал общую формулировку линейного программирования для использования в задачах планирования в ВВС США. [8] В 1947 году Данциг также изобрел симплекс-метод , который впервые эффективно справился с задачей линейного программирования в большинстве случаев. [8] Когда Данциг организовал встречу с Джоном фон Нейманом для обсуждения своего симплекс-метода, фон Нейман сразу же высказал гипотезу о теории двойственности, поняв, что проблема, над которой он работал в теории игр, эквивалентна. [8] Данциг представил формальное доказательство в неопубликованном отчете «Теорема о линейных неравенствах» 5 января 1948 года. [6] Работа Данцига была обнародована в 1951 году. В послевоенные годы многие отрасли промышленности применяли ее в своем ежедневном планировании.
Первоначальный пример Данцига заключался в поиске наилучшего назначения 70 человек на 70 рабочих мест. Вычислительная мощность, необходимая для проверки всех перестановок с целью выбора наилучшего назначения, огромна; число возможных конфигураций превышает число частиц в наблюдаемой вселенной . Однако требуется всего лишь мгновение, чтобы найти оптимальное решение, представив задачу в виде линейной программы и применив симплексный алгоритм . Теория, лежащая в основе линейного программирования, радикально сокращает число возможных решений, которые необходимо проверить.
Впервые разрешимость задачи линейного программирования за полиномиальное время была продемонстрирована Леонидом Хачияном в 1979 году [9] , но более крупный теоретический и практический прорыв в этой области произошел в 1984 году, когда Нарендра Кармаркар представил новый метод внутренней точки для решения задач линейного программирования. [10]
Линейное программирование является широко используемой областью оптимизации по нескольким причинам. Многие практические проблемы в исследовании операций могут быть выражены как проблемы линейного программирования. [6] Некоторые особые случаи линейного программирования, такие как проблемы сетевых потоков и проблемы многопродуктовых потоков , считаются достаточно важными, чтобы иметь много исследований по специализированным алгоритмам. Ряд алгоритмов для других типов задач оптимизации работают, решая проблемы линейного программирования как подзадачи. Исторически идеи линейного программирования вдохновили многие из центральных концепций теории оптимизации, такие как двойственность, декомпозиция и важность выпуклости и ее обобщений. Аналогично, линейное программирование широко использовалось в раннем формировании микроэкономики , и в настоящее время оно используется в управлении компаниями, такими как планирование, производство, транспортировка и технологии. Хотя современные проблемы управления постоянно меняются, большинство компаний хотели бы максимизировать прибыль и минимизировать затраты при ограниченных ресурсах. Google также использует линейное программирование для стабилизации видеороликов YouTube. [11]
Стандартная форма — это обычная и наиболее интуитивная форма описания задачи линейного программирования. Она состоит из следующих трех частей:
Задача обычно выражается в матричной форме и тогда принимает вид:
Другие формы, такие как задачи минимизации, задачи с ограничениями на альтернативные формы и задачи с отрицательными переменными , всегда можно переписать в эквивалентную задачу в стандартной форме.
Предположим, что у фермера есть участок земли, скажем, L гектаров , который нужно засеять либо пшеницей, либо ячменем, либо какой-то их комбинацией. У фермера есть F килограммов удобрений и P килограммов пестицидов. Каждый гектар пшеницы требует F 1 килограмма удобрений и P 1 килограмма пестицидов, в то время как каждый гектар ячменя требует F 2 килограммов удобрений и P 2 килограммов пестицидов. Пусть S 1 будет ценой продажи пшеницы, а S 2 — ценой продажи ячменя за гектар. Если обозначить площадь земли, засеянную пшеницей и ячменем, как x 1 и x 2 соответственно, то прибыль можно максимизировать, выбрав оптимальные значения для x 1 и x 2 . Эту проблему можно выразить с помощью следующей задачи линейного программирования в стандартной форме:
В матричной форме это принимает вид:
Задачи линейного программирования можно преобразовать в расширенную форму , чтобы применить общую форму симплексного алгоритма . Эта форма вводит неотрицательные переменные слэка для замены неравенств на равенства в ограничениях. Затем задачи можно записать в следующей форме блочной матрицы :
где — вновь введенные резервные переменные, — переменные решения, — переменная, которую необходимо максимизировать.
Приведенный выше пример преобразуется в следующую расширенную форму:
где — (неотрицательные) резервные переменные, представляющие в этом примере неиспользованную площадь, количество неиспользованных удобрений и количество неиспользованных пестицидов.
В матричной форме это принимает вид:
Каждая задача линейного программирования, называемая первичной задачей, может быть преобразована в двойственную задачу , которая обеспечивает верхнюю границу оптимального значения первичной задачи. В матричной форме мы можем выразить первичную задачу как:
Альтернативная первичная формулировка:
В теории двойственности есть две фундаментальные идеи. Одна из них заключается в том, что (для симметричной двойственной) двойственная задача двойственной линейной программы является исходной прямой линейной программой. Кроме того, каждое допустимое решение для линейной программы дает ограничение на оптимальное значение целевой функции ее двойственной задачи. Теорема слабой двойственности утверждает, что значение целевой функции двойственной задачи при любом допустимом решении всегда больше или равно значению целевой функции прямой задачи при любом допустимом решении. Теорема сильной двойственности утверждает, что если прямая задача имеет оптимальное решение x * , то двойственная задача также имеет оптимальное решение y * , и c T x * = b T y * .
Линейная программа также может быть неограниченной или невыполнимой. Теория двойственности говорит нам, что если первостепенная задача неограниченна, то двойственная задача невыполнима по слабой теореме о двойственности. Аналогично, если двойственная задача неограниченна, то и первостепенная задача должна быть невыполнимой. Однако возможно, что и двойственная, и первостепенная задача невыполнимы. Подробности и несколько других примеров см. в статье Двойственная линейная программа .
Покрывающая LP — это линейная программа вида:
такой, что матрица A и векторы b и c неотрицательны.
Двойственной к покрывающей LP является упаковочная LP , линейная программа вида:
такой, что матрица A и векторы b и c неотрицательны.
Покрывающие и упаковочные LP обычно возникают как релаксация линейного программирования комбинаторной задачи и важны при изучении алгоритмов приближения . [12] Например, релаксации LP задачи упаковки множеств , задачи независимого множества и задачи сопоставления являются упаковочными LP. Релаксации LP задачи покрытия множеств , задачи покрытия вершин и задачи доминирующего множества также являются покрывающими LP.
Нахождение дробной раскраски графа — еще один пример покрывающего LP. В этом случае существует одно ограничение для каждой вершины графа и одна переменная для каждого независимого множества графа.
Можно получить оптимальное решение для двойственной задачи, когда известно только оптимальное решение для первичной задачи, используя теорему о дополнительной нежесткости. Теорема гласит:
Предположим, что x = ( x 1 , x 2 , ... , x n ) является первично допустимым и что y = ( y 1 , y 2 , ... , y m ) является дуально допустимым. Пусть ( w 1 , w 2 , ..., w m ) обозначают соответствующие первичные переменные слэка, а ( z 1 , z 2 , ... , z n ) обозначают соответствующие дуальные переменные слэка. Тогда x и y оптимальны для своих соответствующих задач тогда и только тогда, когда
Таким образом, если i -я переменная-слэк первичной матрицы не равна нулю, то i -я переменная двойственной матрицы равна нулю. Аналогично, если j -я переменная-слэк вторичной матрицы не равна нулю, то j -я переменная первичной матрицы равна нулю.
Это необходимое условие оптимальности передает довольно простой экономический принцип. В стандартной форме (при максимизации), если есть излишек в ограниченном первичном ресурсе (т. е. есть «остатки»), то дополнительные количества этого ресурса не должны иметь никакой ценности. Аналогично, если есть излишек в двойном (теневом) ограничении цены неотрицательности, т. е. цена не равна нулю, то должны быть дефицитные поставки (нет «остатков»).
Геометрически линейные ограничения определяют допустимую область , которая является выпуклым многогранником . Линейная функция является выпуклой функцией , что подразумевает, что каждый локальный минимум является глобальным минимумом ; аналогично, линейная функция является вогнутой функцией , что подразумевает, что каждый локальный максимум является глобальным максимумом .
Оптимальное решение не обязательно должно существовать по двум причинам. Во-первых, если ограничения несовместимы, то не существует допустимого решения: например, ограничения x ≥ 2 и x ≤ 1 не могут быть удовлетворены совместно; в этом случае мы говорим, что LP недопустимо . Во-вторых, когда многогранник неограничен в направлении градиента целевой функции (где градиент целевой функции является вектором коэффициентов целевой функции), то не достигается оптимальное значение, поскольку всегда можно добиться лучшего результата, чем любое конечное значение целевой функции.
В противном случае, если допустимое решение существует и если набор ограничений ограничен, то оптимальное значение всегда достигается на границе набора ограничений по принципу максимума для выпуклых функций (или по принципу минимума для вогнутых функций ), поскольку линейные функции являются как выпуклыми, так и вогнутыми. Однако некоторые задачи имеют различные оптимальные решения; например, задача нахождения допустимого решения системы линейных неравенств является задачей линейного программирования, в которой целевая функция является нулевой функцией (т. е. постоянной функцией, принимающей значение ноль всюду). Для этой задачи осуществимости с нулевой функцией в качестве целевой функции, если есть два различных решения, то каждая выпуклая комбинация решений является решением.
Вершины многогранника также называются базовыми допустимыми решениями . Причина такого выбора названия заключается в следующем. Пусть d обозначает число переменных. Тогда фундаментальная теорема линейных неравенств подразумевает (для допустимых задач), что для каждой вершины x * допустимой области LP существует набор из d (или меньше) ограничений-неравенств из LP, такой что, когда мы рассматриваем эти d ограничений как равенства, единственным решением является x * . Таким образом, мы можем изучать эти вершины посредством рассмотрения определенных подмножеств множества всех ограничений (дискретного множества), а не континуума решений LP. Этот принцип лежит в основе симплексного алгоритма для решения линейных программ.
Симплексный алгоритм , разработанный Джорджем Данцигом в 1947 году, решает проблемы LP, строя допустимое решение в вершине многогранника , а затем проходя по пути по ребрам многогранника к вершинам с неубывающими значениями целевой функции, пока не будет достигнут оптимум наверняка. Во многих практических задачах происходит « застревание »: много поворотов выполняются без увеличения целевой функции. [13] [14] В редких практических задачах обычные версии симплексного алгоритма могут фактически «зацикливаться». [14] Чтобы избежать циклов, исследователи разработали новые правила поворотов. [15]
На практике симплексный алгоритм довольно эффективен и может гарантированно найти глобальный оптимум, если принять определенные меры предосторожности против цикличности . Было доказано, что симплексный алгоритм эффективно решает «случайные» задачи, т. е. за кубическое число шагов, [16], что похоже на его поведение на практических задачах. [13] [17]
Однако симплексный алгоритм имеет плохое поведение в худшем случае: Кли и Минти построили семейство задач линейного программирования, для которых симплексный метод выполняет ряд шагов, экспоненциально зависящих от размера задачи. [13] [18] [19] Фактически, в течение некоторого времени не было известно, разрешима ли задача линейного программирования за полиномиальное время , т. е. имеет класс сложности P.
Как и симплексный алгоритм Данцига, алгоритм крест-накрест является алгоритмом обмена базисами, который поворачивается между базисами. Однако алгоритм крест-накрест не обязательно должен поддерживать осуществимость, но может поворачиваться от осуществимого базиса к недопустимому базису. Алгоритм крест-накрест не имеет полиномиальной временной сложности для линейного программирования. Оба алгоритма посещают все 2 D углы (возмущенного) куба в размерности D , куба Кли–Минти , в худшем случае . [15] [20]
В отличие от симплексного алгоритма, который находит оптимальное решение путем обхода ребер между вершинами многогранного множества, методы внутренних точек перемещаются по внутренней части допустимой области.
Это первый наихудший полиномиальный алгоритм, когда-либо найденный для линейного программирования. Чтобы решить задачу, которая имеет n переменных и может быть закодирована в L входных битах, этот алгоритм работает во времени. [9] Леонид Хачиян решил эту давнюю проблему сложности в 1979 году, представив метод эллипсоида . Анализ сходимости имеет предшественников (действительных чисел), в частности итерационные методы, разработанные Наумом З. Шором , и алгоритмы аппроксимации Аркадия Немировского и Д. Юдина.
Алгоритм Хачияна имел важное значение для установления полиномиальной разрешимости линейных программ. Алгоритм не был вычислительным прорывом, поскольку симплексный метод более эффективен для всех, кроме специально построенных семейств линейных программ.
Однако алгоритм Хачияна вдохновил новые направления исследований в линейном программировании. В 1984 году Н. Кармаркар предложил проективный метод для линейного программирования. Алгоритм Кармаркара [10] улучшил полиномиальную границу наихудшего случая Хачияна [9] (давая ). Кармаркар утверждал, что его алгоритм был намного быстрее в практическом ЛП, чем симплексный метод, утверждение, которое вызвало большой интерес к методам внутренней точки. [21] После открытия Кармаркара было предложено и проанализировано много методов внутренней точки.
В 1987 году Вайдья предложил алгоритм, работающий во времени. [22]
В 1989 году Вайдья разработал алгоритм, работающий во времени. [23] Формально говоря, алгоритм в худшем случае выполняет арифметические операции, где — число ограничений, — число переменных, — число бит.
В 2015 году Ли и Сидфорд показали, что линейное программирование может быть решено за время [24] , где обозначает мягкую нотацию O , а представляет собой число ненулевых элементов, и в худшем случае остается решением.
В 2019 году Коэн, Ли и Сонг улучшили время выполнения по времени, является показателем умножения матриц и является двойным показателем умножения матриц . [25] (приблизительно) определяется как наибольшее число, такое, что можно умножить матрицу на матрицу за время. В последующей работе Ли, Сонга и Чжана они воспроизводят тот же результат другим методом. [26] Эти два алгоритма остаются , когда и . Результат, полученный Цзяном, Сонгом, Вайнштейном и Чжаном, улучшился до . [27]
Текущее мнение заключается в том, что эффективность хороших реализаций симплексных методов и методов внутренних точек одинакова для обычных приложений линейного программирования. Однако для определенных типов задач LP может оказаться, что один тип решателя лучше другого (иногда намного лучше), и что структура решений, генерируемых методами внутренних точек по сравнению с симплексными методами, существенно отличается, при этом набор поддержки активных переменных обычно меньше для последнего. [28]
В теории линейного программирования существует несколько открытых проблем, решение которых будет означать фундаментальный прорыв в математике и потенциально значительный прогресс в нашей способности решать крупномасштабные линейные программы.
Этот тесно связанный набор проблем был назван Стивеном Смейлом среди 18 величайших нерешенных проблем 21-го века. По словам Смейла, третья версия проблемы «является главной нерешенной проблемой теории линейного программирования». Хотя существуют алгоритмы для решения линейного программирования за слабо полиномиальное время , такие как методы эллипсоидов и методы внутренней точки , пока не найдено алгоритмов, которые бы обеспечивали сильно полиномиальное время по количеству ограничений и количеству переменных. Разработка таких алгоритмов представляла бы большой теоретический интерес и, возможно, позволила бы также получить практические выгоды при решении больших ЛП.
Хотя гипотеза Хирша была недавно опровергнута для высших измерений, она все еще оставляет открытыми следующие вопросы.
Эти вопросы относятся к анализу производительности и разработке симплекс-подобных методов. Огромная эффективность симплексного алгоритма на практике, несмотря на его экспоненциальную теоретическую производительность, намекает на то, что могут быть вариации симплекса, которые работают за полиномиальное или даже сильно полиномиальное время. Было бы очень важно знать, существуют ли такие варианты, особенно в качестве подхода к решению вопроса о том, можно ли решить LP за сильно полиномиальное время.
Симплексный алгоритм и его варианты попадают в семейство алгоритмов следования по ребрам, названных так потому, что они решают задачи линейного программирования, перемещаясь от вершины к вершине вдоль ребер многогранника. Это означает, что их теоретическая производительность ограничена максимальным числом ребер между любыми двумя вершинами на многограннике LP. В результате нам интересно узнать максимальный теоретико-графовый диаметр многогранных графов . Было доказано, что все многогранники имеют субэкспоненциальный диаметр. Недавнее опровержение гипотезы Хирша является первым шагом к доказательству того, имеет ли какой-либо многогранник суперполиномиальный диаметр. Если такие многогранники существуют, то ни один вариант следования по ребрам не может работать за полиномиальное время. Вопросы о диаметре многогранника представляют независимый математический интерес.
Методы симплексного поворота сохраняют первичную (или двойственную) осуществимость. С другой стороны, методы перекрестного поворота не сохраняют (первичную или двойственную) осуществимость — они могут посещать первичные допустимые, двойственные допустимые или прямо-и-двойственные недопустимые основания в любом порядке. Методы поворота этого типа изучались с 1970-х годов. [29] По сути, эти методы пытаются найти кратчайший путь поворота на многограннике расположения в задаче линейного программирования. В отличие от многогранных графов, графы многогранников расположения, как известно, имеют малый диаметр, что допускает возможность алгоритма перекрестного поворота с сильным полиномиальным временем без решения вопросов о диаметре общих многогранников. [15]
Если все неизвестные переменные должны быть целыми числами, то задача называется задачей целочисленного программирования (IP) или целочисленного линейного программирования (ILP). В отличие от линейного программирования, которое может быть эффективно решено в худшем случае, задачи целочисленного программирования во многих практических ситуациях (с ограниченными переменными) являются NP-трудными . Целочисленное программирование 0–1 или двоичное целочисленное программирование (BIP) является особым случаем целочисленного программирования, где переменные должны быть 0 или 1 (а не произвольными целыми числами). Эта задача также классифицируется как NP-трудная, и фактически ее версия решения была одной из 21 NP-полных задач Карпа .
Если только некоторые из неизвестных переменных должны быть целыми числами, то задача называется задачей смешанного целочисленного (линейного) программирования (MIP или MILP). Они, как правило, также являются NP-трудными, поскольку они даже более общие, чем программы ILP.
Однако существуют некоторые важные подклассы задач IP и MIP, которые можно эффективно решить, в частности, задачи, в которых матрица ограничений полностью унимодулярна , а правые части ограничений являются целыми числами или, что более обще, в которых система обладает свойством полной двойной целочисленности (TDI).
Расширенные алгоритмы решения целочисленных линейных программ включают в себя:
Такие алгоритмы целочисленного программирования обсуждаются Падбергом и Бисли.
Линейная программа в действительных переменных называется целочисленной , если она имеет хотя бы одно оптимальное решение, которое является целочисленным, т. е. состоит только из целых значений. Аналогично, многогранник называется целочисленным, если для всех ограниченных достижимых целевых функций c линейная программа имеет оптимум с целочисленными координатами. Как заметили Эдмондс и Джайлс в 1977 году, можно эквивалентно сказать, что многогранник является целочисленным, если для каждой ограниченной достижимой целочисленной целевой функции c оптимальное значение линейной программы является целым числом.
Интегральные линейные программы имеют центральное значение в полиэдральном аспекте комбинаторной оптимизации , поскольку они обеспечивают альтернативную характеристику проблемы. В частности, для любой проблемы выпуклая оболочка решений является целочисленным многогранником; если этот многогранник имеет хорошее/компактное описание, то мы можем эффективно найти оптимальное допустимое решение при любой линейной цели. И наоборот, если мы можем доказать, что релаксация линейного программирования является интегральной, то это и есть желаемое описание выпуклой оболочки допустимых (целочисленных) решений.
Терминология в литературе неоднородна, поэтому следует внимательно различать следующие два понятия:
Один из распространенных способов доказательства того, что многогранник является целым, состоит в том, чтобы показать, что он полностью унимодулярный . Существуют и другие общие методы, включая свойство целочисленного разложения и полную дуальную целочисленность . Другие известные конкретные интегральные LP включают в себя многогранник соответствия, решетчатые многогранники, субмодулярные потоковые многогранники и пересечение двух обобщенных полиматроидов/ g -полиматроидов – например, см. Schrijver 2003.
Разрешительные лицензии:
Копилефт (взаимные) лицензии:
MINTO (Mixed Integer Optimizer, решатель задач целочисленного программирования , использующий алгоритм ветвей и границ) имеет общедоступный исходный код [33] , но не является открытым исходным кодом.
Проприетарные лицензии: