Генерация столбца
Генерация столбцов или генерация столбцов с задержкой — эффективный алгоритм решения больших линейных программ .
Основная идея заключается в том, что многие линейные программы слишком велики, чтобы явно учитывать все переменные. Таким образом, идея состоит в том, чтобы начать с решения рассматриваемой программы только с подмножеством ее переменных. переменные, которые могут улучшить целевую функцию Затем итеративно в программу добавляются . Как только становится возможным продемонстрировать, что добавление новых переменных больше не будет улучшать значение целевой функции, процедура останавливается. При применении алгоритма генерации столбцов надежда состоит в том, что будет сгенерирована лишь очень небольшая часть переменных. Эта надежда подкрепляется тем, что в оптимальном решении большинство переменных будут небазисными и примут нулевое значение, поэтому оптимальное решение можно найти без них.
Во многих случаях этот метод позволяет решать большие линейные программы, которые в противном случае были бы трудноразрешимы. Классическим примером задачи, в которой он успешно применяется, является задача о раскрое запасов . Одним из конкретных методов линейного программирования, использующих такой подход, является алгоритм декомпозиции Данцига – Вольфа . Кроме того, генерация столбцов применялась для решения многих задач, таких как планирование бригады , маршрутизация транспортных средств и проблема с емкостной p-медианой .
Алгоритм
[ редактировать ]Алгоритм рассматривает две проблемы: основную проблему и подзадачу. Основная проблема — это исходная задача, в которой рассматривается только подмножество переменных. Подзадача — это новая задача, созданная для определения улучшающей переменной ( т. е. которая может улучшить целевую функцию основной задачи).
Далее алгоритм действует следующим образом:
- Инициализируйте основную проблему и подзадачу
- Решите главную проблему
- Поиск улучшающей переменной с помощью подзадачи
- Если найдена улучшающая переменная: добавьте ее к основной проблеме, затем перейдите к шагу 2.
- Иначе: Решение основной задачи оптимально. Останавливаться.
Поиск улучшающей переменной
[ редактировать ]Самая сложная часть этой процедуры — найти переменную, которая может улучшить целевую функцию основной задачи. Это можно сделать, найдя переменную с наиболее отрицательной приведенной стоимостью (предполагая без потери общности , что проблема является проблемой минимизации). Если ни одна переменная не имеет отрицательной приведенной стоимости, то текущее решение основной задачи является оптимальным.
Когда количество переменных очень велико, невозможно найти улучшающую переменную, рассчитав все приведенные затраты и выбрав переменную с отрицательной приведенной стоимостью. Таким образом, идея состоит в том, чтобы вычислить только переменную, имеющую минимальную приведенную стоимость. Это можно сделать с помощью задачи оптимизации, называемой подзадачой ценообразования, которая сильно зависит от структуры исходной задачи. Целевой функцией подзадачи является приведенная стоимость искомой переменной по отношению к текущим двойственным переменным, а ограничения требуют, чтобы переменная подчинялась естественным ограничениям. Метод генерации столбцов особенно эффективен, когда эта структура позволяет решить подзадачу с помощью эффективного алгоритма, обычно специального комбинаторного алгоритма .
Теперь мы подробно расскажем, как и почему вычислять приведенную стоимость переменных. Рассмотрим следующую линейную программу в стандартной форме:
которую мы будем называть основной задачей, а также ее двойственной линейной программой :
Более того, пусть и быть оптимальными решениями для этих двух задач, которые могут быть предоставлены любым линейным решателем. Эти решения проверяют ограничения своей линейной программы и в силу двойственности имеют одинаковое значение целевой функции ( ), который мы назовем . Это оптимальное значение является функцией различных коэффициентов основной задачи: . Обратите внимание, что существует двойственная переменная для каждого ограничения основной линейной модели. Можно показать, что оптимальная двойственная переменная можно интерпретировать как частную производную оптимального значения целевой функции по коэффициенту правой части ограничений: или иначе . Проще говоря, показывает, насколько локально увеличивается оптимальное значение целевой функции при коэффициенте увеличивается на одну единицу.
Предположим теперь, что переменная до сих пор не рассматривалась в основной задаче. Обратите внимание, что это эквивалентно тому, что переменная присутствовал в модели, но принимал нулевое значение. Теперь мы будем наблюдать влияние на основную проблему изменения стоимости от к . Если и соответственно коэффициенты, связанные с переменной в целевой функции и в ограничениях, то линейная программа модифицируется следующим образом:
Чтобы узнать, интересно ли добавить переменную к проблеме ( т.е. позволить ей принимать ненулевое значение), мы хотим знать, является ли значение целевой функции этой новой задачи уменьшается по мере того, как значение переменной увеличивается. Другими словами, мы хотим знать . Для этого обратите внимание, что может быть выражено через значение целевой функции исходной основной задачи: . Затем мы можем вычислить интересующую нас производную:
Другими словами, влияние изменения стоимости по стоимости переводится в два термина. Во-первых, это изменение напрямую влияет на целевую функцию, а во-вторых, изменяется правая часть ограничений, что влияет на оптимальные переменные. величина которого измеряется с использованием двойных переменных . Производная обычно называется приведенной стоимостью переменной и будет обозначаться в следующем.