Как найти оптимальное решение симплекс метод

Подробный разбор симплекс-метода

Время на прочтение
6 мин

Количество просмотров 191K

Пролог

Недавно появилась необходимость создать с нуля программу, реализующую алгоритм симплекс-метода. Но в ходе решения я столкнулся с проблемой: в интернете не так уж много ресурсов, на которых можно посмотреть подробный теоретический разбор алгоритма (его обоснование: почему мы делаем те или иные шаги) и советы по практической реализации — непосредственно, алгоритм. Тогда я дал себе обещание — как только завершу задачу, напишу свой пост на эту тему. Об этом, собственно, и поговорим.

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

§1. Постановка задачи линейного программирования

Определение:

Линейное программирование – математическая дисциплина, посвященная теории и методам решения экстремальных задач на множествах n- мерного пространства, задаваемых системами линейными уравнений и неравенств.

Общая задача линейного программирования (далее – ЛП) имеет вид:

image

§2. Каноническая форма задачи ЛП

Каноническая форма задачи ЛП:

image

Замечание:

Любая задача ЛП сводится к канонической.

Алгоритм перехода от произвольной задачи ЛП к канонической форме:

  1. Неравенства с отрицательными $b_i$ умножаем на (-1).
  2. Если неравенство вида (≤), то к левой части добавляем $s_i$ – добавочную переменную, и получаем равенство.
  3. Если неравенство вида (≥), то из левой части вычитаем $s_i$, и получаем равенство.
  4. Делаем замену переменных:

Замечание:

Будем нумеровать

$s_i$ по номеру неравенства, в которое мы его добавили.

Замечание:

$s_i$ ≥0.

§3. Угловые точки. Базисные/свободные переменные. Базисные решения

Определение:

Точка

$Х ∈ D$ называется угловой точкой, если представление

$ Х= αХ^1+ (1-α) Х^2,где Х^1,Х^2 ∈D;0< α<1 $ возможно только при

$Х^1=Х^2 $.

Иными словами, невозможно найти две точки в области, интервал проходящий через которые содержит

$Х$ (т.е.

$Х$ – не внутренняя точка).

Графический способ решения задачи ЛП показывает, что нахождение оптимального решения ассоциируется с угловой точкой. Это является основной концепцией при разработке симплекс-метода.

Определение:

Пусть есть система m уравнений и n неизвестных (m < n). Разделим переменные на два множества: (n-m) переменные положим равными нулю, а остальные m переменных определяются решением системы исходных уравнений. Если это решение единственно, то тогда ненулевые m переменных называют базисными; нулевые (n-m) переменных – свободными (небазисными), а соответствующие результирующие значения переменных называют базисным решением.

§4. Симплекс-метод

Симплекс-метод позволяет эффективно найти оптимальное решение, избегая простой перебор всех возможных угловых точек. Основной принцип метода: вычисления начинаются с какого-то «стартового» базисного решения, а затем ведется поиск решений, «улучшающих» значение целевой функции. Это возможно только в том случае, если возрастание какой-то переменной приведет к увеличению значения функционала.

Необходимые условия для применения симплекс-метода:

  1. Задача должна иметь каноническую форму.
  2. У задачи должен быть явно выделенный базис.

Определение:

Явно выделенным базисом будем называть вектора вида:

$(..0100..)^T, (..010..)^T,(..0010..)^T...$, т.е. только одна координата вектора ненулевая и равна 1.

Замечание:

Базисный вектор имеет размерность (m*1), где m – количество уравнений в системе ограничений.

Для удобства вычислений и наглядности обычно пользуются симплекс-таблицами:

image

  • В первой строке указывают «наименование» всех переменных.
  • В первом столбце указывают номера базисных переменных, а в последней ячейке – букву Z (это строка функционала).
  • В «середине таблицы» указывают коэффициенты матрицы ограничений — aij.
  • Последний столбец – вектор правых частей соответствующих уравнений системы ограничений.
  • Крайняя правая ячейка – значение целевой функции. На первой итерации ее полагают равной 0.

Замечание:

Базис – переменные, коэффициенты в матрице ограничений при которых образуют базисные вектора.

Замечание:

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

Замечание:

Коэффициенты в строке функционала берутся со знаком “-”.

Алгоритм симплекс-метода:

1. Выбираем переменную, которую будем вводить в базис. Это делается в соответствии с указанным ранее принципом: мы должны выбрать переменную, возрастание которой приведет к росту функционала. Выбор происходит по следующему правилу:

  • Если задача на минимум – выбираем максимальный положительный элемент в последней строке.
  • Если задача на максимум – выбираем минимальный отрицательный.

Такой выбор, действительно, соответствует упомянутому выше принципу: если задача на минимум, то чем большее число вычитаем – тем быстрее убывает функционал; для максимума наоборот – чем большее число добавляем, тем быстрее функционал растет.

Замечание:

Хотя мы и берем минимальное отрицательное число в задаче на максимум, этот коэффициент показывает направление роста функционала, т.к. строка функционала в симплекс-таблице взята со знаком “-”. Аналогичная ситуация с минимизацией.

Определение:

Столбец симплекс-таблицы, отвечающий выбранному коэффициенту, называется ведущим столбцом.

2. Выбираем переменную, которую будем вводить в базис. Для этого нужно определить, какая из базисных переменных быстрее всего обратится в нуль при росте новой базисной переменной. Алгебраически это делается так:

  • Вектор правых частей почленно делится на ведущий столбец
  • Среди полученных значений выбирают минимальное положительное (отрицательные и нулевые ответы не рассматривают)

Определение:

Такая строка называется ведущей строкой и отвечает переменной, которую нужно вывести из базиса.

Замечание:

Фактически, мы выражаем старые базисные переменные из каждого уравнения системы ограничений через остальные переменные и смотрим, в каком уравнении возрастание новой базисной переменной быстрее всего даст 0. Попадание в такую ситуацию означает, что мы «наткнулись» на новую вершину. Именно поэтому нулевые и отрицательные элементы не рассматриваются, т.к. получение такого результата означает, что выбор такой новой базисной переменной будет уводить нас из области, вне которой решений не существует.

3. Ищем элемент, стоящий на пересечении ведущих строки и столбца.

Определение:

Такой элемент называется ведущим элементом.

4. Вместо исключаемой переменной в первом столбце (с названиями базисных переменных) записываем название переменной, которую мы вводим в базис.

5. Далее начинается процесс вычисления нового базисного решения. Он происходит с помощью метода Жордана-Гаусса.

  • Новая Ведущая строка = Старая ведущая строка / Ведущий элемент
  • Новая строка = Новая строка – Коэффициент строки в ведущем столбце * Новая Ведущая строка

Замечание:

Преобразование такого вида направлено на введение выбранной переменной в базис, т.е. представление ведущего столбца в виде базисного вектора.

6. После этого проверяем условие оптимальности. Если полученное решение неоптимально – повторяем весь процесс снова.

§5. Интерпретация результата работы симплекс-метода

1. Оптимальность

Условие оптимальности полученного решения:

  • Если задача на максимум – в строке функционала нет отрицательных коэффициентов (т.е. при любом изменении переменных значение итогового функционала расти не будет).
  • Если задача на минимум – в строке функционала нет положительных коэффициентов (т.е. при любом изменении переменных значение итогового функционала уменьшаться не будет).

2. Неограниченность функционала

Однако, стоит отметить, что заданный функционал может не и достигать максимума/минимума в заданной области. Алгебраический признак этого можно сформулировать следующим образом:

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

Фактически, это значит, что какой бы рост мы не задавали новой базисной переменной, мы никогда не найдем новую вершину. А значит, наша функция не ограничена на множестве допустимых решений.

3. Альтернативные решения

При нахождении оптимального решения возможен еще один вариант – есть альтернативные решения (другая угловая точка, дающая то же самое значение функционала).

Алгебраический признак существования альтернативы:

После достижения оптимального решения имеются нулевые коэффициенты при свободных переменных в строке функционала.

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

Эпилог

Данная статья направлена на более глубокое понимание теоретической части. В замечаниях и пояснениях здесь можно получить ответы на вопросы, которые обычно опускают при изучении этого метода и принимают априори. Однако, надо понимать, что многие методы численной оптимизации основаны на симплекс-методе (например, метод Гомори, М-Метод) и без фундаментального понимания вряд ли получится сильно продвинуться в дальнейшем изучении и применении всех алгоритмов этого класса.

Чуть позже напишу статью о практической реализации симплекс-метода, а также несколько статей о Методе искусственных переменных (М-Метод), Методе Гомори и Методе ветвей и границ.

Спасибо за внимание!

P.S.

Если уже сейчас Вы мучаетесь с реализацией симплекс-метода, советую почитать книгу А. Таха Введение в исследование операций — там все неплохо разобрано и в теории, и на примерах; а также посмотрите примеры решения задач matburo.ru — это поможет с реализацией в коде.

Не путать с «симплекс-методом» — методом оптимизации произвольной функции. См. Метод Нелдера — Мида

Симплекс-метод — алгоритм решения оптимизационной задачи линейного программирования путём перебора вершин выпуклого многогранника в многомерном пространстве.

Сущность метода: построение базисных решений, на которых монотонно убывает линейный функционал, до ситуации, когда выполняются необходимые условия локальной оптимальности.

В работе Л. В. Канторовича «Математические методы организации и планирования производства» (1939) были впервые изложены принципы новой отрасли математики, которая позднее получила название линейного программирования.[1]

Исторически общая задача линейного программирования была впервые поставлена в 1947 году Джорджем Бернардом Данцигом, Маршаллом Вудом и их сотрудниками в департаменте военно-воздушных сил США. В то время эта группа занималась исследованием возможности использования математических и смежных с ними методов для военных задач и проблем планирования. В дальнейшем для развития этих идей в ВВС была организована исследовательская группа под названием Project SCOOP.
Первое успешное решение задачи линейного программирования на ЭВМ SEAC было проведено в январе 1952 года[2].

Описание[править | править код]

Переход от одной вершины к другой

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

Заметим, что каждое из линейных неравенств на переменные ограничивает полупространство в соответствующем линейном пространстве. В результате все неравенства ограничивают некоторый выпуклый многогранник (возможно, бесконечный), называемый также полиэдральным комплексом. Уравнение W(x) = c, где W(x) — максимизируемый (или минимизируемый) линейный функционал, порождает гиперплоскость L(c). Зависимость от c порождает семейство параллельных гиперплоскостей. Тогда экстремальная задача приобретает следующую формулировку — требуется найти такое наибольшее c, что гиперплоскость L(c) пересекает многогранник хотя бы в одной точке. Заметим, что пересечение оптимальной гиперплоскости и многогранника будет содержать хотя бы одну вершину, причём их будет более одной, если пересечение содержит ребро или k-мерную грань. Поэтому максимум функционала можно искать в вершинах многогранника. Принцип симплекс-метода состоит в том, что выбирается одна из вершин многогранника, после чего начинается движение по его рёбрам от вершины к вершине в сторону увеличения значения функционала. Когда переход по ребру из текущей вершины в другую вершину с более высоким значением функционала невозможен, считается, что оптимальное значение c найдено.

Последовательность вычислений симплекс-методом можно разделить на две основные фазы:

  1. нахождение исходной вершины множества допустимых решений,
  2. последовательный переход от одной вершины к другой, ведущий к оптимизации значения целевой функции.

При этом в некоторых случаях исходное решение очевидно или его определение не требует сложных вычислений, например, когда все ограничения представлены неравенствами вида «меньше или равно» (тогда нулевой вектор совершенно точно является допустимым решением, хотя и, скорее всего, далеко не самым оптимальным). В таких задачах первую фазу симплекс-метода можно вообще не проводить. Симплекс-метод, соответственно, делится на однофазный и двухфазный.

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

Усиленная постановка задачи[править | править код]

Рассмотрим следующую задачу линейного программирования:

c^{T}xto max ,Axleqslant b,xgeqslant 0,bgeqslant 0.

Теперь поставим эту задачу в эквивалентной усиленной форме. Необходимо максимизировать Z, где:

{begin{bmatrix}1&-c^{T}&0\0&A&Eend{bmatrix}}{begin{bmatrix}Z\x\x_{s}end{bmatrix}}={begin{bmatrix}0\bend{bmatrix}},x,x_{s}geqslant 0

Здесь x — переменные из исходного линейного функционала, xs — новые переменные, дополняющие старые таким образом, что неравенство переходит в равенство, c — коэффициенты исходного линейного функционала, Z — переменная, которую необходимо максимизировать. Полупространства xgeqslant 0 и x_{s}geqslant 0 в пересечении образуют многогранник, представляющий множество допустимых решений. Разница между числом переменных и уравнений даёт нам число степеней свободы. Проще говоря, если мы рассматриваем вершину многогранника, то это число рёбер, по которым мы можем продолжать движение. Тогда мы можем присвоить этому числу переменных значение 0 и назвать их «небазисными». Остальные переменные при этом будут вычисляться однозначно и называться «базисными». Сам же набор этих переменных называется базисом. Полученная точка будет вершиной в пересечении соответствующих небазисным переменным гиперплоскостей. Для того, чтобы найти т. н. начальное допустимое решение (вершину, из которой мы начнём движение), присвоим всем изначальным переменным x значение 0 и будем их считать небазисными, а все новые будем считать базисными. При этом начальное допустимое решение вычисляется однозначно : {mathbf  {x}}_{{si}}={mathbf  {b}}_{i}.

Алгоритм[править | править код]

Теперь приведём шаги алгоритма. На каждом шаге мы будем менять множества базисных и небазисных векторов (двигаться по рёбрам), и матрица будет иметь следующий вид:

{begin{bmatrix}1&c_{B}^{T}B^{{-1}}A-c^{T}&c_{B}^{T}B^{{-1}}\0&B^{{-1}}A&B^{{-1}}end{bmatrix}}{begin{bmatrix}Z\x\x_{s}end{bmatrix}}={begin{bmatrix}c_{B}^{T}B^{{-1}}b\B^{{-1}}bend{bmatrix}},

где c_{B} — коэффициенты вектора c, соответствующие базисным переменным (переменным x_{s} соответствуют 0), B — столбцы [{mathbf  {A}}{mathbf  {E}}], соответствующие базисным переменным. Матрицу, образованную оставшимися столбцами обозначим D. Почему матрица будет иметь такой вид поясним в описании шагов алгоритма.

Первый шаг.

Выбираем начальное допустимое значение, как указано выше. На первом шаге B — единичная матрица, так как базисными переменными являются x_{s}. c_{B} — нулевой вектор по тем же причинам.

Второй шаг

Покажем, что в выражении (c_{B}^{T}B^{{-1}}A-c^{T})x+(c_{B}^{T}B^{{-1}})x_{s} только небазисные переменные имеют ненулевой коэффициент. Заметим, что из выражения Ax+x_{s}=b базисные переменные однозначно выражаются через небазисные, так как число базисных переменных равно числу уравнений. Пусть x' — базисные, а x'' — небазисные переменные на данной итерации. Уравнение Ax+x_{s}=b можно переписать, как Bx'+Dx''=b. Умножим его на B^{{-1}} слева: x'+B^{{-1}}Dx''=B^{{-1}}b. Таким образом мы выразили базисные переменные через небазисные, и в выражении B^{{-1}}Ax+B^{{-1}}x_{s}, эквивалентному левой части равенства, все базисные переменные имеют единичные коэффициенты. Поэтому, если прибавить к равенству Z-c^{T}x=0 равенство c_{B}^{T}B^{{-1}}Ax+c_{B}^{T}B^{{-1}}x_{s}, то в полученном равенстве все базисные переменные будут иметь нулевой коэффициент — все базисные переменные вида x сократятся, а базисные переменные вида xs не войдут в выражение c_{B}^{T}B^{{-1}}x_{s}.

Выберем ребро, по которому мы будем перемещаться. Поскольку мы хотим максимизировать Z, то необходимо выбрать переменную, которая будет более всех уменьшать выражение

(c_{B}^{T}B^{{-1}}A-c^{T})x+(c_{B}^{T}B^{{-1}})x_{s}.

Для этого выберем переменную, которая имеет наибольший по модулю отрицательный коэффициент[3]. Если таких переменных нет, то есть все коэффициенты этого выражения неотрицательны, то мы пришли в искомую вершину и нашли оптимальное решение. В противном случае начнём увеличивать эту небазисную переменную, то есть перемещаться по соответствующему ей ребру. Эту переменную назовём входящей.

Третий шаг

Теперь необходимо понять, какая базисная переменная первой обратится в ноль по мере увеличения входящей переменной. Для этого достаточно рассмотреть систему:

{displaystyle {begin{bmatrix}B^{-1}A&B^{-1}end{bmatrix}}{begin{bmatrix}x\x_{s}end{bmatrix}}=B^{-1}b}

При фиксированных значениях небазисных переменных система однозначно разрешима относительно базисных, поэтому мы можем определить, какая из базисных переменных первой достигнет нуля при увеличении входящей. Эту переменную назовем выходящей. Это будет означать, что мы натолкнулись на новую вершину. Теперь входящую и выходящую переменную поменяем местами — входящая «войдёт» в базисную, а выходящая из них «выйдет» в небазисные. Теперь перепишем матрицу B и вектор cB в соответствии с новыми наборами базисных и небазисных переменных, после чего вернёмся ко второму шагу. x”

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

Двухфазный симплекс-метод[править | править код]

Причины использования[править | править код]

Если в условии задачи линейного программирования не все ограничения представлены неравенствами типа «≤», то далеко не всегда нулевой вектор будет допустимым решением. Однако каждая итерация симплекс-метода является переходом от одной вершины к другой, и если неизвестно ни одной вершины, алгоритм вообще не может быть начат.

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

Модификация ограничений[править | править код]

Все ограничения задачи модифицируются согласно следующим правилам:

  • ограничения типа «≤» переводятся на равенства созданием дополнительной переменной с коэффициентом «+1». Эта модификация проводится и в однофазном симплекс-методе, дополнительные переменные в дальнейшем используются как исходный базис.
  • ограничения типа «≥» дополняются одной переменной с коэффициентом «−1». Поскольку такая переменная из-за отрицательного коэффициента не может быть использована в исходном базисе, необходимо создать ещё одну, вспомогательную, переменную. Вспомогательные переменные всегда создаются с коэффициентом «+1».
  • ограничения типа «=» дополняются одной вспомогательной переменной.

Соответственно, будет создано некоторое количество дополнительных и вспомогательных переменных. В исходный базис выбираются дополнительные переменные с коэффициентом «+1» и все вспомогательные. Осторожно: решение, которому соответствует этот базис, не является допустимым.

Различия между дополнительными и вспомогательными переменными[править | править код]

Несмотря на то, что и дополнительные, и вспомогательные переменные создаются искусственно и используются для создания исходного базиса, их значения в решении сильно отличаются:

  • дополнительные переменные сообщают, насколько соответствующее им ограничение «недоиспользовано». Значение дополнительной переменной, равное нулю, соответствует равенству значений правых и левых частей ограничения.
  • вспомогательные переменные сообщают, насколько данное условие далеко от допустимого (относительно конкретного ограничения).

Если значение вспомогательной переменной больше нуля, то данное решение не выполняет определённое ограничение, а значит не является допустимым.

То есть ненулевое значение дополнительной переменной может (но не должно) сигнализировать о неоптимальности решения. Ненулевое значение вспомогательной переменной сигнализирует о недопустимости решения.

Фазы решения[править | править код]

После того, как было модифицировано условие, создаётся вспомогательная целевая функция. Если вспомогательные переменные были обозначены, как y_{i}, {displaystyle iin left{1,dots ,kright}}, то вспомогательную функцию определим, как

z'=sum _{{i=1}}^{k}y_{i}to min.

После этого проводится обыкновенный симплекс-метод относительно вспомогательной целевой функции. Поскольку все вспомогательные переменные увеличивают значение z', в ходе алгоритма они будут поочерёдно выводиться из базиса, при этом после каждого перехода новое решение будет всё ближе к множеству допустимых решений.

Когда будет найдено оптимальное значение вспомогательной целевой функции, могут возникнуть две ситуации:

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

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

Модифицированный симплекс-метод[править | править код]

В модифицированном методе матрица

{begin{bmatrix}1&c_{B}^{T}B^{{-1}}A-c^{T}&c_{B}^{T}B^{{-1}}\0&B^{{-1}}A&B^{{-1}}end{bmatrix}}

не пересчитывается, хранится и пересчитывается только матрица B^{{-1}}.
В остальном алгоритм похож на вышеописанный.

1. Вычисляем двойственные переменные d=c_{B}^{T}B^{{-1}}

2. Проверка оптимальности. c_{B}^{T}B^{{-1}}A-c^{T} преобразуется в d^{T}A-c^{T}.

Проверка заключается в вычислении d^{T}A_{n}-c_{n} для всех столбцов nin N.
Столбец со значением < 0 можно вводить в базис.

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

Чаще выбирают значение, меньшее некоторого заданного значения -varepsilon

Если такого столбца не обнаружится, за varepsilon принимается максимальное найденное абсолютное значение и соответствующий столбец A_{J} вводится в базис.

3. Определение выводимого.

Пусть A_{J} — вводимый столбец, соответствующий переменной x_{J}
Базисный план — это решение системы A_{B}p=b
Увеличиваем A_{B}p+vartheta A_{J}=b.

Умножим слева на B^{{-1}}, то есть B^{{-1}}A_{B}p+vartheta B^{{-1}}A_{J}=B^{{-1}}b.

Здесь B^{{-1}}b — базисный план, q=B^{{-1}}A_{J} — разложение вводимого столбца по базису.

Находим максимальное значение vartheta , при котором все значения не отрицательны.
Если vartheta может быть взято как угодно велико, решение не ограничено.
В противном случае один из элементов выйдет на нулевое значение. Выводим соответствующий столбец из базиса.

4. Пересчет опорного(базисного) плана.

Вычисляем новый опорный план по уже приведенной формуле x=p+vartheta B^{{-1}}A_{J} с найденным значением vartheta .

5. Пересчитываем обратную к базисной B^{{-1}}.

Пусть B^{{-1}}A_{F} — выводимый столбец.

Матрица B представима в виде [B_{G}A_{F}]

где B_{G} — базисная матрица без выводимого столбца.

После замены столбца базисная матрица будет иметь вид [B_{G}A_{J}]

Нам нужно найти матрицу B_1, такую что

[B_{G},A_{J}]B_{1}^{{-1}}=E => [B^{{-1}}B_{G}B_{1}^{{-1}},B^{{-1}}A_{J}]=B^{{-1}} =>
[B^{{-1}}B_{G},q]B_{1}^{{-1}}=B^{{-1}} =>

{begin{bmatrix}E&q'\0&q_{f}end{bmatrix}}B_{1}^{{-1}}=B^{{-1}}

Откуда
B_{1}^{{-1}}={begin{bmatrix}E&-q'/q_{f}\0&1/q_{f}end{bmatrix}}B^{{-1}}

Замечание.

При пересчете матрицы B^{{-1}} накапливаются ошибки округления.
Во избежание получения больших ошибок время от времени матрица пересчитывается полностью.
Этот процесс называется «повторением».

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

В мультипликативном варианте матрица B^{{-1}} не хранится, хранятся лишь множители
{begin{bmatrix}E&-q'/q_{f}\0&1/q_{f}end{bmatrix}}

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

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

Во избежание накопления ошибок округления может использоваться LU-разложение матрицы.

При подавляющем числе ограничений типа «неравенство» может быть использован метод переменного базиса.
[4]

Метод основан на том, что базисная матрица может быть представлена в виде

{begin{bmatrix}A_{B}&0\A_{E}&Eend{bmatrix}}

Обратная к ней имеет вид

{begin{bmatrix}A_{B}^{{-1}}&0\-A_{B}^{{-1}}A_{E}&Eend{bmatrix}}

При относительно небольших размерах матрицы A_{B}^{{-1}} остальная часть матрицы может не храниться.

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

Двойственный симплекс-метод[править | править код]

Для реализации двойственного метода необходимо перейти от задачи на минимум к задаче на максимум (или наоборот) путём транспонирования матрицы коэффициентов. При переходе от задачи на минимум целевая функция примет вид:

g=sum _{{i=1}}^{n}b_{i}y_{i}to max

при ограничениях

{displaystyle sum _{i=1}^{n}a_{ij}y_{i}leq c_{j}}.

Теорема двойственности. Если из пары двойственных задач одна
обладает оптимальным планом, то и другая имеет решение, причем
экстремальные значения линейных функций этих задач равны.

Если линейная функция одной из задач не ограничена, то другая не имеет
решения.

Вычислительная эффективность[править | править код]

Симплекс-метод удивительно эффективен на практике, но в 1972 Кли и Минти
[5]
привели пример, в котором симплекс-метод перебирал все вершины симплекса, что показывает экспоненциальную сходимость метода в худшем случае.
С тех пор для каждого варианта метода был найден пример, на котором метод вел себя исключительно плохо.

Наблюдения и анализ эффективности метода в практических приложениях привело к развитию других способов измерения эффективности.

Симплекс-метод имеет среднюю полиномиальную сходимость при широком выборе распределения значений в случайных матрицах.[6][7]

Вычислительная эффективность оценивается обычно при помощи двух параметров:

  • числа итераций, необходимого для получения решения;
  • затрат машинного времени.

В результате численных экспериментов получены следующие результаты.

  1. Число итераций при решении задач линейного программирования в стандартной форме с m ограничениями и n переменными заключено между m и {displaystyle 3m}. Среднее число итераций 2m. Верхняя граница числа итераций равна {displaystyle 2m+n}.[источник не указан 1138 дней]
  2. Требуемое машинное время пропорционально m^{3}.

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

Методы повышения эффективности[править | править код]

Одной из наиболее трудоёмких процедур в симплекс-методе является поиск вводимого в базис столбца.
Для лучшей сходимости, казалось бы, нужно выбирать переменную с наилучшей невязкой, но для этого нужен полный просмотр, то есть нужно умножить столбец двойственных переменных (которые иногда называются теневыми ценами) на все столбцы матрицы[8]. Такой подход хорошо работает для небольших задач, которые решаются вручную. Более того, строгое соблюдение правила выбора максимальной по модулю невязки может оказаться неоптимальным с точки зрения общего количества итераций, необходимых для получения экстремума. Максимальный выигрыш на одной итерации может привести к медленному убыванию значения целевой функции на последующих шагах и, следовательно, замедлить процесс решения задачи[9].

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

Барьер. Как только невязка переменной будет достаточно сильно отличаться от нуля (превосходит некоторой величины, называемой барьером), переменную вводят в базис. Если все невязки оказались меньше барьера, в качестве вводимой выбирается переменная с наименьшей невязкой, сам же барьер уменьшается по некоторому правилу (например, половина наименьшей невязки). Барьер часто используется со следующим приёмом. Близкий подход описан в книге Муртафа, см. раздел 3.6.2. Частичное оценивание книги[10].
Циклический просмотр. Поиск вводимой переменной начинается с позиции, следующей за введённой на предыдущей итерации переменной.
Групповой отбор (В книге Муртафа этот приём называется многократным оцениванием. См. раздел 3.6.3. Многократное оценивание[11].) При поиске вводимой переменной отбирается не одна переменная, а несколько кандидатов. На следующих итерациях просмотр осуществляется только среди отобранных кандидатов, при этом кандидат может из списка вычёркиваться.
Назначение весов. Переменным назначаются веса. См. раздел 3.6.4 Метод оценивания в системе DEVEX Муртафа[12].
Поиск наиболее крутого ребра Гольдфарба и Рида. См. раздел 3.6.5 Метод оценивания с поиском наиболее крутого ребра в книге Муртафа[13].

Возможны и другие приёмы, такие как правило Заде.

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

  1. Канторович Л. В. Математические методы организации планирования производства // Издание Ленинградского государственного университета. — Ленинград, 1939.

  2. С. Гасс. Линейное программирование (методы и приложения). — Москва: Государственное издательство физико-математической литературы, 1961. — (Физико-математическая библиотека инженера).
  3. Такая рекомендация часто встречается в учебниках, но не всегда верна. См. раздел #Методы повышения эффективности
  4. В.И. Муравьёв. Метод последовательного улучшения с базисом переменного размера для задач линейного программирования. — Сборник “Исследование операций и методы статистического моделирования”. — Ленинград: ЛГУ, 1972.
  5. Klee, Victor  (англ.) (рус.; Minty, George J.  (англ.) (рус.. How good is the simplex algorithm? // Inequalities III (Proceedings of the Third Symposium on Inequalities held at the University of California, Los Angeles, Calif., September 1–9, 1969, dedicated to the memory of Theodore S. Motzkin) (англ.) / Shisha, Oved. — New York-London: Academic Press, 1972. — P. 159—175.
  6. Alexander Schrijver, Theory of Linear and Integer Programming. John Wiley & sons, 1998, ISBN 0-471-98232-6 (mathematical)
  7. The simplex algorithm takes on average D steps for a cube. Borgwardt, Karl-Heinz. The simplex method: A probabilistic analysis (англ.). — Berlin: Springer-Verlag, 1987. — Vol. 1. — P. xii+268. — (Algorithms and Combinatorics (Study and Research Texts)). — ISBN 3-540-17096-0.
  8. Рекомендацию выбирать максимальное по модулю значение невязки можно нередко встретить в описаниях симлпекс-метода, например в статьях Алгоритм симплекс-метода Архивная копия от 17 марта 2018 на Wayback Machine и СИМПЛЕКС-МЕТОД ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ Архивная копия от 17 марта 2018 на Wayback Machine
  9. Шамрай, 2009, с. 44.
  10. Муртаф, 1984.
  11. Муртаф, 1984, с. 61.
  12. Муртаф, 1984, с. 62.
  13. Муртаф, 1984, с. 63.

Литература[править | править код]

  • Хемди А. Таха. Глава 3. Симплекс-метод // Введение в исследование операций = Operations Research: An Introduction. — 7-е изд. — М.: «Вильямс», 2007. — С. 95—141. — ISBN 0-13-032374-8.
  • Акулич И.Л. Глава 1. Задачи линейного программирования // Математическое программирование в примерах и задачах. — М.: Высшая школа, 1986. — 319 с. — ISBN 5-06-002663-9.
  • Томас Х. Кормен и др. Глава 29. Линейное программирование // Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 5-8459-0857-4.
  • В. Н. Шевченко, Н. Ю. Золотых. Линейное и целочисленное линейное программирование. — Нижний Новгород: Издательство Нижегородского госуниверситета им. Н.И. Лобачевского, 2004. — С. 63—66 (раздел 2.8. Замечания о сложности решения ЗЛП). — ISBN 5-85746-761-6.
  • Шамрай Наталья Борисовна. Практическое линейное программирование для экономистов. — Владивосток: Изд-во дальневосточного университета, 2009. — С. 44. — ISBN 978-5-7444-2215-8. Архивная копия от 17 марта 2018 на Wayback Machine
  • Муртаф Б. Современное линейное программирование. — Москва: «Мир», 1984.

Ссылки[править | править код]

  • Краткое описание симплекс-метода на сайте Института дистанционного обучения ИНТУИТ
  • Простой онлайн симплекс-решатель с графическим отображением

Симплексный метод решения задач линейного программирования

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

Этот метод включает
в себя три основные этапа:

  1. Построение
    начального опорного плана.

  2. Правило перехода
    к лучшему (точнее, нехудшему) решению.

  3. Критерий проверки
    найденного решения на оптимальность.

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

1) Построение начального опорного плана.

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

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

Базисной
называют плановую переменную, которая
входит только в одно уравнение (а в
другие не входит), и при этом имеет
коэффициент, равный единице.

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

Пример.
Для данной задачи линейного программирования
найти начальный опорный план (базисное
решение).


max

Решение. Изменим
знаки второго и третьего неравенств на
противоположные, умножив каждое из них
на –1. Система ограничений теперь будет
такой:

В
каждом ограничении слева добавим
положительную переменную
,
соответственно запишем канонический
вид задачи:


max

.

Переменные
базисные. Приравниваем их к правым
частям ограничений:Все остальные переменные – свободные,
приравниваем их к нулю:

Запишем теперь
начальный опорный план

(0;
0; 0; 0; 16; 4; 0).

2) Составление симплексных таблиц. Критерий оптимальности.

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

Базис

В

Здесь приняты
следующие обозначения.

Столбец
«Базис» – это базисные переменные.

Столбец
«»
– это коэффициенты при базисных
переменных в целевой функции.

Столбец
«В» – правые части ограничений;

–коэффициенты
при переменных в ограничениях;

–коэффициенты
при переменных в целевой функции.

Последняя
строка в таблице ()
– это проверочная или оценочная строка.

–значение целевой
функции, соответствующее построенному
начальному плану. Его находят так: каждый
элемент столбца
умножают на соответствующий элемент
столбца В и произведения складывают,
т.е.

.

–называют оценками
или симплексными разностями и находят
так: элементы столбца
умножают на соответствующие элементы
столбца,
складывают результаты и вычитают.

Например,

.

Оценки
()
базисных переменных всегда равны нулю.

Признак
оптимальности опорного плана

состоит в следующем:

Опорный
план будет оптимальным тогда и только
тогда, когда все оценки

для задачи на max
и

для задачи на min.

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

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

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

На
пересечении разрешающего столбца и
разрешающей строки находится разрешающий
элемент
.

Теперь начинаем
заполнять следующую таблицу. Покажем
этот процесс на конкретном примере.

Пример.
Решить симплексным методом задачу
линейного программирования.


max

Решение.
1) Приводим задачу к каноническому виду,
т.е. из ограничений неравенств делаем
равенства.


max

2)
Определяем базисные переменные – это
.

3)
Заполняем первую таблицу

Базис

В

2

3

0

0

0

0

0

18

1

3

1

0

0

0

0

16

2

1

0

1

0

0

0

5

0

1

0

0

1

0

0

21

3

0

0

0

0

1

0

–2

–3

0

0

0

0

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

Находим
:;;

Наименьшее
из этих чисел – это число 5, что
соответствует строке базисной переменной
.
Значит, строка базисной переменной– разрешающая, следовательно, из базиса
нужно вывести переменную.
Элемент=1
– разрешающий. Новый базис:.

Заполнение
следующей таблицы начинаем со столбцов
«Базис» и «».
Потом заполняем разрешающую строку,
разделив каждый ее элемент на разрешающий,
т.е. на 1. Все элементы разрешающего
столбца будут нулями, кроме разрешающего,
который всегда равен 1. Столбцы подпереписываем без изменения, т. к. эти
переменные остались в базисе. Остальные
элементы новой таблицы находим по
правилу прямоугольника. Например,
элементнайдем из прямоугольника

=

Или
элемент
=из прямоугольника

Оценки
для новой таблицы можно находить по
этому же правилу.

Вцелом, решение данной задачи симплексным
методом в виде таблиц будет иметь вид

Базис

В

2

3

0

0

0

0

0

18

1

3

1

0

0

0

6

0

16

2

1

0

1

0

0

16

0

5

0

1

0

0

1

0

5

0

21

3

0

0

0

0

1

0

–2

–3

0

0

0

0

таб.
1

0

3

1

0

1

0

–3

0

3

0

11

2

0

0

1

–1

0

5,5

3

5

0

1

0

0

1

0

0

21

3

0

0

0

0

1

7

15

–2

0

0

0

3

0

таб.
2

Базис

В

2

3

0

0

0

0

2

3

1

0

1

0

–3

0

0

5

0

0

–2

1

5

0

1

3

5

0

1

0

0

1

0

5

0

12

0

0

–3

0

9

1

21

0

0

2

0

–3

0

таб.
3

2

6

1

0

–0,2

0,6

0

0

0

1

0

0

–0,4

0,2

1

0

3

4

0

1

0,4

–0,2

0

0

0

3

0

0

0,6

–1,8

0

1

24

0

0

0,8

0,6

0

0

таб.
4

Оценочная
строка четвертой таблицы показывает,
что получен оптимальный план, так как
все.

–это значения
из столбца В, т.е.,,,.

Свободные
(небазисные) переменные
.

Итак,
=
(6; 4; 0; 0; 1; 3),

=
=
24.

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

При использовании
симплексного метода возможны следующие
случаи.

1) Если
в оценочной строке симплекс-таблицы
оценка
=
0 соответствует свободной переменной,
то это означает, что ЗЛП имеет не
единственный оптимальный план.

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

Задания
для самостоятельной работы
.

Определить
оптимальный план задач, используя
симплексный метод решения задач линейного
программирования:

а)


max

б)


min

Решение задач линейного программирования
симплексным методом

Если вы уже разобрались с графическим методом решения задач линейного программирования, самое время переходить к симплекс-методу. В отличие от первого, он практически не имеет ограничений на задачу (любое количество переменных, разные знаки и т.п.) и модифицируется в зависимости от типа задачи (например, М-метод или метод искусственного базиса).

При решении задачи симплекс методом вычисления обычно ведутся (для компактности и наглядности) в таблицах (табличный симплекс-метод), причем последняя таблица с оптимальным решением содержит важную дополнительную информацию: решение двойственной задачи, остатки ресурсов, сведения о дефицитных ресурсах и т.п., которая позволяет провести экономический анализ задачи линейного программирования (см. ниже пример 3).

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

Лучшее спасибо – порекомендовать эту страницу

Решение задач симплекс-методом: примеры онлайн

Задача 1. Компания производит полки для ванных комнат двух размеров – А и В. Агенты по продаже считают, что в неделю на рынке может быть реализовано до 550 полок. Для каждой полки типа А требуется 2 м2 материала, а для полки типа В – 3 м2 материала. Компания может получить до 1200 м2 материала в неделю. Для изготовления одной полки типа А требуется 12 мин машинного времени, а для изготовления одной полки типа В – 30 мин; машину можно использовать 160 час в неделю. Если прибыль от продажи полок типа А составляет 3 денежных единицы, а от полок типа В – 4 ден. ед., то сколько полок каждого типа следует выпускать в неделю?

Задача 2. Решить задачу линейного программирования симплекс-методом.

Задача 3. Предприятие производит 3 вида продукции: А1, А2, А3, используя сырьё двух типов. Известны затраты сырья каждого типа на единицу продукции, запасы сырья на планируемый период, а также прибыль от единицы продукции каждого вида.

Сырьё Затраты сырья на единицу продукции Запас сырья
А1 А2 А3
I 3,5 7 4,2 1400
II 4 5 8 2000
Прибыль от ед. прод. 1 3 3
  1. Сколько изделий каждого вида необходимо произвести, чтобы получить максимум прибыли?
  2. Определить статус каждого вида сырья и его удельную ценность.
  3. Определить максимальный интервал изменения запасов каждого вида сырья, в пределах которого структура оптимального плана, т.е. номенклатура выпуска, не изменится.
  4. Определить количество выпускаемой продукции и прибыль от выпуска при увеличении запаса одного из дефицитных видов сырья до максимально возможной (в пределах данной номенклатуры выпуска) величины.
  5. Определить интервалы изменения прибыли от единицы продукции каждого вида, при которых полученный оптимальный план не изменится.

Задача 4. Решить задачу линейного программирования симплексным методом:

Задача 5. Решить задачу линейного программирования симплекс-методом:

Задача 6. Решить задачу симплекс-методом, рассматривая в качестве начального опорного плана, план, приведенный в условии:

Задача 7. Решить задачу модифицированным симплекс-методом.
Для производства двух видов изделий А и Б используется три типа технологического оборудования. На производство единицы изделия А оборудование первого типа используется а1=4 часов, оборудование второго типа а2=8 часов, а оборудование третьего типа а3=9 часов. На производство единицы изделия Б оборудование первого типа используется б1=7 часов, оборудование второго типа б2=3 часов, а оборудование третьего типа б3=5 часов.
На изготовление этих изделий оборудование первого типа может работать не более чем t1=49 часов, оборудование второго типа не более чем t2=51 часов, оборудование третьего типа не более чем t3=45 часов.
Прибыль от реализации единицы готового изделия А составляет АЛЬФА=6 рублей, а изделия Б – БЕТТА=5 рублей.
Составить план производства изделий А и Б, обеспечивающий максимальную прибыль от их реализации.

Задача 8. Найти оптимальное решение двойственным симплекс-методом

Решаем линейное программирование на заказ

Калькулятор симплекс-метода

Количество переменных:

Количество ограничений:

Очистить

Решить

В двойственную

Выполнено действий:

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

  • Задайте количество переменных и ограничений
  • Введите коэффициенты целевой функции
  • Введите коэффициенты ограничений и выберите условия (≤, = или ≥)
  • Выберите тип решения
  • Нажмите кнопку “Решить”

Что умеет калькулятор симплекс-метода

  • Решает основную задачу линейного программирования
  • Позволяет получить решение с помощью основного симплекс-метода и метода искусственного базиса
  • Работает с произвольным количеством переменных и ограничений

Что такое симплекс-метод

Задача линейного программирования — это задача поиска неотрицательных значений параметров, на которых заданная линейная функция достигает своего максимума или минимума при заданных линейных ограничениях.

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

Если вам тоже ничего не понятно из этого определения, то вы на верном пути. Чаще всего статьи про симплекс-метод очень сильно углубляются в дебри теории задачи линейного программирования, из-за чего очень легко потерять суть и так ничего и не понять. Мы постараемся описать алгоритм симплекс-метода так, чтобы показать, что в нём нет ничего страшного и на самом деле он весьма простой. Но сначала нам всё-таки потребуется ввести несколько определений.

Целевая функция — функция, максимум (или минимум) которой нужно найти. Представляет собой сумму произведений коэффициентов на значения переменных: F = c1·x1 + c2·x2 + … + cn·xn

Ограничение — условие вида a1·x1 + a2·x2 + … + an·xn v b, где вместо v ставится один из знаков: ≤, = или ≥

План — произвольный набор значений переменных x1 … xn.

Алгоритм решения основной задачи ЛП симплекс-методом

Пусть в задаче есть m ограничений, а целевая функция заивисит от n основных переменных. Первым делом необходимо привести все ограничения к каноническому виду — виду, в котором все условия задаются равенствами. Для этого предварительно все неравенства с ≥ умножаются на -1, для получения неравенств с ≤.

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

Пример 1


Привести к каноническому виду ограничения:
2·x1 + 3·x2 + 6·x3 ≤ 240
4·x1 + 2·x2 + 4·x3 = 200
4·x1 + 6·x2 + 8·x3 ≥ 160
Меняем знаки у ограничений с ≥, путём умножения на -1 и добавляем дополнительные переменные к ограничениям с неравенством:
2·x1 + 3·x2 + 6·x3 + x4 = 240
4·x1 + 2·x2 + 4·x3 = 200
-4·x1 – 6·x2 – 8·x3 + x5 = -160


Формирование начального базиса

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

Иначе необходимо выделить среди коэффициентов ограничений столбец, который участвует в формировании единичной матрицы в заданной строке (например, если требуется определить вторую базисную переменную, то необходимо искать столбец, в котором второе число равно 1, а остальные равны нулю). Если такой столбец найден, то переменная, соответствующая этому столбцу, становится базисной.

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

Пример 2


9·x1 + 5·x2 + 4·x3 + 3·x4 + 2·x5 → max
x1 – 2·x2 + 2·x3 ≤ 6
x1 + 2·x2 + x3 + x4 = 24
2·x1 + x2 – 4·x3 + 2·x5 = 30
Для ограничения с неравенством добавляем дополнительную переменную x6.
Перепишем ограничения в каноническом виде:
x1 – 2·x2 + 2·x3 + x6 = 6
x1 + 2·x2 + x3 + x4 = 24
2·x1 + x2 – 4·x3 + 2·x5 = 30

Ищем начальное базисное решение:
Ограничение 1 содержит неравенство, базисной будет добавленная дополнительная переменная x6
Столбец 4 является частью единичной матрицы. Переменная x4 входит в начальный базис
В пятом столбце все значения кроме третьего равны нулю. Поэтому в качестве третьей базисной переменной берём x5, предварительно разделив третью строку на 2.
Симплекс-таблица

базис x1 x2 x3 x4 x5 x6 b
x6 1 -2 2 0 0 1 6
x4 1 2 1 1 0 0 24
? 2 1 -4 0 2 0 30

После преобразования получаем следующую таблицу:

базис x1 x2 x3 x4 x5 x6 b
x6 1 -2 2 0 0 1 6
x4 1 2 1 1 0 0 24
x5 1

1

2

-2 0 1 0 15

Если такой столбец отсутствует, то для формирования базиса необходимо применить исключение Гаусса для первого ненулевого столбца, который ещё не является базисным. Для этого вся строка делится на элемент в найденном столбце, а из остальных строк вычитается полученная строка, разделённая на значение, стоящее в этом же столбце. После этой операции все значения вне данной строки будут обнулены, и столбец можно будет считать базисным.

Пример 3


4·x1 + 5·x2 + 4·x3 → max
2·x1 + 3·x2 + 6·x3 ≤ 240
4·x1 + 2·x2 + 4·x3 = 160
4·x1 + 6·x2 + 8·x3 ≤ 200
Для каждого ограничения с неравенством добавляем дополнительные переменные x4 и x5.
Перепишем ограничения в каноническом виде:
2·x1 + 3·x2 + 6·x3 + x4 = 240
4·x1 + 2·x2 + 4·x3 = 160
4·x1 + 6·x2 + 8·x3 + x5 = 200

Ищем начальное базисное решение:
Ограничение 1 содержит неравенство, базисной будет добавленная дополнительная переменная x4
Ограничение 3 содержит неравенство, базисной будет добавленная дополнительная переменная x5

Начальная симплекс-таблица

базис x1 x2 x3 x4 x5 b
x4 2 3 6 1 0 240
? 4 2 4 0 0 160
x5 4 6 8 0 1 200

Для определения второй базисной переменной ищем первый ненулевой столбец, который ещё не является базисным. Первый столбец не нулевой и не является базисным. Выполняем исключение Гаусса: делим строку 2 на 4, а из первой и третьей строк вычитаем вторую, умноженную на соответствующий элемент в первом столбце.

базис x1 x2 x3 x4 x5 b
x4 2 3 6 1 0 240
x1 4 2 4 0 0 160
x5 4 6 8 0 1 200

После исключения получаем следующую таблицу:

базис x1 x2 x3 x4 x5 b
x4 0 2 4 1 0 160
x1 1

1

2

1 0 0 40
x5 0 4 4 0 1 40

После того как базис сформирован, нужно построить начальную симплекс-таблицу. Она строится следующим образом:

  • Для удобства в первой строке можно записать коэффициенты Ci целевой функции (для дополнительных переменных эти коэффициенты равны нулю)
  • Вторая строка формирует шапку таблицы. В ней первый столбец называется базис, а остальные перечисляют основные переменные x1..xn и дополнительные xn+1..xn+k
  • Затем построчно перечисляются базисные переменные и коэффициенты ограничений

Схематично начальная таблица будет выглядеть примерно так:

C с1 c2 cn 0 0 0 0
базис x1 x2 xn xn+1 xn+2 xn+k b
xe1 a11 a12 a1n a1n+1 a1n+2 a1n+k b1
xe2 a21 a22 a2n a2n+1 a2n+2 a2n+k b2
xem am1 am2 amn amn+1 amn+2 amn+k bm

Избавляемся от отрицательных свободных коэффициентов

После приведения к каноническому виду или после алгебраических преобразований при формировании базиса некоторые из свободных коэффициентов (bi) могли стать отрицательными, что не позволяет перейти к дальнейшим вычислениям. Чтобы избавиться от отрицательных значений b необходимо:

  • Найти строку, в которой находится максимальное по модулю значение b. Пусть это будет строка i;
  • Найти максимальный по модулю элемент в этой строке. Пусть он находится в столбце j;
  • Строку i разделить на элемент, стоящий на пересечении i-ой строки и j-го столбца;
  • Из каждой оставшейся строки k вычесть строку i, умноженную на элемент строки k и столбца j;
  • Переменную, соответствующую найденному столбцу j, сделать базисной (добавить в базис вместо переменной, находящейся в строке i).

Этот шаг необходимо повторять до тех пор, пока все отрицательные b не станут положительными или в строке не останется отрицательных элементов. Если строка с максимальным по модулю bi не содержит отрицательных элементов, то такая задача не имеет решений и на этом алгоритм заканчивает свою работу. В противном случае все bi положительны и алгоритм переходит к следующему этапу — расчёту дельт.

Пример 4


20·x1 + 20·x2 + 10·x3 → min
4·x1 + 3·x2 + 2·x3 ≥ 33
3·x1 + 2·x2 + x3 ≥ 23
x1 + x2 + 2·x3 ≥ 12

Меняем знаки у ограничений с ≥, путём умножения на -1:
-4·x1 – 3·x2 – 2·x3 ≤ -33
– 3·x1 – 2·x2 – x3 ≤ -23
– x1 – x2 – 2·x3 ≤ -12

Для каждого ограничения с неравенством добавляем дополнительные переменные x4..x6.
Перепишем ограничения в каноническом виде:
– 4·x1 – 3·x2 – 2·x3 + x4 = -33
– 3·x1 – 2·x2 – x3 + x5 = -23
– x1 – x2 – 2·x3 + x6 = -12

Ищем начальное базисное решение:
Ограничение 1 содержит неравенство, базисной будет добавленная дополнительная переменная x4
Ограничение 2 содержит неравенство, базисной будет добавленная дополнительная переменная x5
Ограничение 3 содержит неравенство, базисной будет добавленная дополнительная переменная x6

Начальная симплекс-таблица

C 20 20 10 0 0 0 0
базис x1 x2 x3 x4 x5 x6 b
x4 -4 -3 -2 1 0 0 -33
x5 -3 -2 -1 0 1 0 -23
x6 -1 -1 -2 0 0 1 -12

В столбце b присутствуют отрицательные значения.
Максимальное по модулю |b|max = |-33| находится в первой строке.
Максимальный по модулю элемент в первой строке = -4 находится в первом столбце.
В качестве базисной переменной x4 берём x1.
Делим первую строку на -4. Из второй и третьей строк вычитаем первую, умноженную на соответствующий элемент в первом столбце.

Обновлённая таблица:

C 20 20 10 0 0 0 0
базис x1 x2 x3 x4 x5 x6 b
x1 1

3

4

1

2

1

4

0 0

33

4

x5 0

1

4

1

2

3

4

1 0

7

4

x6 0

1

4

3

2

1

4

0 1

15

4

В столбце b присутствуют отрицательные значения.
Максимальное по модулю |b|max = |-

| находится в третьей строке.
Максимальный по модулю элемент в третьей строке = –

находится в третьем столбце.
В качестве базисной переменной x6 берём x3.
Делим третью строку на –

. Из первой и второй строк вычитаем третью, умноженную на соответствующий элемент в третьем столбце.

Обновлённая таблица:

C 20 20 10 0 0 0 0
базис x1 x2 x3 x4 x5 x6 b
x1 1

2

3

0

1

3

0

1

3

7
x5 0

1

6

0

5

6

1

1

3

1

2

x3 0

1

6

1

1

6

0

2

3

5

2


Расчёт дельт

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

Для расчёта дельт используется следующая формула: Δi = ce1·a1i + ce2·a2i + … + cem·ami – ci. Проще говоря, чтобы вычислить дельту по заданной i-ой переменной, нужно перемножить коэффициенты условий в i-ом столбце на коэффициенты целевой функции при соответствующих базисных переменных, сложить эти произведения и вычесть из полученной суммы коэффициент целевой функции столбца i.

Пример 5


Таблица:

C 3 0 2 0 0 -6 0
базис x1 x2 x3 x4 x5 x6 b
x2 2 1 -3 0 0 6 18
x4 -3 0 2 1 0 -2 24
x5

1

5

0

3

5

0 1

4

5

36

5

Вычисляем дельты: Δi = C2·a1i + C4·a2i + C5·a3i – Ci

Симплекс-таблица с дельтами

C 3 0 2 0 0 -6 0
базис x1 x2 x3 x4 x5 x6 b
x2 2 1 -3 0 0 6 18
x4 -3 0 2 1 0 -2 24
x5

1

5

0

3

5

0 1

4

5

36

5

Δ -3 0 -2 0 0 6 0

Проверка плана на оптимальность

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

Пример 6


9·x1 + 5·x2 + 4·x3 + 3·x4 + 2·x5 → max
x1 – 2·x2 + 2·x3 ≤ 6
x1 + 2·x2 + x3 + x4 = 24
2·x1 + x2 – 4·x3 + x5 = 30
Симплекс-таблица с дельтами

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b
x6 1 -2 2 0 0 1 6
x4 1 2 1 1 0 0 24
x5 2 1 -4 0 1 0 30
Δ -2 3 -9 0 0 0 132

Критерий оптимальности: план оптимален, если в таблице отсутствуют отрицательные дельты.
План не оптимален, так как ищется максимум функции, а Δ1 = -2 отрицательна.


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

Переход к более оптимальному решению

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

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

Пример 7


Симплекс-таблица с дельтами

C 2 1 -2 0 0 0 0
базис x1 x2 x3 x4 x5 x6 b
x1 1 -5 0 -3 0 -1 25
x5 0 -16 0 -7 1 -3 57
x3 0 -6 1 -2 0 -1 17
Δ 0 1 0 -2 0 0 16

Проверяем план на оптимальность: план не оптимален, так как ищется минимум функции, а Δ2 = 1 положительна.
Определяем разрешающий столбец – столбец, в котором находится максимальная дельта: 2, Δ2: 1
Находим симплекс-отношения Q, путём деления коэффициентов b на соответствующие значения второго столбца

C 2 1 -2 0 0 0 0
базис x1 x2 x3 x4 x5 x6 b Q
x1 1 -5 0 -3 0 -1 25
x5 0 -16 0 -7 1 -3 57
x3 0 -6 1 -2 0 -1 17
Δ 0 1 0 -2 0 0 16

Все значения второго столбца отрицательны. Функция не ограничена. Оптимальное решение отсутствует.


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

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

Пример 8


Симплекс-таблица с дельтами

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b
x6 1 -2 2 0 0 1 6
x4 1 2 1 1 0 0 24
x5 2 1 -4 0 1 0 30
Δ -2 3 -9 0 0 0 132

Проверяем план на оптимальность: план не оптимален, так как Δ1 = -2 отрицательна.

Итерация 1

Определяем разрешающий столбец – столбец, в котором находится минимальная дельта: 3, Δ3: -9
Находим симплекс-отношения Q, путём деления коэффициентов b на соответствующие значения третьего столбца
В найденном столбце ищем строку с наименьшим значением Q: Qmin = 3, строка 1.
На пересечении найденных строки и столбца находится разрешающий элемент: 2
В качестве базисной переменной x6 берём x3.

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b Q
x3 1 -2 2 0 0 1 6 6 / 2 = 3
x4 1 2 1 1 0 0 24 24 / 1 = 24
x5 2 1 -4 0 1 0 30
Δ -2 3 -9 0 0 0 132

Делим первую строку на 2. Из второй и третьей строк вычитаем первую, умноженную на соответствующий элемент в третьем столбце.
Вычисляем новые дельты: Δi = C3·a1i + C4·a2i + C5·a3i – Ci

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b Q
x3

1

2

-1 1 0 0

1

2

3 3
x4

1

2

3 0 1 0

1

2

21 24
x5 4 -3 0 0 1 2 42
Δ

5

2

-6 0 0 0

9

2

159

Текущий план X: [ 0, 0, 3, 21, 42, 0 ]
Целевая функция F: 9·0 + 5·0 + 4·3 + 3·21 + 2·42 + 0·0 = 159
Проверяем план на оптимальность: план не оптимален, так как Δ2 = -6 отрицательна.

Итерация 2

Определяем разрешающий столбец – столбец, в котором находится минимальная дельта: 2, Δ2: -6
Находим симплекс-отношения Q, путём деления коэффициентов b на соответствующие значения второго столбца
В найденном столбце ищем строку с наименьшим значением Q: Qmin = 7, строка 2.
На пересечении найденных строки и столбца находится разрешающий элемент: 3
В качестве базисной переменной x4 берём x2.

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b Q
x3

1

2

-1 1 0 0

1

2

3
x2

1

2

3 0 1 0

1

2

21 21 / 3 = 7
x5 4 -3 0 0 1 2 42
Δ

5

2

-6 0 0 0

9

2

159

Делим вторую строку на 3. Из первой и третьей строк вычитаем вторую, умноженную на соответствующий элемент во втором столбце.
Вычисляем новые дельты: Δi = C3·a1i + C2·a2i + C5·a3i – Ci

C 9 5 4 3 2 0 0
базис x1 x2 x3 x4 x5 x6 b Q
x3

2

3

0 1

1

3

0

1

3

10
x2

1

6

1 0

1

3

0

1

6

7 7
x5

9

2

0 0 1 1

3

2

63
Δ

7

2

0 0 2 0

7

2

201

Текущий план X: [ 0, 7, 10, 0, 63, 0 ]
Целевая функция F: 9·0 + 5·7 + 4·10 + 3·0 + 2·63 + 0·0 = 201
Проверяем план на оптимальность: отрицательные дельты отсутствуют, следовательно план оптимален.
Ответ: x1 = 0, x2 = 7, x3 = 10, x4 = 0, x5 = 63, F = 201


Метод искусственного базиса

Очень часто при решении задачи линейной оптимизации бывает довольно сложно выполнять алгебраические преобразования над коэффициентами ограничений для поиска начального базиса. Для упрощения вычислений существует альтернативный метод решения, называемый методом искусственного базиса. Его суть заключается в том, что вместо того, чтобы искать базис среди имеющихся основных и дополнительных переменных, ввести так называемые искусственные переменные, которые сформируют начальный базис. Возможно, звучит сложно и непонятно, но сейчас мы всё объясним.

Подготовительный этап

Аналогично базовому симплекс-методу для всех ограничений с неравентством вводятся дополнительные переменные, причём для ограничений с ≥ они берутся с коэффициентом -1, а для ограничений с ≤ с коэффициентом 1. Ограничения с равенством остаются без изменений. Если свободный коэффициент какого-либо из ограничений меньше нуля, то такое ограничение умножается на -1 (знак неравенства при этом меняется на противоположный). После этого приступают к поиску базиса.

Пример 9


3·x1 + 2·x2 + 3·x3 → min
-2·x1 – x2 – x3 ≥ -2
3·x1 + 8·x2 + 2·x3 ≥ 8
2·x1 + x3 = 1
Меняем знаки у ограничений с отрицательными свободными коэффициентами, путём умножения на -1:
2·x1 + x2 + x3 ≤ 2
3·x1 + 8·x2 + 2·x3 ≥ 8
2·x1 + x3 = 1

Для каждого ограничения с неравенством добавляем дополнительные переменные x4 и x5.
Ограничение 1 содержит неравенство, базисной будет добавленная дополнительная переменная x4
Ограничение 2 содержит неравенство с ≥. Базисная переменная для этого ограничения будет определена позднее.
Ограничение 3 содержит равенство. Базисная переменная для этого ограничения будет определена позднее.

Начальная симплекс-таблица

C 3 2 3 0 0 0
базис x1 x2 x3 x4 x5 b
x4 2 1 1 1 0 2
?1 3 8 2 0 -1 8
?2 2 0 1 0 0 1


Формирование начального базиса

Для того, чтобы сформировать начальный базис в первую очередь можно поискать столбец, у которого одно значение равно единице, а все значения остальные значения равны нулю, и сделать соответствующую переменную базисной для этой строки. Однако такое случается довольно редко, поэтому проще сразу перейти к следующему пункту. Для всех ограничений, не имеющих базисной переменной, добавляем искусственную переменную с коэффициентом 1. В целевую функцию добавляем эту же переменную с коэффициентов -M, если ищется максимум или с коэффициентом M, если ищется минимум. M всего лишь является очень большим числом.

Пример 10


x1 – x2 → min
2·x1 + x2 = 1
x1 – 3·x2 + x3 = 3
x1 + 11·x2 = 11
Ограничение 1 содержит равенство. Базисная переменная для этого ограничения будет определена позднее.
Столбец 3 является частью единичной матрицы. Переменная x3 входит в начальный базис
Ограничение 3 содержит равенство. Базисная переменная для этого ограничения будет определена позднее.

Начальная симплекс-таблица

C 1 -1 0 0
базис x1 x2 x3 b
?1 2 1 0 1
x3 1 -3 1 3
?3 1 11 0 11

Для ограничения 1 добавляем искусственную переменную u1 и делаем её базисной.
Для ограничения 3 добавляем искусственную переменную u2 и делаем её базисной.
В целевую функцию добавляем искусственные пременные с коэффициентом M, где M — очень большое число.

Таблица с искусственными переменными

C 1 -1 0 M M 0
базис x1 x2 x3 u1 u2 b
u1 2 1 0 1 0 1
x3 1 -3 1 0 0 3
u2 1 11 0 0 1 11

Перепишем условие задачи с учётом добавленных искусственных переменных:
F = 1x1 -1x2 + Mu1 + Mu2 → min
2·x1 + x2 + u1 = 1
x1 – 3·x2 + x3 = 3
x1 + 11·x2 + u2 = 11


Расчёт дельт и проверка плана на оптимальность

После того, как начальный базис сформирован необходимо вычислить дельты. Дельты вычисляются полностью аналогично базовому методу: Δi = ce1·a1i + ce2·a2i + … + cem·ami – ci. Единственным отличием будет тот факт, что результат может содержать значения с M. Когда дельты будут получены необходимо проверить текущий опорный план на оптимальность (см. проверку плана на оптимальность в базовом симплекс-методе). Если план оптимален, то алгоритм завершает свою работу, иначе формирует более оптимальное решение и повторяет процесс.

Пример 11


Таблица с искусственными переменными

C 3 2 3 0 0 0 M M 0
базис x1 x2 x3 x4 x5 x6 u1 u2 b
x4 2 1 1 1 0 0 0 0 2
u1 3 0 2 0 -1 0 1 0 3
u2 0 0 1 0 0 -1 0 1 1

Вычисляем дельты: Δi = C4·a1i + C7·a2i + C8·a3i – Ci

Δ1 = C4·a11 + C7·a21 + C8·a31 – C1 = 0·2 + M·3 + M·0 – 3 = -3 + 3M
Δ2 = C4·a12 + C7·a22 + C8·a32 – C2 = 0·1 + M·0 + M·0 – 2 = -2
Δ3 = C4·a13 + C7·a23 + C8·a33 – C3 = 0·1 + M·2 + M·1 – 3 = -3 + 3M
Δ4 = C4·a14 + C7·a24 + C8·a34 – C4 = 0·1 + M·0 + M·0 – 0 = 0
Δ5 = C4·a15 + C7·a25 + C8·a35 – C5 = 0·0 + M·(-1) + M·0 – 0 = -M
Δ6 = C4·a16 + C7·a26 + C8·a36 – C6 = 0·0 + M·0 + M·(-1) – 0 = -M
Δ7 = C4·a17 + C7·a27 + C8·a37 – C7 = 0·0 + M·1 + M·0 – M = 0
Δ8 = C4·a18 + C7·a28 + C8·a38 – C8 = 0·0 + M·0 + M·1 – M = 0
Δb = C4·b1 + C7·b2 + C8·b3 – C9 = 0·2 + M·3 + M·1 – 0 = 4M

Симплекс-таблица с дельтами

C 3 2 3 0 0 0 M M 0
базис x1 x2 x3 x4 x5 x6 u1 u2 b
x4 2 1 1 1 0 0 0 0 2
u1 3 0 2 0 -1 0 1 0 3
u2 0 0 1 0 0 -1 0 1 1
Δ -3 + 3M -2 -3 + 3M 0 -M -M 0 0 4M

Текущий план X: [ 0, 0, 0, 2, 0, 0, 3, 1 ]
Целевая функция F: 3·0 + 2·0 + 3·0 + 0·2 + 0·0 + 0·0 + M·3 + M·1 = 4M
Проверяем план на оптимальность: план не оптимален, так как Δ1 = -3 + 3M положительна.


Добавить комментарий