- Пролог
- §1. Постановка задачи линейного программирования
- §2. Каноническая форма задачи ЛП
- §3. Угловые точки. Базисные/свободные переменные. Базисные решения
- Калькулятор симплекс-метода
- Как пользоваться калькулятором
- Что умеет калькулятор симплекс-метода
- Что такое симплекс-метод
- Алгоритм решения основной задачи ЛП симплекс-методом
- Формирование начального базиса
- Избавляемся от отрицательных свободных коэффициентов
- Симплекс метод онлайн
- Предупреждение
- Симплекс метод
- Примеры решения ЗЛП симплекс методом
- Примеры решения ЗЛП методом искусственного базиса
- 🎥 Видео
Пролог
Недавно появилась необходимость создать с нуля программу, реализующую алгоритм симплекс-метода. Но в ходе решения я столкнулся с проблемой: в интернете не так уж много ресурсов, на которых можно посмотреть подробный теоретический разбор алгоритма (его обоснование: почему мы делаем те или иные шаги) и советы по практической реализации — непосредственно, алгоритм. Тогда я дал себе обещание — как только завершу задачу, напишу свой пост на эту тему. Об этом, собственно, и поговорим.
Замечание. Пост будет написан достаточно формальным языком, но будет снабжен комментариями, которые должны внести некоторую ясность. Такой формат позволит сохранить научный подход и при этом, возможно, поможет некоторым в изучении данного вопроса.
§1. Постановка задачи линейного программирования
Определение: Линейное программирование – математическая дисциплина, посвященная теории и методам решения экстремальных задач на множествах n- мерного пространства, задаваемых системами линейными уравнений и неравенств.
Общая задача линейного программирования (далее – ЛП) имеет вид:
§2. Каноническая форма задачи ЛП
Каноническая форма задачи ЛП:
Замечание: Любая задача ЛП сводится к канонической.
Алгоритм перехода от произвольной задачи ЛП к канонической форме:
- Неравенства с отрицательными умножаем на (-1).
- Если неравенство вида (≤), то к левой части добавляем – добавочную переменную, и получаем равенство.
- Если неравенство вида (≥), то из левой части вычитаем , и получаем равенство.
- Делаем замену переменных:
- Если , то
- Если — любой, то , где
Замечание: Будем нумеровать по номеру неравенства, в которое мы его добавили.
Замечание: ≥0.
§3. Угловые точки. Базисные/свободные переменные. Базисные решения
Определение: Точка называется угловой точкой, если представление возможно только при .
Иными словами, невозможно найти две точки в области, интервал проходящий через которые содержит (т.е. – не внутренняя точка).
Графический способ решения задачи ЛП показывает, что нахождение оптимального решения ассоциируется с угловой точкой. Это является основной концепцией при разработке симплекс-метода.
Определение: Пусть есть система m уравнений и n неизвестных (m
Видео:СИМПЛЕКС МЕТОД: ЗАДАЧА ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯСкачать
Калькулятор симплекс-метода
Видео:Решение системы уравнений методом ГауссаСкачать
Как пользоваться калькулятором
- Задайте количество переменных и ограничений
- Введите коэффициенты целевой функции
- Введите коэффициенты ограничений и выберите условия (≤, = или ≥)
- Выберите тип решения
- Нажмите кнопку «Решить»
Видео:Cимплексный метод решения задачи линейного программирования (ЗЛП)Скачать
Что умеет калькулятор симплекс-метода
- Решает основную задачу линейного программирования
- Позволяет получить решение с помощью основного симплекс-метода и метода искусственного базиса
- Работает с произвольным количеством переменных и ограничений
Видео:Симплексный метод (табличный оформление №1) решения задачи линейного программирования.Скачать
Что такое симплекс-метод
Задача линейного программирования — это задача поиска неотрицательных значений параметров, на которых заданная линейная функция достигает своего максимума или минимума при заданных линейных ограничениях.
Симплекс-метод — алгоритм решения оптимизационной задачи линейного программирования путём перебора вершин выпуклого многогранника в многомерном пространстве. Алгоритм является универсальным методом, которым можно решить любую задачу линейного программирования.
Если вам тоже ничего не понятно из этого определения, то вы на верном пути. Чаще всего статьи про симплекс-метод очень сильно углубляются в дебри теории задачи линейного программирования, из-за чего очень легко потерять суть и так ничего и не понять. Мы постараемся описать алгоритм симплекс-метода так, чтобы показать, что в нём нет ничего страшного и на самом деле он весьма простой. Но сначала нам всё-таки потребуется ввести несколько определений.
Целевая функция — функция, максимум (или минимум) которой нужно найти. Представляет собой сумму произведений коэффициентов на значения переменных: F = c1·x1 + c2·x2 + . + cn·xn
Ограничение — условие вида a1·x1 + a2·x2 + . + an·xn v b , где вместо v ставится один из знаков: ≤, = или ≥
План — произвольный набор значений переменных x1 . xn.
Видео:Графический метод решения задачи линейного программирования (ЗЛП)Скачать
Алгоритм решения основной задачи ЛП симплекс-методом
Пусть в задаче есть m ограничений, а целевая функция заивисит от n основных переменных. Первым делом необходимо привести все ограничения к каноническому виду — виду, в котором все условия задаются равенствами. Для этого предварительно все неравенства с ≥ умножаются на -1, для получения неравенств с ≤.
Чтобы привести ограничения с неравенствами к каноническому виду, для каждого ограничения вводят переменную, называемую дополнительной с коэффициентом 1. В ответе эти переменные учитываться не будут, однако сильно упростят начальные вычисления. При этом дополнительные переменные являются базисными, а потому могут быть использованы для формирования начального опорного решения.
Формирование начального базиса
После того как задача приведена к каноническому виду, необходимо найти начальный базис для формирования первого опорного решения. Если в процессе приведения были добавлены дополнительные переменные, то они становятся базисными.
Иначе необходимо выделить среди коэффициентов ограничений столбец, который участвует в формировании единичной матрицы в заданной строке (например, если требуется определить вторую базисную переменную, то необходимо искать столбец, в котором второе число равно 1, а остальные равны нулю). Если такой столбец найден, то переменная, соответствующая этому столбцу, становится базисной.
В противном случае можно поискать столбец, в котором все значения кроме числа в заданной строке равны нулю, и, если он будет найден, то разделить все значения строки на число, стоящее на пересечении этих строки и столбца, тем самым образовав столбец, участвующий в формировании единичной матрицы.
Ищем начальное базисное решение:
Ограничение 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 | -2 | 0 | 1 | 0 | 15 |
Если такой столбец отсутствует, то для формирования базиса необходимо применить исключение Гаусса для первого ненулевого столбца, который ещё не является базисным. Для этого вся строка делится на элемент в найденном столбце, а из остальных строк вычитается полученная строка, разделённая на значение, стоящее в этом же столбце. После этой операции все значения вне данной строки будут обнулены, и столбец можно будет считать базисным.
Ищем начальное базисное решение:
Ограничение 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 | 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 положительны и алгоритм переходит к следующему этапу — расчёту дельт.
Для каждого ограничения с неравенством добавляем дополнительные переменные 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
Видео:Математика без Ху!ни. Метод Гаусса.Скачать
Симплекс метод онлайн
Данный онлайн калькулятор решает задачу линейного программирования симплекс методом. Дается подробное решение с пояснениями. Для решения задачи линейного программирования задайте количество ограничений и количество переменных. Затем введите данные в ячейки и нажимайте на кнопку «Вычислить». Теоретическую часть смотрите в статье: Решение задачи линейного программирования. Симплекс метод.
Предупреждение
Инструкция ввода данных. Числа вводятся в виде целых чисел (примеры: 487, 5, -7623 и т.д.), десятичных чисел (напр. 67., 102.54 и т.д.) или дробей. Дробь нужно набирать в виде a/b, где a и b (b>0) целые или десятичные числа. Примеры 45/5, 6.6/76.4, -7/6.7 и т.д.
Видео:Симплекс-метод. Простое объяснение.Скачать
Симплекс метод
Симплекс метод − это метод решения задачи линейного программирования (ЗЛП). Суть метода заключается в нахождении начального допустимого плана, и в последующем улучшении плана до достижения максимального (или минимального) значения целевой функции в данном выпуклом многогранном множестве или выяснения неразрешимости задачи. Подробнее в статье: Решение задачи линейного программирования. Симплекс метод.
Видео:Метод Жордана-Гаусса (метод прямоугольников). ВидеоурокСкачать
Примеры решения ЗЛП симплекс методом
Пример 1. Решить следующую задачу линейного программирования:
Р е ш е н и е. Матрица коэффициентов системы уравнений имеет вид:
Правая часть ограничений системы уравнений имеет вид:
Составляем симплексную таблицу. В столбец x0 записывается правая часть ограничений. С правой стороны записывается матрица коэффициентов A. Последняя строка — это целевая функция, умноженная на −1. Последние три векторы столбцы обазуют базис в трехмерном пространствое. Следовательно базисные переменные , а свободные переменные :
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательные элементы. Самый большой по модулю отрицательный элемент (-3), следовательно в базис входит вектор x2. Определяем, какой вектор выходит из базиса. Для этого вычисляем при . min(40:6, 28:2)=20/3 соответствует строке 1. Из базиса выходит вектор x3. Сделаем исключение Гаусса для столбца x2, учитывая, что ведущий элемент соответствует строке 1. Обнулим все элементы этого столбца, кроме ведущего элемента. Для этого сложим строки строки 2, 3, 4 со строкой 1, умноженной на -1/3, 1/6, 1/2, соответственно. Далее делим строку с ведущим элементом на ведущий элемент.
Симплекс таблица примет следующий вид:
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательный элемент (-3), следовательно в базис входит вектор x1. Определяем, какой вектор выходит из базиса. Для этого вычисляем при . min(44/3:11/3, 62/3:5/3)=4 соответствует строке 2. Из базиса выходит вектор x4. Сделаем исключение Гаусса для столбца x1, учитывая, что ведущий элемент соответствует строке 2. Обнулим все элементы этого столбца, кроме ведущего элемента. Для этого сложим строки строки 1, 3, 4 со строкой 2, умноженной на 1/11, -5/11, 9/11, соответственно. Далее делим строку с ведущим элементом на ведущий элемент.
Симплекс таблица примет следующий вид:
Запишем текущий опорный план:
Текущий опорный план является оптимальным, так как в строках 4 под переменными нет отрицательных элементов.
Решение можно записать так: .
Значение целевой функции в данной точке: F(X)=.
Пример 2. Найти максимум функции
Р е ш е н и е. Матрица коэффициентов системы уравнений имеет вид:
Правая часть ограничений системы уравнений имеет вид:
Составляем симплексную таблицу. В столбец x0 записывается правая часть ограничений. С правой стороны записывается матрица коэффициентов A. Последняя строка — это целевая функция, умноженная на −1:
Базисные векторы x4, x3, следовательно, все элементы в столбцах x4, x3, ниже горизонтальной линии должны быть нулевыми.
Обнулим все элементы столбца x4, кроме ведущего элемента. Для этого сложим строку 3 со строкой 1, умноженной на 4. Обнулим все элементы столбца x3, кроме ведущего элемента. Для этого сложим строку 3 со строкой 2, умноженной на 1.
Симплекс таблица примет вид:
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательный элемент (-11), следовательно в базис входит вектор x2. Определяем, какой вектор выходит из базиса. Для этого вычисляем при . Все следовательно целевая функция неограничена сверху. Т.е. задача линейного программирования неразрешима.
Видео:Метод Гаусса решения систем линейных уравненийСкачать
Примеры решения ЗЛП методом искусственного базиса
Пример 1. Найти максимум функции
Р е ш е н и е. Так как количество базисных векторов должен быть 3, то добавляем искусственное переменное, а в целевую функцию добавляем это переменное, умноженное на −M, где M, очень большое число:
Матрица коэффициентов системы уравнений имеет вид:
Правая часть ограничений системы уравнений имеет вид:
Составляем симплексную таблицу. В столбец x0 записывается правая часть ограничений. С правой стороны записывается матрица коэффициентов A. Последние две строки − это целевая функция, умноженная на −1 и разделенная на две части. Последняя строка − строка с исскуственными переменными:
Базисные векторы следовательно, все элементы в столбцах ниже горизонтальной линии должны быть нулевыми.
Обнулим все элементы столбца кроме ведущего элемента. Для этого сложим строку 5 со строкой 3, умноженной на -1.
Симплекс таблица примет вид:
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательные элементы. Самый большой по модулю отрицательный элемент (-5), следовательно в базис входит вектор Определяем, какой вектор выходит из базиса. Для этого вычисляем при соответствует строке 3. Из базиса выходит вектор Сделаем исключение Гаусса для столбца учитывая, что ведущий элемент соответствует строке 3. Обнулим все элементы этого столбца, кроме ведущего элемента. Для этого сложим строки строку 5 со строкой 3, умноженной на 1. Далее делим строку с ведущим элементом на ведущий элемент.
Симплекс таблица примет следующий вид:
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательные элементы. Самый большой по модулю отрицательный элемент (-3), следовательно в базис входит вектор Определяем, какой вектор выходит из базиса. Для этого вычисляем при соответствует строке 1. Из базиса выходит вектор x2. Сделаем исключение Гаусса для столбца x1, учитывая, что ведущий элемент соответствует строке 1. Обнулим все элементы этого столбца, кроме ведущего элемента. Для этого сложим строки строки 2, 3, 4 со строкой 1, умноженной на 3/2, -1/10, 3/2, соответственно. Далее делим строку с ведущим элементом на ведущий элемент.
Симплекс таблица примет следующий вид:
Запишем текущий опорный план:
Данный опорный план не является оптимальным, так как в последней строке есть отрицательные элементы. Самый большой по модулю отрицательный элемент (-13/2), следовательно в базис входит вектор x3. Определяем, какой вектор выходит из базиса. Для этого вычисляем при соответствует строке 3. Из базиса выходит вектор x5. Сделаем исключение Гаусса для столбца x3, учитывая, что ведущий элемент соответствует строке 3. Обнулим все элементы этого столбца, кроме ведущего элемента. Для этого сложим строки строки 1, 2, 4 со строкой 3, умноженной на 5/3, 25/9, 65/9, соответственно. Далее делим строку с ведущим элементом на ведущий элемент.
Симплекс таблица примет следующий вид:
Запишем текущий опорный план:
Текущий опорный план является оптимальным, так как в строках 4−5 под переменными нет отрицательных элементов.
Решение исходной задачи можно записать так:
. |
Значение целевой функции в данной точке:
. |
Пример 2. Найти оптимальный план задачи линейного программирования:
Р е ш е н и е. Так как количество базисных векторов должен быть 3, то добавляем искусственные переменные, а в целевую функцию добавляем эти переменные, умноженные на −M, где M, очень большое число:
Матрица коэффициентов системы уравнений имеет вид:
Правая часть ограничений системы уравнений имеет вид:
Составляем симплексную таблицу. В столбец x0 записывается правая часть ограничений. С правой стороны записывается матрица коэффициентов A. Последние две строки − это целевая функция, умноженная на −1 и разделенная на две части. Последняя строка − строка с исскуственными переменными:
Базисные векторы x4, x5, x6, следовательно, все элементы в столбцах x4, x5, x6, ниже горизонтальной линии должны быть нулевыми.
Обнулим все элементы столбца x4, кроме ведущего элемента. Для этого сложим строку 4 со строкой 1, умноженной на -1. Обнулим все элементы столбца x5, кроме ведущего элемента. Для этого сложим строку 5 со строкой 2, умноженной на -1. Обнулим все элементы столбца x6, кроме ведущего элемента. Для этого сложим строку 5 со строкой 3, умноженной на -1.
Симплекс таблица примет вид:
Запишем текущий опорный план:
В строке 5 элементы, соответствующие переменным x1, x2, x3, x4, x5, x6 неотрицательны, а число находящийся в пересечении данной строки и столбца x0 отрицательнo. Тогда исходная задача не имеет опорного плана. Следовательно она неразрешима.
🎥 Видео
Система линейных уравнений. Метод обратной матрицы. Матричный метод.Скачать
Матричный метод решения систем уравненийСкачать
9. Метод обратной матрицы для решения систем линейных уравнений / матричный методСкачать
Метод Крамера за 3 минуты. Решение системы линейных уравнений - bezbotvyСкачать
12. Метод Гаусса решения систем линейных уравнений. Часть 1.Скачать
Решение системы уравнений методом обратной матрицы - bezbotvyСкачать
Математика Без Ху!ни. Система линейных уравнений. Метод Крамера.Скачать
Решение задачи линейного программирования при помощи надстройки Поиск решенияСкачать
15. Однородная система линейных уравнений / фундаментальная система решенийСкачать
Лекция 2 Симплекс-методСкачать
Решение системы линейных уравнений с двумя переменными способом подстановки. 6 класс.Скачать