Алгоритмы линейного программирования

Линейное определение программирования

Линейное программирование является задачей нахождения векторный x, который минимизирует линейную функцию fTx, удовлетворяющий линейным ограничениям:

minxfTx

таким образом, что один или несколько из следующего содержит:

A·x ≤ b
Aeq·x = beq
l ≤ x ≤ u.

Внутренняя точка linprog Алгоритм

linprog 'interior-point' алгоритм очень похож на выпуклый внутренней точкой quadprog Алгоритм. Это также совместно использует много функций с linprog 'interior-point-legacy' алгоритм. Эти алгоритмы имеют ту же общую схему:

  1. Предварительно решите, означая упрощение и преобразование проблемы к стандартной форме.

  2. Сгенерируйте начальную точку. Выбор начальной точки особенно важен для решения алгоритмов внутренней точки эффективно, и этот шаг может быть длительным.

  3. Итерации корректора предиктора, чтобы решить уравнения KKT. Этот шаг является обычно самым длительным.

Предварительно решить

Алгоритм сначала пытается упростить проблему путем удаления сокращения и упрощения ограничений. Задачи, выполняемые во время предварительно решить шага, могут включать следующее:

  • Проверяйте, имеют ли какие-либо переменные равные верхние и нижние границы. Если так, проверяйте на выполнимость, и затем зафиксируйте и удалите переменные.

  • Проверяйте, включает ли какое-либо линейное ограничение неравенства только одну переменную. Если так, проверяйте на выполнимость, и затем измените линейное ограничение в связанное.

  • Проверяйте, включает ли какое-либо линейное ограничение равенства только одну переменную. Если так, проверяйте на выполнимость, и затем зафиксируйте и удалите переменную.

  • Проверяйте, имеет ли какая-либо линейная матрица ограничений нулевые строки. Если так, проверяйте на выполнимость, и затем удалите строки.

  • Определите, сопоставимы ли границы и линейные ограничения.

  • Проверяйте, появляются ли какие-либо переменные только как линейные члены в целевой функции и не появляются ни в каком линейном ограничении. Если так, проверяйте на выполнимость и ограниченность, и затем зафиксируйте переменные в их соответствующих границах.

  • Измените любые линейные ограничения неравенства в линейные ограничения равенства путем добавления слабых переменных.

Если алгоритм обнаруживает неосуществимую или неограниченную проблему, он останавливает и выпускает соответствующее выходное сообщение.

Алгоритм может прибыть в одну допустимую точку, которая представляет решение.

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

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

Сгенерируйте начальную точку

Установить начальную точку, x0, алгоритм делает следующее.

  1. Инициализируйте x0 к ones(n,1), где n число элементов вектора целевой функции f.

  2. Преобразуйте все ограниченные компоненты, чтобы иметь нижнюю границу 0. Если i компонента имеет конечную верхнюю границу u(i), затем x0(i) = u/2.

  3. Для компонентов, которые имеют только один связанный, измените компонент при необходимости, чтобы лечь строго в связанном.

  4. Помещать x0 близко к центральному пути сделайте один шаг корректора предиктора, и затем измените получившееся положение и слабые переменные, чтобы лечь хорошо в любых границах. Для получения дополнительной информации центрального пути, смотрите Носедэла и Райта [7], страница 397.

Корректор предиктора

Подобно fmincon алгоритм внутренней точки, interior-point-convex алгоритм пытается найти точку, где условия Karush-Kuhn-Tucker (KKT) содержат. Чтобы описать эти уравнения для задачи линейного программирования, рассмотрите стандартную форму задачи линейного программирования после предварительной обработки:

minxfTx  при ограничениях {A¯x=b¯x+t=ux,t0.

  • Примите на данный момент, что все переменные имеют по крайней мере один конечный связанный. Путем сдвига и отрицания компонентов, при необходимости, это предположение означает, что все компоненты x имеют нижнюю границу 0.

  • A¯ расширенная линейная матрица, которая включает и линейные неравенства и линейные равенства. b¯ соответствующий линейный вектор равенства. A¯ также включает условия для расширения векторного x со слабыми переменными s, которые поворачивают ограничения неравенства к ограничениям равенства:

    A¯x=(Aeq0AI)(x0s),

    где x 0 средних значений исходный вектор x.

  • t является вектором слаксов, которые преобразуют верхние границы в равенства.

Функция Лагранжа для этой системы включает следующие векторы:

  • y, множители Лагранжа сопоставлены с линейными равенствами

  • v, множители Лагранжа, сопоставленные с нижней границей (ограничение положительности)

  • w, множители Лагранжа сопоставлены с верхней границей

Функция Лагранжа

L=fTxyT(A¯xb¯)vTxwT(uxt).

Поэтому условия KKT для этой системы

fA¯Tyv+w=0A¯x=b¯x+t=uvixi=0witi=0(x,v,w,t)0.

linprog алгоритм использует различное соглашение знака в возвращенных множителях Лагранжа, чем это обсуждение дает. Это обсуждение использует тот же знак в качестве большей части литературы. Смотрите lambda.

Алгоритм сначала предсказывает шаг от формулы Ньютона-Raphson, и затем вычисляет шаг корректора. Корректор пытается уменьшать невязку в нелинейных уравнениях взаимозависимости sizi  = 0. Шаг Ньютона-Raphson

(0A¯T0IIA¯0000I0I00V00X000W0T)(ΔxΔyΔtΔvΔw)=(fA¯Tyv+wA¯xb¯uxtVXWT)=(rdrprubrvxrwt),(1)

где X, V, W и T являются диагональными матрицами, соответствующими векторам x, v, w и t соответственно. Вектора невязок на ультраправой стороне уравнения:

  • rd, двойная невязка

  • rp, основная невязка

  • rub, невязка верхней границы

  • rvx, невязка взаимозависимости нижней границы

  • rwt, невязка взаимозависимости верхней границы

Итеративное отображение сообщает об этих количествах:

Основная недопустимость=rp1+rub1Двойная недопустимость=rd.

Чтобы решить уравнение 1, сначала преобразуйте его в форму симметрической матрицы

(DA¯TA¯0)(ΔxΔy)=(Rrp),(2)

где

D=X1V+T1WR=rdX1rvx+T1rwt+T1Wrub.

Все обратные матрицы в определениях D и R просты вычислить, потому что матрицы являются диагональными.

Чтобы вывести уравнение 2 из уравнения 1, заметьте, что вторая строка уравнения 2 совпадает со второй строкой матрицы уравнения 1. Первая строка уравнения 2 прибывает из решения последних двух строк уравнения 1 для Δv и Δw и затем решения для Δt.

Уравнение 2 симметрично, но это не положительно определенный из-за термина –D. Поэтому вы не можете решить его с помощью факторизации Холесского. Еще несколько шагов приводят к различному уравнению, которое является положительно определенный, и следовательно может быть решено эффективно факторизацией Холесского.

Второй набор строк уравнения 2

A¯Δx=rp

и первый набор строк

DΔx+A¯TΔy=R.

Замена

Δx=D1A¯TΔy+D1R

дает

A¯D1A¯TΔy=A¯D1Rrp.(3)

Обычно, самый эффективный способ найти шаг Ньютона состоит в том, чтобы решить уравнение 3 для Δy с помощью факторизации Холесского. Факторизация Холесского возможна, потому что матрица, умножающаяся Δy, очевидно симметрична и, в отсутствие степеней вырождения, положительна определенный. Позже, чтобы найти шаг Ньютона, назад займите место, чтобы найти Δx, Δt, Δv, и Δw. Однако, когда A¯ имеет плотный столбец, может быть более эффективно решить уравнение 2 вместо этого. linprog алгоритм внутренней точки выбирает алгоритм решения на основе плотности столбцов.

Для получения дополнительной информации алгоритма смотрите Mehrotra [6].

После вычисления откорректированного шага Ньютона алгоритм выполняет больше вычислений, чтобы получить и более длинный текущий шаг и подготовиться к лучшим последующим шагам. Эти несколько вычислений коррекции могут улучшать и производительность и робастность. Для получения дополнительной информации смотрите Gondzio [4].

Алгоритм корректора предиктора является в основном тем же самым как полным quadprog 'interior-point-convex' версия, за исключением квадратичных условий. Смотрите Полный Корректор Предиктора.

Остановка условий

Алгоритм корректора предиктора выполняет итерации, пока он не достигает точки, которая выполнима (удовлетворяет ограничениям к в допусках), и где относительные размеры шага малы. А именно, задайте

ρ=max(1,A¯,f,b¯).

Алгоритм останавливается, когда всем этим условиям удовлетворяют:

rp1+rub1ρTolConrdρTolFunrcTolFun,

где

rc=maxi(min(|xivi|,|xi|,|vi|),min(|tiwi|,|ti|,|wi|)).

rc по существу измеряет размер остаточных значений взаимозависимости xv и tw, которые являются каждым нулевые вектора в решении.

Устаревшее внутренней точкой линейное программирование

Введение

Устаревший внутренней точкой метод по умолчанию основан на LIPSOL ([52]), который является вариантом алгоритма корректора предиктора Мехротры ([47]), основной двойной метод внутренней точки.

Основной алгоритм

Алгоритм начинается путем применения ряда предварительной обработки шагов (см. Предварительную обработку). После предварительной обработки проблема имеет форму

minxfTx таким образом , что {Ax=b0xu.(4)

Ограничения верхних границ неявно включены в матрицу ограничений A. Со сложением основных слабых переменных s уравнение 4 становится

minxfTx таким образом , что {Ax=bx+s=ux0, s0.(5)

который упоминается как основная проблема: x состоит из основных переменных, и s состоит из основных слабых переменных. Двойная проблема

maxbTyuTw  таким образом , что  {ATyw+z=fz0, w0,(6)

то, где y и w состоят из двойных переменных and z, состоит из двойных слаксов. Условия оптимальности для этой линейной программы, т.е. основное уравнение 5 и двойное уравнение 6,

F(x,y,z,s,w)=(Axbx+suATyw+zfxizisiwi)=0,                 x0, z0, s0, w0,(7)

где xizi и siwi обозначают покомпонентное умножение.

linprog алгоритм использует различное соглашение знака в возвращенных множителях Лагранжа, чем это обсуждение дает. Это обсуждение использует тот же знак в качестве большей части литературы. Смотрите lambda.

Квадратные уравнения xizi  = 0 и siwi  = 0 называются условиями взаимозависимости для линейной программы; другие (линейные) уравнения называются условиями выполнимости. Количество

xTz + sTw

разрыв дуальности, который измеряет невязку фрагмента взаимозависимости F когда (x,z,s,w) ≥ 0.

Алгоритм является основным двойным алгоритмом, означая, что и основное и двойные программы решены одновременно. Это может быть рассмотрено подобным Ньютону методом, применился к линейно-квадратичной системе F (x,y,z,s,w) = 0 в уравнении 7, в то время как одновременно хранение выполняет итерации x, z, w и положительного s, таким образом метод внутренней точки имени. (Выполнение итерации находится в строго внутренней области, представленной ограничениями неравенства в уравнении 5.)

Алгоритм является вариантом алгоритма корректора предиктора, предложенного Mehrotra. Рассмотрите выполнить итерации v = [x;y;z;s;w], где [x;z;s;w] > 0 Первых вычисляет так называемое направление предсказания

Δvp=(FT(v))1F(v),

который является направлением Ньютона; затем так называемое направление корректора

Δvc=(FT(v))1F(v+Δvp)μe^,

где μ > 0 называется сосредотачивающимся параметром и должен быть выбран тщательно. e^ нулевой вектор с теми соответствующими квадратным уравнениям в F (v), т.е. возмущения только применяются к условиям взаимозависимости, которые все квадратичны, но не к условиям выполнимости, которые все линейны. Эти два направления объединены параметром длины шага α > 0 и обновляются, v, чтобы получить новое выполняют итерации v +:

v+=v+α(Δvp+Δvc),

где параметр длины шага α выбран так, чтобы

v+ = [x+;y+;z+;s+;w+]

удовлетворяет

[x+;z+;s+;w+]> 0.

В решении для предыдущих направлений предиктора/корректора алгоритм вычисляет (разреженную) прямую факторизацию на модификации Факторов Холесского A·AT. Если A имеет плотные столбцы, он вместо этого использует формулу Шермана-Моррисона. Если то решение не соответствует (невязка является слишком большой), это выполняет LDL-разложение увеличенной системной формы уравнений шага, чтобы найти решение. (См. Пример 4 — Структура D (MATLAB) в MATLAB® ldl страница ссылки на функцию.)

Алгоритм затем циклы до выполнения итерации сходится. Основной критерий остановки является стандартным:

max(rbmax(1,b),rfmax(1,f),rumax(1,u),|fTxbTy+uTw|max(1,|fTx|,|bTyuTw|))tol,

где

rb=Axbrf=ATyw+zfru={x}+su

основная невязка, двойная невязка и выполнимость верхней границы соответственно ({x} означает тех x с конечными верхними границами), и

fTxbTy+uTw

различие между основными и двойными объективными значениями, и tol является некоторым допуском. Сумма в критерии остановки измеряет общие относительные погрешности условий оптимальности в уравнении 7.

Мера основной недопустимости || rb ||, и мера двойной недопустимости || rf ||, где норма является Евклидовой нормой.

Предварительная обработка

Алгоритм сначала пытается упростить проблему путем удаления сокращения и упрощения ограничений. Задачи, выполняемые во время предварительно решить шага, могут включать следующее:

  • Проверяйте, имеют ли какие-либо переменные равные верхние и нижние границы. Если так, проверяйте на выполнимость, и затем зафиксируйте и удалите переменные.

  • Проверяйте, включает ли какое-либо линейное ограничение неравенства только одну переменную. Если так, проверяйте на выполнимость, и затем измените линейное ограничение в связанное.

  • Проверяйте, включает ли какое-либо линейное ограничение равенства только одну переменную. Если так, проверяйте на выполнимость, и затем зафиксируйте и удалите переменную.

  • Проверяйте, имеет ли какая-либо линейная матрица ограничений нулевые строки. Если так, проверяйте на выполнимость, и затем удалите строки.

  • Определите, сопоставимы ли границы и линейные ограничения.

  • Проверяйте, появляются ли какие-либо переменные только как линейные члены в целевой функции и не появляются ни в каком линейном ограничении. Если так, проверяйте на выполнимость и ограниченность, и затем зафиксируйте переменные в их соответствующих границах.

  • Измените любые линейные ограничения неравенства в линейные ограничения равенства путем добавления слабых переменных.

Если алгоритм обнаруживает неосуществимую или неограниченную проблему, он останавливает и выпускает соответствующее выходное сообщение.

Алгоритм может прибыть в одну допустимую точку, которая представляет решение.

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

Для простоты алгоритм переключает все нижние границы, чтобы обнулить.

В то время как эти шаги предварительной обработки могут сделать много, чтобы ускорить итеративную часть алгоритма, если множители Лагранжа требуются, шаги предварительной обработки должны быть отменены, поскольку множители, вычисленные во время алгоритма, для преобразованной проблемы, а не оригинала. Таким образом, если множители не требуют, это преобразование назад не вычисляется и может сэкономить некоторое время в вычислительном отношении.

Двойной симплексный алгоритм

На высоком уровне, linprog 'dual-simplex' алгоритм по существу выполняет симплексный алгоритм на dual problem.

Алгоритм начинается путем предварительной обработки как описано в Предварительной обработке. Для получения дополнительной информации смотрите Андерсена и Андерсена [1] и Носедэл и Райт [7], Глава 13. Эта предварительная обработка уменьшает исходную задачу линейного программирования до формы уравнения 4:

minxfTx таким образом , что {Ax=b0xu.

A и b являются преобразованными версиями исходных ограничительных матриц. Это - основная проблема.

Основная выполнимость может быть задана в терминах + функция

x+={xесли x>00если x0.

Мера основной недопустимости

Primal infeasibility=((lbx)+)2+((xub)+)2+((Axb)+)2+|Aeqxbeq|2.

Как объяснено в уравнении 6, двойная проблема состоит в том, чтобы найти векторы y и w и слабым переменным векторным z, которые решают

maxbTyuTw  таким образом , что  {ATyw+z=fz0, w0.

linprog алгоритм использует различное соглашение знака в возвращенных множителях Лагранжа, чем это обсуждение дает. Это обсуждение использует тот же знак в качестве большей части литературы. Смотрите lambda.

Мера двойной недопустимости

Dual infeasibility=ATy+zwf2.

Это известно (например, см. [7]), что любое конечное решение двойной проблемы дает решение основной проблемы, и любое конечное решение основной проблемы дает решение двойной проблемы. Кроме того, если или основная или двойная проблема неограниченна, то другая проблема неосуществима. И если или основная или двойная проблема неосуществима, то другая проблема или неосуществима или неограниченна. Поэтому эти две проблемы эквивалентны в терминах получения конечного решения, если вы существуете. Поскольку основные и двойные проблемы математически эквивалентны, но вычислительные шаги отличаются, может быть лучше решить основную задачу путем решения двойной задачи.

Чтобы помочь облегчить степень вырождения (см. Носедэла и Райта [7], страница 366), двойной симплексный алгоритм начинается путем беспокойства целевой функции.

Фаза 1 двойного симплексного алгоритма должна найти двойную допустимую точку. Алгоритм делает это путем решения вспомогательной задачи линейного программирования.

 Фаза 1 Схема

Во время Фазы 2 решатель неоднократно выбирает входящую переменную и переменную отъезда. Алгоритм выбирает переменную отъезда согласно методу, предложенному Форрестом и Голдфарбом [3] названный двойной оценкой самого крутого ребра. Алгоритм выбирает входящую переменную с помощью изменения теста отношения Харриса, предложенного Коберштайном [5]. Чтобы помочь облегчить степень вырождения, алгоритм может ввести дополнительные возмущения во время Фазы 2.

 Фаза 2 Схема

Решатель выполняет итерации, пытаясь обеспечить двойную выполнимость при сокращении основной недопустимости, пока решение уменьшаемой, встревоженной проблемы не и основное выполнимый и двойной выполнимый. Алгоритм раскручивает возмущения, которые он ввел. Если решение (к встревоженной проблеме) двойное неосуществимый для невозмутимой (исходной) проблемы, то решатель восстанавливает двойную выполнимость с помощью основного симплекса или алгоритмов Фазы 1. Наконец, решатель раскручивает шаги предварительной обработки, чтобы возвратить решение исходной проблемы.

Основные и неосновные переменные

Этот раздел задает основание условий, неоснование и основные возможные решения для задачи линейного программирования. Определение принимает, что проблема дана в следующей стандартной форме:

minxfTx таким образом , что {Ax=b,lbxub.

(Обратите внимание на то, что A и b не являются матрицей и вектором, задающим неравенства в исходной проблеме.) Принимают, что A является m-by-n матрица ранга m < n, столбцами которого является {a 1a 2 ..., an}. Предположим это {ai1,ai2,...,aim} основание для пробела столбца A, с набором индекса B = {i 1, i 2..., im}, и что N = {1, 2 ..., n }\\B является дополнением B. Субматрица A B называется основанием и дополнительной субматрицей A N, называется неоснованием. Вектором основных переменных является x B, и вектором неосновных переменных является x N. В каждой итерации в фазе 2 алгоритм заменяет один столбец текущего основания со столбцом неоснования и обновляет переменные x B и x N соответственно.

Если x является решением A·x = , b и все неосновные переменные в x N равны или их нижним или верхним границам, x называется основным решением. Если кроме того, основные переменные в x B удовлетворяют своим нижним и верхним границам, так, чтобы x был допустимой точкой, x называется основным возможным решением.

Ссылки

[1] Андерсен, E. D. и К. Д. Андерсен. Предварительное решение в линейном программировании. Математика. Программирование 71, 1995, стр 221–245.

[2] Applegate, D. L. R. E. Биксби, В. Чватэл и В. Дж. Кук, проблема коммивояжера: вычислительное исследование, издательство Принстонского университета, 2007.

[3] Форрест, J. J. и Д. Голдфарб. Алгоритмы симплекса самого крутого ребра для линейного программирования. Математика. Программирование 57, 1992, стр 341–374.

[4] Gondzio, J. “Несколько коррекций центрированности в основном двойном методе для линейного программирования”. Вычислительная Оптимизация и Приложения, Объем 6, Номер 2, 1996, стр 137–156. Доступный в https://www.maths.ed.ac.uk/~gondzio/software/correctors.ps.

[5] Коберштайн, A. Прогресс двойного симплексного алгоритма для того, чтобы решить крупномасштабные задачи LP: методы для быстрой и устойчивой реализации. Вычислительный Optim. и Приложение 41, 2008, стр 185–204.

[6] Mehrotra, S. “На Реализации Основного Двойного Метода внутренней точки”. SIAM Journal на Оптимизации, Издании 2, 1992, стр 575–601.

[7] Nocedal, J. и С. Дж. Райт. Числовая оптимизация, второй выпуск. Ряд Спрингера в исследовании операций, Springer-Verlag, 2006.

Для просмотра документации необходимо авторизоваться на сайте