Для связи в whatsapp +905441085890

Линейное программирование задачи с решением и примерами

Оглавление:

Линейное программирование задачи с решением

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

Если что-то непонятно — вы всегда можете написать мне в WhatsApp и я вам помогу!

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

Возможно эта страница вам будет полезна:

Предмет математическое программирование

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

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

Общая задача линейного программирования

Задача № 1

Фирма производит две модели Решение задач по линейному программированию и Решение задач по линейному программированию сборных книжных полок. Их производство ограничено наличием сырья (высококачественных досок) и временем машинной обработки. Для каждого изделия модели Решение задач по линейному программированию требуется Решение задач по линейному программированию досок, а для изделия модели Решение задач по линейному программированию. Фирма может получить от своих поставщиков до 1700 Решение задач по линейному программированию досок в неделю. Для каждого изделия модели Решение задач по линейному программированию требуется 12 мин машинного времени, а для изделия модели Решение задач по линейному программированию — 30 мин. В неделю можно использовать 160 ч машинного времени.

Сколько изделий каждой модели следует фирме выпускать в неделю, если каждое изделие модели Решение задач по линейному программированию приносит 2 дол. прибыли, а каждое изделие модели Решение задач по линейному программированию — 4 дол. прибыли?

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

Решение задач по линейному программированию

Фирма будет получать максимальную еженедельную прибыль, если максимизирует целевую функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

и никаким выбором Решение задач по линейному программированию и Решение задач по линейному программированию нельзя обратить эти производные в нуль. Действительно, чтобы увеличить функцию Решение задач по линейному программированию, надо увеличить Решение задач по линейному программированию и Решение задач по линейному программированию. Но (и в этом суть проблемы) значения Решение задач по линейному программированию и Решение задач по линейному программированию не могут быть увеличены неограниченно. Эти значения ограничены, в частности, лимитами на сырье и машинное время.

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Следовательно, задача состоит в том, чтобы найти значения Решение задач по линейному программированию и Решение задач по линейному программированию, удовлетворяющие условиям неотрицательности (1.2) и ограничениям типа неравенства (1.3) и максимизирующие функцию

Решение задач по линейному программированию

Это типичная двухмерная задача линейного программирования. Целевая функция, которая должна быть максимизирована, является линейной функцией своих переменных. Ограничения на эти переменные тоже линейны (они представлены на рис. 1.1). Условия неотрицательности позволяют ограничиться рассмотрением положительного квадранта. Границы определяются прямыми

Решение задач по линейному программированию

Стрелка на каждой границе рис 1.1 указывает, с какой стороны прямой выполняется ограничение. Заштрихованная область Решение задач по линейному программированию, содержащая точки, для которых соблюдены условия (1.2) и (1.3), называется допустимой. Точки внутри и на границе этой области изображают допустимые решения. Допустимых решений много. Задача состоит в том, чтобы найти решение (может ли их быть более одного?), максимизирующее функцию Решение задач по линейному программированию.

Штриховыми линиями на рис. 1.1 изображены прямые

Решение задач по линейному программированию
Решение задач по линейному программированию

обозначенные Решение задач по линейному программированию и Решение задач по линейному программированию соответственно. Эти прямые параллельны и представляют собой две линии уровня функции Решение задач по линейному программированию со значениями соответственно 0 и 800. Ясно, что значение функции Решение задач по линейному программированию возрастает по мере того, как линии уровня удаляются от начала координат в положительном квадранте. Действительно, вектор с компонентами Решение задач по линейному программированиюРешение задач по линейному программированию, т. е. вектор с компонентами Решение задач по линейному программированию указывает направление возрастания функции Решение задач по линейному программированию, перпендикулярен штриховым линиям и направлен в сторону, противоположную началу координат.

Линией уровня с наибольшим значением функции Решение задач по линейному программированию, имеющей хотя бы одну общую точку с допустимой областью, является прямая с, проходящая через вершину Решение задач по линейному программированию; на ней Решение задач по линейному программированию принимает значение 1400. Точка Решение задач по линейному программированию, в которой Решение задач по линейному программированию =300, Решение задач по линейному программированию = 200, соответствует оптимальному решению задачи. Эти значения могут быть получены как решения уравнений

Решение задач по линейному программированию
Решение задач по линейному программированию

Следовательно, максимальная прибыль составляет 2 X 300 + 4 X 200 = = 1400. При оптимальном решении оба ограничения превращаются в равенства, что означает полное использование сырья и машинного времени.

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

Общая задача линейного программирования состоит в максимизации (или минимизации) линейной функции

Решение задач по линейному программированию

от Решение задач по линейному программированию вещественных переменных Решение задач по линейному программированию, удовлетворяющих условиям неотрицательности

Решение задач по линейному программированию

и Решение задач по линейному программированию линейным ограничениям

Решение задач по линейному программированию

Среди ограничений могут одновременно встречаться знаки Решение задач по линейному программированию и Решение задач по линейному программированию. Задача состоит в максимизации (минимизации) целевой функции.

Значения Решение задач по линейному программированию предполагаются известными. Часто мы будем (как в примере 1) приводить их конкретную интерпретацию в практических задачах.

В матричных обозначениях задача может быть представлена следующим образом:

максимизировать (минимизировать) функцию

Решение задач по линейному программированию

Индекс 0 в векторе Решение задач по линейному программированию и в матрице Решение задач по линейному программированию указывает на то, что это начальные значения. Смысл этого станет ясен в разд. 1.3.

Возможно эта страница вам будет полезна:

Решение задач по математическому программированию

Графическое решение двухмерных задач

На примере, рассмотренном выше, мы показали, каким образом задачи линейного программирования возникают на практике, и продемонстрировали графический метод их решения. Рассмотрев еще несколько примеров такого рода, достаточно простых, чтобы было «видно, что происходит», мы сможем выявить несколько общих свойств задач линейного программирования, которые могут подсказать путь к их общему решению.

Задача № 2

Минимизировать функцию

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Решение задач по линейному программированию

Минимальное значение функции Решение задач по линейному программированию = — 68 и достигается в точке Решение задач по линейному программированию =(12, 8). Заметим, что, как и в примере разд. 1.1, минимум достигается в вершине допустимой области. Оптимальным решением задачи является точка

Решение задач по линейному программированию

минимальным значением функции Решение задач по линейному программированию = —68. Иногда задача имеет более чем одно оптимальное решение.

Задача № 3

Минимизировать функцию

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

На рис. 1.3 четырехугольник Решение задач по линейному программированию изображает допустимую область

Решение задач по линейному программированию

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

Решение задач по линейному программированию

достигаются оптимальные решения, соответствующие одному и тому же минимальному значению функции Решение задач по линейному программированию =-12.

Любая точка на отрезке Решение задач по линейному программированию представляется формулой

Решение задач по линейному программированию

где

Решение задач по линейному программированию

Для каждой такой точки значение функции Решение задач по линейному программированию равно

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Задача № 4

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

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

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

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

Задача № 5

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Ограничения задачи противоречивы, поэтому нет допустимых решений (рис. 1.5).

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

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

Решение задач по линейному программированию

Возможно эта страница вам будет полезна:

Примеры решения задач по математическому программированию

Стандартная форма задач линейного программирования

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

Привести задачу к стандартной форме очень просто, используя следующие правила:

а) Максимизация целевой функции

Решение задач по линейному программированию

равносильна минимизации целевой функции

Решение задач по линейному программированию

б) Ограничение в виде неравенств, например

Решение задач по линейному программированию

может быть приведено к стандартной форме

Решение задач по линейному программированию

где новая переменная Решение задач по линейному программированию неотрицательна.

Ограничение

Решение задач по линейному программированию

может быть приведено к стандартной форме

Решение задач по линейному программированию

где новая переменная Решение задач по линейному программированию неотрицательна.

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

Решение задач по линейному программированию

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

Аналогично соотношениям (1.7), (1.8), (1.9) выразим наиболее общую задачу линейного программирования в следующем виде:

минимизировать функцию

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Так, пример 1 разд 1.2 может быть приведен минимизировать функцию Решение задач по линейному программированию при ограничениях

Решение задач по линейному программированию
Решение задач по линейному программированию

Пример 1 разд 1.1 может быть приведен к следующему виду: минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

В матричной форме ограничения можно записать таким образом

Решение задач по линейному программированию

Они состоят из двух уравнений с четырьмя неизвестными.

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

Конечно, имея два уравнения с четырьмя неизвестными, можно получить решение (хотя не всегда допустимое), придавая двум неизвестным произвольные значения и разрешая уравнения относительно двух других неизвестных. Особенно интересны решения такого типа, когда два неизвестных приравниваются нулю. Если такое решение единственно, то оно называется базисным решением. Если оно к тому же допустимо, то называется базисным допустимым решением. Для общей задачи линейного программирования с Решение задач по линейному программированию переменными, подчиненными Решение задач по линейному программированию ограничениям Решение задач по линейному программированию, базисные решения ограничений могут быть получены, если приравнять нулю Решение задач по линейному программированию из переменных и решить Решение задач по линейному программированию уравнений относительно оставшихся Решение задач по линейному программированию переменных; предполагается, что эти уравнения имеют единственное решение. Переменные, приравненные нулю, называются небазисными переменными. Остальные называются базисными и образуют базис.

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

Решение задач по линейному программированию
Решение задач по линейному программированию

Из этих шести базисных решений только четыре допустимы и соответствуют вершинам допустимой области рис. 1.1 (см. приведенную таблицу).

В трехмерном случае линейные ограничения являются плоскостями,

Решение задач по линейному программированию

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

Мы увидим, что этот результат закономерен. Базисные решения системы Решение задач по линейному программированию уравнений с Решение задач по линейному программированию неизвестными соответствуют вершинам допустимой области; оптимальное решение (если оно существует) соответствует базисному допустимому решению и, следовательно, является вершиной допустимой области.

Возможно эта страница вам будет полезна:

Заказать работу по математическому программированию

Обобщение на случай n переменных

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

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

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

где

Решение задач по линейному программированию

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

Возможно эта страница вам будет полезна:

Помощь по математическому программированию

Основные результаты линейного программирования

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

минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

Ограничения можно задать в виде Решение задач по линейному программированию где матрица Решение задач по линейному программированию имеет ранг Решение задач по линейному программированию.

Теперь докажем следующие основные утверждения линейного программирования.

Утверждение 1. Если ограничения имеют допустимое решение, то они имеют и базисное решение.

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

Решение задач по линейному программированию

а Решение задач по линейному программированию — столбцы матрицы Решение задач по линейному программированию.

Если Решение задач по линейному программированию — линейно независимы, то Решение задач по линейному программированию — ранг матрицы Решение задач по линейному программированию и решение является базисным допустимым решением (Решение задач по линейному программированию базисных переменных равны 0).

Если

Решение задач по линейному программированию

линейно зависимы, то

Решение задач по линейному программированию

где не все Решение задач по линейному программированию равны 0 или отрицательны (при необходимости это неравенство может быть умножено на —1). Пусть

Решение задач по линейному программированию
Решение задач по линейному программированию

тогда

Решение задач по линейному программированию

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

Решение задач по линейному программированию

то значения

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

Следовательно,

Решение задач по линейному программированию

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

Утверждение 3. Базисные допустимые решения соответствуют вершинам выпуклого множества

Пусть

Решение задач по линейному программированию

базисное допустимое решение.

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

Если Решение задач по линейному программированию — не вершина, то можно найти две другие точки Решение задач по линейному программированию и Решение задач по линейному программированию, такие, что

Решение задач по линейному программированию

для некоторого Решение задач по линейному программированию, причем 0 < Решение задач по линейному программированию < 1 и выполнены условия

Решение задач по линейному программированию

Таким образом, для последних Решение задач по линейному программированию координат имеем

Решение задач по линейному программированию

Но поскольку

Решение задач по линейному программированию

система равенств

Решение задач по линейному программированию

имеет решение только в случае

Решение задач по линейному программированию

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

Решение задач по линейному программированию

что противоречит выбору Решение задач по линейному программированию. Поэтому каждое базисное допустимое решение — вершина.

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

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

Решение задач по линейному программированию

положительны. Пусть

Решение задач по линейному программированию

соответствующие столбцы матрицы Решение задач по линейному программированию; предположим, что они линейно зависимы.

Как и при доказательстве утверждения 1, найдем такие Решение задач по линейному программированию не все равные 0, что

Решение задач по линейному программированию

Легко видеть, что если

Решение задач по линейному программированию

то векторы

Решение задач по линейному программированию

удовлетворяют условию

Решение задач по линейному программированию

Поскольку

Решение задач по линейному программированию

то

Решение задач по линейному программированию

Аналогично

Решение задач по линейному программированию

Таким образом, Решение задач по линейному программированию — допустимые решения и

Решение задач по линейному программированию

Следовательно, Решение задач по линейному программированию — не вершина, а это противоречит выбору Решение задач по линейному программированию, значит, Решение задач по линейному программированию не превосходит Решение задач по линейному программированию.

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

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

Решение задач по линейному программированию

Если

Решение задач по линейному программированию

Для любой другой точки в допустимой области

Решение задач по линейному программированию

значение функции Решение задач по линейному программированию в этой точке

Решение задач по линейному программированию

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

Решение задач по линейному программированию

и минимизирующих функцию Решение задач по линейному программированию.

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Итак, минимум функции Решение задач по линейному программированию достигается в вершине Решение задач по линейному программированию.

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

Возможно эта страница вам будет полезна:

Задачи математического программирования

Симплекс-метод при заданном начальном допустимом базисном решении

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

минимизировать

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

Если умножить ограничения системы (2.4) на Решение задач по линейному программированию, то Решение задач по линейному программированию исключатся из Решение задач по линейному программированию и мы получим

Решение задач по линейному программированию

где

Решение задач по линейному программированию

Разумеется, уравнения (2.4) и (2.3) выражают одинаковые ограничения, а уравнения (2.5) и (2.1) представляют одну и ту же целевую функцию, хотя и в разных алгебраических формах. Уравнения (2.4) и (2.5) являются канонической формой для базиса Решение задач по линейному программированию.

Если положить

Решение задач по линейному программированию

равными 0, то соотношения

Решение задач по линейному программированию

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

Отметим, что если матрица Решение задач по линейному программированию может быть разбита следующим образом:

Решение задач по линейному программированию

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

Для системы уравнений (2.3) из соотношения

Решение задач по линейному программированию

следует соотношение

Решение задач по линейному программированию

т. е.

Решение задач по линейному программированию

(это — уравнение (2.4)),

так что

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Имеем также

Решение задач по линейному программированию

где Решение задач по линейному программированию — вектор-строка коэффициент базисных переменных в исходном виде для функции Решение задач по линейному программированию (см. уравнение (2.1)).

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

Задача № 6

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Решение задач по линейному программированию

Поскольку в этом случае коэффициенты Решение задач по линейному программированию положительны, а новые переменные имеют коэффициент +1, ясно, что набор Решение задач по линейному программированию, Решение задач по линейному программированию = 1700, Решение задач по линейному программированию = 1600 образует базисное фундаментальное решение, а уравнения (2.11) имеют соответствующий вид.

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

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

Поскольку

Решение задач по линейному программированию

обращается в 0 при Решение задач по линейному программированию = 1700/4 = =425.

Поскольку

Решение задач по линейному программированию

обращается в 0 при Решение задач по линейному программированию = 1600/5 = 320.

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

Второе ограничение может быть записано в виде

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Небазисными переменными стали переменные Решение задач по линейному программированию и Решение задач по линейному программированию. В данный момент они равны 0. Теперь можно уменьшить значение функции Решение задач по линейному программированию, увеличив только Решение задач по линейному программированию. Но на сколько можно увеличить Решение задач по линейному программированию чтобы Решение задач по линейному программированию и Решение задач по линейному программированию оставались неотрицательными?

Для уравнения

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Для уравнения

Решение задач по линейному программированию

обращается в 0 при

Решение задач по линейному программированию

Таким образом нельзя увеличивать Решение задач по линейному программированию более чем до 300 (минимального из этих значений). После деления на 7/5 (коэффициент при Решение задач по линейному программированию) первое ограничение принимает вид

Решение задач по линейному программированию

Исключим Решение задач по линейному программированию из другого ограничения и выражения для целевой функции, вычтя последнее соотношение, умноженное на 2/5 и -2/5, из ограничения и целевой функции. Получим каноническую форму задачи в базисе Решение задач по линейному программированию, тоже являющимся допустимым. Она имеет следующий вид:

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Если вернуться к геометрической интерпретации на рис. 1.1, то можно убедиться, что последовательность канонических форм привела из точки 0 в точку Решение задач по линейному программированию и из точки Решение задач по линейному программированию в точку Решение задач по линейному программированию — точку минимума. Читателю рекомендуется проверить, что при выборе в уравнениях (2.11) увеличения Решение задач по линейному программированию та же процедура привела бы из точки 0 в точку Решение задач по линейному программированию через точку Решение задач по линейному программированию.

Этот итерационный процесс удобно проиллюстрировать в так называемых симплекс-таблицах. Они состоят из уравнений (2.11) — (2.13) для ограничений и целевой функции, записанных в виде

Решение задач по линейному программированию

Ниже приведены три таблицы.

Решение задач по линейному программированию

На итерации 0 звездочкой отмечено значение 5 — коэффициент при переменной, которую мы собираемся обратить в базисную в предельном ограничении. На итерации 1 отмечено число 7/5. Заметим также, что мы ставим точки вместо переменных, обязанных иметь нулевые значения, чтобы отличить их от переменных, обращающихся в 0 случайно.

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

Решение задач по линейному программированию

Итерационный процесс состоит из трех шагов.

1 .Найти переменную для включения в базис.

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

  • Найти переменную для исключения из базиса.

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

Решение задач по линейному программированию

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

  • Построить новую каноническую форму.

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

Затем удалим xs из других ограничений целевой функции. Для этого из Решение задач по линейному программированию-й строки Решение задач по линейному программированию c Решение задач по линейному программированию коэффициентом Решение задач по линейному программированию при Решение задач по линейному программированию вычтем Решение задач по линейному программированию X (новая ведущая строка). Чтобы преобразовать целевую функцию с коэффициентом Решение задач по линейному программированию (< 0) при Решение задач по линейному программированию, вычтем Решение задач по линейному программированию X (новая ведущая строка) из строки, соответствующей целевой функции.

На очередной итерации каноническая форма будет выглядеть следующим образом:

Решение задач по линейному программированию

где

Решение задач по линейному программированию

Формулы (2.15) — (2.20) запоминать не надо; они приведены здесь для дальнейших ссылок. Вычисления удобнее выполнять в соответствии с шагом 3.

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

Задача № 7

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Это — пример 2 разд.1.2, представленный в стандартной форме.

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

На итерации 1 коэффициенты при небазисных переменных неотрицательны. Сравнение с рис. 1.3 показывает, что мы передвинулись из точки 0 в точку Решение задач по линейному программированию. Оптимум найден в точке Решение задач по линейному программированию, в которой

Решение задач по линейному программированию
Решение задач по линейному программированию

с минимальным значением функции Решение задач по линейному программированию, равным —12.

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Задача № 8

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Ясно, что точка

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Эта задача — пример 3 разд. 1.2. Приведем первую таблицу, соответствующую точке Решение задач по линейному программированию на рис. 1.4:

Решение задач по линейному программированию

Здесь приведена также вторая таблица, вычисленная обычным образом. Она соответствует точке В на рис. 1.4. Функция z может быть еще уменьшена увеличением Решение задач по линейному программированию. Но здесь возникает определенная трудность. В столбце, соответствующем Решение задач по линейному программированию, в ограничениях нет строго положительных коэффициентов. Таким образом, сколько не увеличивай Решение задач по линейному программированию, базисная переменная никогда не обратится в 0. Действительно, Решение задач по линейному программированию будет увеличиваться, а Решение задач по линейному программированию — оставаться неизменным. Это случай неограниченного решения (см. рис. 1.4). В симплекс-метоце неограниченность решения выражается в том, что все коэффициенты Решение задач по линейному программированию < 0.

Возможно эта страница вам будет полезна:

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

Реализация симплекс-метода на эвм

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

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

Итерационная процедура состоит в основном из трех шагов. Сначала находим

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

Конечно, этот результат совпадает с выражением (2.14). В конце концов приходим к следующей канонической форме в соответствии с уравнениями (2.15) — (2.20).

Текст программы соответствует блок-схеме, приведенной на рис. 2.1; в программе используются те же обозначения, что и в тексте. Значения переменных и целевой функции Решение задач по линейному программированию запоминаются в нулевом столбце матрицы Решение задач по линейному программированию. Последняя строка этой матрицы используется для коэффициентов целевой функции. Данные в строках 4000 — 4030 соответствуют данным примера 1 разд. 2.1.

Решение задач по линейному программированию
Решение задач по линейному программированию
Решение задач по линейному программированию

Полезно сделать следующие замечания по поводу этой программы. Минимум Решение задач по линейному программированию определяется в строках от 500 до 550 в предположении, что они существуют. Положив сначала переменную Решение задач по линейному программированию, можно избежать поиска ложного отрицательного значения. Следует помнить, что ЭВМ выполняет действия с конечной точностью. Симплекс-метод иногда требует длинных и скрупулезных вычислений, в процессе которых ошибки могут накапливаться; в частности, величины, которые должны быть нулевыми, могут принимать значения, скажем, —1,23947 X Решение задач по линейному программированию. Мы хотим избежать таких ошибочных отрицательных значений.

Аналогичные предосторожности следует принять в процедуре нахождения строки переменных для исключения из базиса (строки 750—880). Проверяем, что коэффициенты Решение задач по линейному программированию положительны. Отметим, что в рассматриваемой процедуре (где ищется минимальное значение Решение задач по линейному программированию) это означает, что не придется делить на 0 — это вызвало бы ошибку в процессе выполнения программы.

Промежуточные таблицы могут быть распечатаны в строках 300, 310, 1200, 1210, 1810, 2100. Некоторые из них (в строке 1210) могут быть выброшены. Первый фрагмент распечатки служит для проверки того, что данные правильны. Печать в строке программы 910 определяет позицию ведущего элемента, ведущей строки и ведущего столбца.

В процедуре, начинающейся со строки 3000, производится распечатка таблицы. Хотя выводимая информация и форматирована, ясно, что для больших значений п выдача на экран и на АЦПУ приведет к переполнению количества допустимых колонок печати, так что необходимы будут некоторые модификации. Однако если ограничиться иллюстративными задачами с небольшим (до 10) количеством переменных, то осложнений не будет.

Процедура, начинающаяся со строки 9000, является форматирующей. Ее значение объясняется в приложении. Форматирующие значения РВ = 144 в строке 2020 и РВ = 122 в строке 3030, конечно, могут меняться в зависимости от значений, рассматриваемых величин и от требований точности при выводе.

Приведенный образец распечатки относится к примеру 1 разд. 2.1; данные в распечатке верные. Ясно, что воспроизведена симплексная таблица этого решения.

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

Решение задач по линейному программированию

Порождение начального базисного допустимого решения

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

Пусть требуется решить следующую задачу.

Задача № 9

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Это — пример 1 из разд.1.2; он решается графически без всяких затруднений. В стандартной форме с неотрицательными дополнительными переменными ограничениями принимают вид

Решение задач по линейному программированию

Однако при попытке применить симплекс-метод возникает определенная трудность. Дело в том, что нет очевидного базисного допустимого решения. Базисное решение, получаемое приравниванием дополнительных переменных значениям в правых частях, недопустимо. Этим решением является точка

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

и для них базисное решение очевидно. Это решение Решение задач по линейному программированию0 (небазисные переменные),

Решение задач по линейному программированию

Затем симплекс-метод используется для минимизации функции

Решение задач по линейному программированию

функция Решение задач по линейному программированию называется искусственной целевой функцией. Этап I задачи состоит в минимизации функции Решение задач по линейному программированию.

Предположим, что ограничения (2.22) имеют допустимое решение и, следовательно, базисное допустимое решение (это не всегда так) ; тогда решение этапа I задачи закончится тем, что функция Решение задач по линейному программированию обратится в О и при этом Решение задач по линейному программированию и Решение задач по линейному программированию тоже будут нулевыми. Но когда Решение задач по линейному программированию и Решение задач по линейному программированию равны нулю, измененные ограничения (2.23) равносильны исходным (2.22). Базисное допустимое решение, минимизирующее функцию Решение задач по линейному программированию, может быть использовано как начальное базисное допустимое решение для минимизации функции Решение задач по линейному программированию на этапе II задачи. Начиная с этого момента нулевые значения Решение задач по линейному программированию и Решение задач по линейному программированию игнорируются.

Разумеется, для минимизации функции w надо выразить ее в подходящем виде, т. е. через небазисные переменные. Переменные Решение задач по линейному программированию и Решение задач по линейному программированию являются, конечно, базисными в первом решении уравнений (2.23). Из функции нелегко исключить Решение задач по линейному программированию и Решение задач по линейному программированию. Надо просто вычесть из выражения для функции Решение задач по линейному программированию содержащие их строки. Эта идея применяется и в других задачах. Таким образом, получаем

Решение задач по линейному программированию

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

Решение задач по линейному программированию

На этой стадии минимизирована функция и>, переменные Решение задач по линейному программированию и Решение задач по линейному программированию небазисные и потому равны 0. Заметим, что можно было бы пренебречь Решение задач по линейному программированию еще на итерации 1 и уж точно с настоящего момента можно пренебречь и Решение задач по линейному программированию, и Решение задач по линейному программированию. Переменная Решение задач по линейному программированию сохранена просто для того, чтобы показать, что в оптимальное решение для функции Решение задач по линейному программированию и Решение задач по линейному программированию, и Решение задач по линейному программированию входят с коэффициентом 1, когда значение функции Решение задач по линейному программированию равно 0 Решение задач по линейному программированию. Поскольку выражение для функции Решение задач по линейному программированию, приведенной к данному базису, сохраняется, можно минимизировать функцию Решение задач по линейному программированию по-настоящему. Сейчас мы находимся в точке Решение задач по линейному программированию (рис. 1.2). Этап I задачи завершен, и конечная таблица без последних двух столбцов и без последней строки является входной для этапа II. Таблицы этапа II имеют следующий вид:

Решение задач по линейному программированию

Последовательные таблицы 2, 3, 4 соответствуют точкам

Решение задач по линейному программированию

(рис. 1.2). Последняя таблица оптимальна, так что минимум функции Решение задач по линейному программированию равен —68 при

Решение задач по линейному программированию

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

Задача № 10

Минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Приведем ограничения к стандартной форме

Решение задач по линейному программированию

Изменим первое ограничение, введя искусственную переменную Решение задач по линейному программированию5 минимизировав функцию Решение задач по линейному программированию. В канонической форме получим

Решение задач по линейному программированию

Симплекс-таблицы выглядят следующим образом:

Решение задач по линейному программированию

На этой стадии функция Решение задач по линейному программированию минимизирована. Все коэффициенты в строке Решение задач по линейному программированию таблицы положительны. Но функция w не обратилась в 0, а Решение задач по линейному программированию = 5. Мы не можем найти допустимое решение неизмененных ограничений (2.26), что иллюстрирует и рис. 1.5. Этап I задачи завершен, но мы не можем перейти к этапу II, поскольку исходные ограничения не имеют допустимого базисного решения.

Задача № 11

Фирме требуется уголь с содержанием фосфора не более 0,03 % и с примесью пепла не более 3,25 %. Доступны три сорта угля Решение задач по линейному программированию по следующим ценам (за 1 т) :

Решение задач по линейному программированию

Как их следует смешать, чтобы удовлетворить ограничениям на примеси и минимизировать цену? (Это — упр. 8 разд.1.6, в котором рекомендовалось свести эту задачу к двухмерной.) Используя симплекс-метод, можно решать эту задачу в той форме, в которой она поставлена.

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

Тогда

Решение задач по линейному программированию

При этом должны выполняться следующие ограничения:

Решение задач по линейному программированию

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

Если добавить дополнительные переменные ко второму и третьему ограничению (предварительно умножив последнее на 100), получим задачу в стандартной форме.

Для неотрицательных

Решение задач по линейному программированию

минимизировать

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

при этом допустимые базисные решения являются

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Решение задач по линейному программированию

Последовательные вычисления таблиц приведены ниже:

Решение задач по линейному программированию
Решение задач по линейному программированию

Этап I задачи заканчивается после итерации 1; затем значения Решение задач по линейному программированию и Решение задач по линейному программированию игнорируются. Минимальное значение функции Решение задач по линейному программированию равно Решение задач по линейному программированию дол.; оно достигается при

Решение задач по линейному программированию

Возможно эта страница вам будет полезна:

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

Полное изложение симплекс-метода

Как было показано, ограничения в задачах линейного программирования могут быть заданы в разных видах. Базисное допустимое решение не всегда очевидно. Таким образом, в программе для ЭВМ должны вводиться автоматически дополнительные и искусственные переменные и должно порождаться первое базисное допустимое решение.

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

минимизировать

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

с коэффициентом +1. Искусственные переменные

Решение задач по линейному программированию
Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

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

Итак, для этой задачи, в которой все переменные неотрицательны, a

Решение задач по линейному программированию

имеем следующие ограничения:

Решение задач по линейному программированию

и функцию

Решение задач по линейному программированию

которую необходимо минимизировать. Заполним первую таблицу.

Решение задач по линейному программированию

Для вычислений можно использовать предыдущую программу (строки с 500-й по 1180-ую). Необходимо знать,на каком этапе задачи (I или II) в настоящий момент производятся вычисления. На этапе I Решение задач по линейному программированию = 1 (в программе); целевая функция Решение задач по линейному программированию хранится в строке Решение задач по линейному программированию, а с выражением для функции Решение задач по линейному программированию следует обращаться так же, как со всеми остальными ограничениями. На этапе II полагаем Решение задач по линейному программированию = 0; целевая функция z хранится в строке Решение задач по линейному программированию, а столбцы с искусственными переменными игнорируются. Когда в конце этапа I задачи минимизирована функция Решение задач по линейному программированию; необходимо проверить, достигло ли ее значение 0 с точностью до ошибок округления, и приравнять Решение задач по линейному программированию 0, прежде чем переходить к этапу II задачи. Ниже приведена распечатка текста программы.

Решение задач по линейному программированию
Решение задач по линейному программированию
Решение задач по линейному программированию

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

Фактически вычисления симплекс-методом этапов I и II задачи следуют приведенной выше программе, которую теперь можно заменить на более проработанную версию. Когда все коэффициенты целевой функции положительны, следует позаботиться о том, чтобы программа не закончила работу, если вычисления осуществляются на этапе I. В этом случае переходим к этапу II, просто заменив Решение задач по линейному программированию с 1 на 0, что изменит Решение задач по линейному программированию в строке 500 с

Решение задач по линейному программированию

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

В конечной распечатке результатов (строки с 2000-й по 2300-ю) выводятся значения базисных переменных и признаки того, удовлетворяются ли ограничения как строгие неравенства или (связывающие) равенства. Это может быть полезно с точки зрения практической интерпретации, так как позволяет судить о том, какие из ресурсов исчерпаны. Снова используется форматирующая процедура 9000 (см. приложение). Форматные переменные в строках 2020 — 3030 могут быть изменены. При работе с большим количеством переменных оператор печати в строке 3000 следует изменить. Ее, конечно, можно подавить, скажем присвоив значение —1 первой величине Решение задач по линейному программированию из области данных.

Задача № 12

Найти такие неотрицательные

Решение задач по линейному программированию

что

Решение задач по линейному программированию

и минимизировать функцию

Решение задач по линейному программированию

В этом примере

Решение задач по линейному программированию

Соответствующие данные содержатся в строках 4000—4030. В распечатке приводятся вычисленные ранее таблицы:

Решение задач по линейному программированию
Решение задач по линейному программированию

Проблемы вырождения

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

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

Решение задач по линейному программированию

Следовательно, Решение задач по линейному программированию войдет в базис со значением 0 и новый базис тоже будет вырожден. Значение функции Решение задач по линейному программированию останется без изменений. Таким образом, если на следующем шаге итерации можно было бы обратно заменить на Решение задач по линейному программированию, то образовался бы замкнутый цикл и дальнейшей итерации не приводили бы к уменьшению функции Решение задач по линейному программированию.

Задача № 13

Найти

такие неотрицательные Решение задач по линейному программированию что

Решение задач по линейному программированию

и минимизировать функцию

Решение задач по линейному программированию
Решение задач по линейному программированию

Графическое решение (рис. 2.2) показывает, что точка минимума —это точка (3,2), где Решение задач по линейному программированию = —7. Вырожденность возникает, поскольку прямые соответствующие ограничениям, пересекаются в одной точке (2, 0). Обычно вершина является пересечением всего двух прямых (в двухмерном случае). В данном примере в вершине пересекаются три прямые.

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

Решение задач по линейному программированию

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

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

Решение задач по линейному программированию

Итак, минимум функции Решение задач по линейному программированию равен -7 и достигается при

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

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

Если вырожденности нет, то симплекс-методом задача линейного программирования решается за конечное число шагов (разумеется, в предположении, что решение существует).

Решение задач по линейному программированию

Это можно легко показать. На любой итерации, как видно из уравнения (2.20), значение целевой функции меняется от Решение задач по линейному программированию, скажем, на Решение задач по линейному программированию, где Решение задач по линейному программированию -коэффициент при переменной, которая только что была включена в базис, соответствующий предыдущей целевой функции; Решение задач по линейному программированию — значение, которое она принимает Далее коэффициент Решение задач по линейному программированию строго отрицателен, а значение Решение задач по линейному программированию положительно. Таким образом, функция Решение задач по линейному программированию убывает на каждом шаге. Поэтому никогда не происходит возвращения к предыдущему множеству базисных переменных (иначе целевая функция приняла бы то же значение, что и раньше). Поскольку имеется не более Решение задач по линейному программированию допустимых решений, минимум будет найден нe более чем за Решение задач по линейному программированию итераций.

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

Задача № 14

Этот пример иллюстрирует зацикливание. Он был построен И. М. Л. Билом.

Найти такие неотрицательные

Решение задач по линейному программированию

что

Решение задач по линейному программированию

и минимизировать функцию

Решение задач по линейному программированию

При решении этой задачи на ЭВМ случайно произошло зацикливание. Это свидетельствует о том, что для создания достаточно мощной программы необходимы некоторые изменения. На итерации производится выбор переменной для превращения ее в небазисную переменную (это может быть Решение задач по линейному программированию или Решение задач по линейному программированию). Была выбрана переменная Решение задач по линейному программированию. На итерации 2 была выбрана переменная Решение задач по линейному программированию, а не Решение задач по линейному программированию. На итерации 4 была выбрана переменная Решение задач по линейному программированию, а не Решение задач по линейному программированию. Таблица на итерации 6 совпадает с начальной таблицей. ЭВМ будет продолжать вычисления, не уменьшая значения Функции Решение задач по линейному программированию. При вычислении вручную можно выбрать другие переменные. Читателю предлагается сделать это.

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

Решение задач по линейному программированию

Минимум для функции Решение задач по линейному программированию достигается при

Решение задач по линейному программированию

стальных

Решение задач по линейному программированию

Минимальное значение функции

Решение задач по линейному программированию
Решение задач по линейному программированию
Решение задач по линейному программированию

Возможно эта страница вам будет полезна:

Графическое решение задач линейного программирования

Анализ устойчивости решения. Обращение базиса и симплекс-множители

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

на матрицу Решение задач по линейному программированию. Тогда получим соотношение

Решение задач по линейному программированию

что соответствует канонической форме для ограничений.

Симплекс-метод не состоит в непосредственном вычислении обратной матрицы. Этот метод — итеративный; по существу, он обращает базис, и это обращение может быть найдено из таблиц вычислений симплекс-методом.

Если Решение задач по линейному программированию — столбец из коэффициентов при переменной Решение задач по линейному программированию в первом ограничении в форме неравенства, то

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

Решение задач по линейному программированию

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

В качестве иллюстрации рассмотрим первую и последнюю таблицы примера 1 разд.2.1.

Решение задач по линейному программированию

Это — первая таблица.

Решение задач по линейному программированию

А это — конечная оптимальная таблица.

Оптимальный базис — Решение задач по линейному программированию. Матрица коэффициентов этого базиса для ограничений на итерации 0 имеет вид

Решение задач по линейному программированию

В первой канонической форме матрицы коэффициентов при Решение задач по линейному программированию

Решение задач по линейному программированию

В конечной таблице она принимает

Решение задач по линейному программированию

и легко проверить, что эта матрица — действительно матрица Решение задач по линейному программированию.

Таким же образом рассмотрим первую и последнюю таблицы примера 1 разд.2.3. Дополнительным переменным

Решение задач по линейному программированию

соответствует Матрица из коэффициентов первой таблицы, т. е.

Решение задач по линейному программированию

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

Решение задач по линейному программированию

В окончательной таблице дополнительным переменным

Решение задач по линейному программированию

соответствует матрица

Решение задач по линейному программированию

поэтому (обратите внимание на изменение в первых двух столбцах) матрица Решение задач по линейному программированию представляет собой матрицу

Решение задач по линейному программированию

что легко проверяется.

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

Решение задач по линейному программированию

что также можно проверить.

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

минимизировать функцию

Решение задач по линейному программированию

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

Решение задач по линейному программированию

Можно умножить ограничения на Решение задач по линейному программированию прибавить к выражению для функции Решение задач по линейному программированию и получить соотношение

Решение задач по линейному программированию

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

Решение задач по линейному программированию
Решение задач по линейному программированию

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

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

Рассмотрим снова таблицу примера 1 разд.2.1. Коэффициенты при Решение задач по линейному программированию и Решение задач по линейному программированию в оптимальном виде для функции Решение задач по линейному программированию равны соответственно 2/7 и 4/7; это и есть симплекс-множители для оптимального базиса.

Ограничения и целевая функция имеют следующий исходный вид:

Решение задач по линейному программированию

Умножим ограничения (как показано выше) на Решение задач по линейному программированию и Решение задач по линейному программированию и прибавив их к функции Решение задач по линейному программированию

Решение задач по линейному программированию
Решение задач по линейному программированию

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

Далее из уравнения (3.7) для функции Решение задач по линейному программированию в окончательном виде ясно, 410 коэффициенты при базисных переменных будут нулевыми благодаря выбору Решение задач по линейному программированию а коэффициенты при небазисных переменных будут положительны. При этом (так как небазисные элементы равны 0) каждое слагаемое в левой части уравнения (3.7) равно 0; либо переменная, либо коэффициент при ней равны 0. Следовательно, оптимальное значение для функции Решение задач по линейному программированию определяется формулой

Решение задач по линейному программированию

Для только что рассмотренного примера это очевидно (см. уравнение (3.10)).

Для примера 2 разд 2.3 коэффициенты при

Решение задач по линейному программированию

в конечной таблице равны (0, 0, 16/5, 1/5), а симплекс-множители равны (-0, -0, 16/5, 1/5) (заметим, что в первых двух случаях поменялся знак; в рассматриваемом случае это не имеет значения).

Проверьте, что умножение ограничений в виде равенств (2.22) на (0, 0, 16/5, 1/5) с последующим прибавлением к выражению для функции Решение задач по линейному программированию, как указано в (2.22), действительно приводит к канонической форме для функции Решение задач по линейному программированию и что -(-О X 10 + -0 X 5 + 16/5 X 20 + 1/5 X 20) = = -68.

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

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

Возможно эта страница вам будет полезна:

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

Что получается при изменении задачи

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

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

Давайте последовательно рассмотрим:

1) изменения в Решение задач по линейному программированию (значения правых частей);

2) изменения в Решение задач по линейному программированию (коэффициенты целевой функции);

3) включение дополнительных переменных;

4) включение дополнительных ограничений. 1) Изменения в Решение задач по линейному программированию

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

Решение задач по линейному программированию

с той же целевой функцией Решение задач по линейному программированию.

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

Решение задач по линейному программированию

Из уравнения (3.7) значение целевой функции выражается следующим образом:

Решение задач по линейному программированию

причем все

Решение задач по линейному программированию

(коэффициенты при базисных переменных равны 0, при небазисных переменных Решение задач по линейному программированию 0).

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

Решение задач по линейному программированию

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

Линейное программирование задачи с решением

Таким образом из уравнения (3.13) можно получить

Линейное программирование задачи с решением

где Линейное программирование задачи с решением рассматривается как функция от Линейное программирование задачи с решением. Разумеется, если сильно изменить Линейное программирование задачи с решением то точка Линейное программирование задачи с решением, определяемая уравнением (3.15), будет неоптимальна и задачу придется решать сначала.

Задача № 15

Рассмотрим еще раз пример 1 разд. 1.1. (Для удобства повторим задачу.)

Фирма производит две модели Линейное программирование задачи с решением и Линейное программирование задачи с решением сборных книжных полок. Их производство ограничено наличием сырья высококачественных досок и временем машинной обработки. Для каждого изделия модели Линейное программирование задачи с решением требуется 3 Линейное программирование задачи с решением досок, а для изделия модели Линейное программирование задачи с решением. Фирма может получить от своих поставщиков до 1700 Линейное программирование задачи с решением досок в неделю. На каждое изделие модели Линейное программирование задачи с решением требуется 12 мин машинного времени, а на изделие модели Линейное программирование задачи с решением — 30 мин. В неделю можно использовать 160 ч машинного времени. Если каждое изделие модели Линейное программирование задачи с решением приносит 2 дол. прибыли, а изделие модели Линейное программирование задачи с решением — 4 дол. прибыли, сколько изделий каждой модели фирме необходимо выпускать в неделю?

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

Линейное программирование задачи с решением

при которых минимизируется функция

Линейное программирование задачи с решением

(прибыль, взятая с обратным знаком).

Первая и последняя (оптимальная) таблицы имеют соответственно следующий вид:

Линейное программирование задачи с решением

Обращенный базис имеет вид

Линейное программирование задачи с решением

симплекс-множители равны 2/7, 4/7.

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

Допустим, что в первом ограничении 1700 было заменено на 1701. Вектор Линейное программирование задачи с решением заменяется на новый вектор

Линейное программирование задачи с решением

Новыми значениями базисных переменных будут

Линейное программирование задачи с решением

что допустимо.

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

Линейное программирование задачи с решением

Таким образом, прибыль возрастает на 2/7 дол., и это — максимальная цена, которую следует заплатить за дополнительный 1 Линейное программирование задачи с решением доски. Нет смысла приобретать дополнительное сырье. Максимальная цена равна Линейное программирование задачи с решением

2. Предположим, что имеется возможность получения дополнительного машинного времени. Выгодно ли это, если 1 ч машинного времени стоит 7 дол.?

В этом случае в математической задаче вектор Линейное программирование задачи с решением заменяется на вектор Линейное программирование задачи с решением. Новыми значениями базисных переменных будут

Линейное программирование задачи с решением

что недопустимо.

Оптимальное значение для функции Линейное программирование задачи с решением заменяется на значение —Линейное программирование задачи с решениемЛинейное программирование задачи с решением

Прибыль увеличивается на 40/7 дол. Поскольку дополнительный 1 ч машинного времени стоит 7 дол., это невыгодно.

Легко видеть, что решение этой задачи с начала приведет к тем же результатам. Но нет никакой необходимости начинать с начала. В больших по объему задачах это неэффективно.

Заметьте, что в пункте Линейное программирование задачи с решением новое значение для функции z равно —2(300 + + 5/7) — 4(200 — 2/7), а в пункте Линейное программирование задачи с решением — равно -2(300 — 40/7) — 4(200 + + 30/7).

2) Изменения в Линейное программирование задачи с решением

Задача № 16

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

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

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

Линейное программирование задачи с решением

Чтобы записать функцию Линейное программирование задачи с решением в канонической форме, следует исключить Линейное программирование задачи с решением и Линейное программирование задачи с решением из выражения для функции Линейное программирование задачи с решением. Это можно сделать, умножив первое ограничение (в конечной таблице) на Линейное программирование задачи с решением, второе — на Линейное программирование задачи с решением и прибавив их к выражению для функции Линейное программирование задачи с решением; в результате получим

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Это видно из рис. 1.1, где точка Линейное программирование задачи с решением — оптимальная, если предположить, что линия уровня функции Линейное программирование задачи с решением, проходящая через точку Линейное программирование задачи с решением, лежит между двумя линиями ограничений, пересекающимися в точке Линейное программирование задачи с решением.

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

3) Включение дополнительных переменных

Задача № 17

Пусть оказалось возможным изготовить полки типа Линейное программирование задачи с решением и пусть для изготовления одной полки этого типа необходимо 4 Линейное программирование задачи с решением материала и требуется 20 мин машинного времени. Если прибыль от одного изделия составляет Линейное программирование задачи с решением дол., стоит ли браться за его изготовление?

Если изготовлять Линейное программирование задачи с решением единиц типа Линейное программирование задачи с решением, то задача в стандартной форме превращается в следующую: найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и минимизировать функцию т. е.

Линейное программирование задачи с решением

В конечной таблице первые два элемента столбца, соответствующего Линейное программирование задачи с решением, будет согласно уравнению (3.5) иметь следующий вид:

Линейное программирование задачи с решением

Поскольку симплекс-множители Линейное программирование задачи с решением из уравнения (3.7) следует, что коэффициент при Линейное программирование задачи с решением в канонической форме для функции Линейное программирование задачи с решением

Линейное программирование задачи с решением

Конечная таблица примет следующий вид (изменения произошли только в столбце Линейное программирование задачи с решением) :

Линейное программирование задачи с решением

Если

Линейное программирование задачи с решением

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

Если

Линейное программирование задачи с решением

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

4) Включение дополнительных ограничений

Задача № 18

Предположим, что в период экономического кризиса торговые агенты сообщают, что рынок принимает не более 550 полок в неделю. Как это отразится на производстве? Указанное ограничение на объем продажи равносильно ограничению

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

так что

Линейное программирование задачи с решением

удовлетворяет дополнительному ограничению.

Если бы экономический кризис был серьезнее, с ограничением рынка

До 450 полок в неделю, ситуация была бы иной. Рассмотрим ее в следующем разделе.

Двойственный симплекс-метод

Задача № 19

Предположим, что недельная продажа ограничена 450 полками. Тогда должно быть включено дополнительное ограничение

Линейное программирование задачи с решением

В виде уравнения оно записывается как

Линейное программирование задачи с решением

где Линейное программирование задачи с решением — дополнительная переменная.

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

Линейное программирование задачи с решением

Поэтому уравнение

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

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

В нашей задаче базисная переменная Линейное программирование задачи с решением отрицательна и является кандидатом на удаление из базиса. Какая переменная должна ее заменить? В строке Линейное программирование задачи с решением таблицы ищется отрицательный ведущий элемент, такой, что при последующих преобразованиях (которые снова примут вид уравнений (2.15) — (2.20)) коэффициенты целевой функции будут оставаться положительными. Перед формализацией этих правил посмотрим, как они выполняются в нашей задаче. В строке Линейное программирование задачи с решением имеется только один отрицательный коэффициент — коэффициент при Линейное программирование задачи с решением, равный —3/7. Если мы разделим уравнение на —3/7, чтобы включить в базисные переменные переменную Линейное программирование задачи с решением (с коэффициентом 1), то получим уравнение

Линейное программирование задачи с решением

т. е. значение Линейное программирование задачи с решением станет положительным. Следующим шагом мы должны исключить переменную Линейное программирование задачи с решением из остальных ограничений и из целевой функции. Это достигается простыми симплексными вычислениями; результаты, как показано ниже, могут быть сведены в таблицу. Ведущий элемент (отрицательное значение —3/7) отмечен звездочкой.

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

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

  • Найти отрицательную базисную переменную. Если ее нет, то оптимальное решение найдено; если их более чем одна, надо взять из них самую отрицательную. Пусть эта переменная — базисная в Линейное программирование задачи с решением-м ограничении. Она является переменной для исключения из базиса.
  • В Линейное программирование задачи с решением-й строке найти отрицательный коэффициент Линейное программирование задачи с решением. Если его нет, то, очевидно, не существует допустимого решения задачи. Для отрицательных коэффициентов в этой строке найти
Линейное программирование задачи с решением

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

  • Провести обычные симплекс-преобразования, выбрав в качестве ведущего элемент Линейное программирование задачи с решением. Из уравнения (2.19) для следующей итерации имеем
Линейное программирование задачи с решением

и, поскольку все Линейное программирование задачи с решением отрицательны, a Линейное программирование задачи с решением положительны, эта величина положительна, так как s выведено из соотношения

Линейное программирование задачи с решением

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

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

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

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

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

Двойственный симплекс-метод полезен при введении дополнительных ограничений в уже решенной задаче. Он также позволяет иногда избежать применения искусственных переменных.

Задача № 20

Найти такие неотрицательные

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

В стандартной форме задача формулируется следующим образом: найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

Если базисными переменными являются

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Если умножить эти ограничения на —1 (для получения корректного вида базиса) будем иметь

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Это можно проверить графически.

Данные в строках программы 4000-4060 соответствуют рассматриваемой задаче. Ниже приведена распечатка результатов работы программы, воспроизводящей приведенные таблицы.

Линейное программирование задачи с решением

Возможно эта страница вам будет полезна:

Заказать работу по линейному программированию

Транспортная задача. Постановка задачи и ее решение

Задача № 21

Фирма должна отправить некоторое количество кроватей с трех складов в пять магазинов. На складах имеется соответственно 15, 25, 20 кроватей, а для пяти магазинов требуется соответственно 20, 12, 5, 8 и 12 кроватей. Стоимость перевозки одной кровати (в долларах) со склада в магазин приведена в таблице.

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

должна быть минимизирована при этих ограничениях.

Эта задача является задачей линейного программирования, но специального вида. В частности, коэффициенты в ограничениях принимают значения 0 или 1, а каждая переменная входит только в два ограничения. На первый взгляд может показаться, что ограничения в виде равенств, определяющих предложение, должны быть заменены на ограничения в виде неравенств со знаком Линейное программирование задачи с решением, а ограничения в виде равенств, определяющих спрос на ограничения в виде неравенств, — со знаком Линейное программирование задачи с решением. Однако, поскольку суммарный спрос равен сумме поставок, во всех случаях должно выполняться равенство. Заметим также, что сумма по первым трем ограничениям дает тот же результат, что и сумма по последним пяти ограничениям. Поскольку независимых ограничений только 7, а не 8, следовательно, базисное допустимое решение и оптимальное решение будет содержать 7 ненулевых значений Линейное программирование задачи с решением.

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

и минимизирующих функцию

Линейное программирование задачи с решением

Короче, соотношения (4.2) можно переписать так:

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

Линейное программирование задачи с решением

и которые минимизируют функцию

Линейное программирование задачи с решением

Поскольку

Линейное программирование задачи с решением

согласно уравнению (4.1), имеется всего Линейное программирование задачи с решением независимых ограничений и, следовательно, Линейное программирование задачи с решением базисных переменных в базисном допустимом решении.

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

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

Линейное программирование задачи с решением

Переход к общему случаю очевиден.

Представляя данные в таком виде, легко построить первое базисное допустимое решение задачи. Это можно сделать по правилу «самая дешевая продукция реализуется первой». Поскольку задача состоит в минимизации общей стоимости, находим наименьшую стоимость во всех клетках: 0 в строке 1, столбце 2 и присваиваем переменной Линейное программирование задачи с решением значение 12 (наименьшая из сумм по строке и по столбцу). Теперь столбец 2 можно удалить, уменьшив сумму по строке на 12, т. е. заменив ее на 3. Потом та же процедура применяется к полученному массиву.

Линейное программирование задачи с решением

Затем переменной Линейное программирование задачи с решением и присваивается значение 3 (или переменной Линейное программирование задачи с решением — значение 5), удаляется строка 1, сумма по столбцу 1 заменяется на 17 и осуществляется переход к следующему массиву и т. д.

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Полная стоимость, соответствующая этому решению, С — 3 X 1 + + 12X0 + 2X5 + 8X3 +15X3 +15 Х4 + 5Х 1=147 дол.

Попробуем теперь улучшить это решение, уменьшив стоимость С. Отметим, что полученные результаты для этого частного случая и метод их получения применимы и в случае общей транспортной задачи (см. соотношения (4.2)).

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Теперь докажем следующие утверждения.

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

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

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

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

Утверждение 2. Значения всех базисных переменных задаются соотношениями

Линейное программирование задачи с решением

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

Поэтому

Линейное программирование задачи с решением

Если выполняется первое из этих равенств (т. е. Линейное программирование задачи с решением), то удаляется строка Линейное программирование задачи с решением, a Линейное программирование задачи с решением заменяется на Линейное программирование задачи с решением. Затем рассуждение повторяется для оставшегося массива, т. е. полагается, что

Линейное программирование задачи с решением

Повторив эту процедуру несколько раз, увидим, что все базисные переменные имеют вид

Линейное программирование задачи с решением

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

Это очень важное следствие; оно гарантирует, что в задачах не будет получено абсурдное решение (например, Линейное программирование задачи с решением кроватей в примере 1).

Возможно эта страница вам будет полезна:

Помощь по линейному программированию

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

Транспортную задачу можно решить и применением симплекс-метода, но в данном случае этот метод неэффективен, так как используются ограничения специального вида. Мы будем решать эту задачу с помощью алгоритма последовательного улучшения, разработанного Ф. Л. Хитчко-ком. Рассмотрим задачу из примера 1 разд. 4.1 (результаты можно обобщить, используя симплекс-множители, описанные в предыдущей главе).

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

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

Если Линейное программирование задачи с решением — симплекс-множители для ограничений, соответствующих Линейное программирование задачи с решением-ой строке и Линейное программирование задачи с решением-му столбцу в этом базисе, то после умножения строки на Линейное программирование задачи с решением, Линейное программирование задачи с решением-го столбца на Линейное программирование задачи с решением и прибавления стоимости Линейное программирование задачи с решением получаем

Линейное программирование задачи с решением

Следовательно,

Линейное программирование задачи с решением

Уравнение (4.7) — это специальный вид уравнения (3.7) для транспортной задачи. Коэффициент при Линейное программирование задачи с решением равен

Линейное программирование задачи с решением

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

Далее если уравнение (4.7) является канонической формой целевой функции, соответствующей базису, то коэффициенты при базисных переменных равны 0.

Таким образом, для занятых клеток массива справедливо соотношение

Линейное программирование задачи с решением

следовательно, можно определить Линейное программирование задачи с решением и Линейное программирование задачи с решением.

Имеется Линейное программирование задачи с решением неизвестных Линейное программирование задачи с решением и Линейное программирование задачи с решением неизвестных и Линейное программирование задачи с решением, поскольку базисными переменными занято Линейное программирование задачи с решением клеток, из уравнения (4.8) получаем Линейное программирование задачи с решением уравнений Линейное программирование задачи с решением неизвестных. Эти уравнения можно решить, положив одно из неизвестных равным 0 и решив систему относительно остальных неизвестных. Это всегда возможно. В примере 1 на первом шаге имеем следующее базисное допустимое решение:

Линейное программирование задачи с решением

Имеется 8 неизвестных

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Теперь можно проверить, оптимально ли это решение. Если Линейное программирование задачи с решением — коэффициент при Линейное программирование задачи с решением в канонической форме для целевой функции, то из уравнений (4.7) следует, что

Линейное программирование задачи с решением

Для базисных переменных Линейное программирование задачи с решением = 0. Для небазисных переменных отрицательное значение Линейное программирование задачи с решением. указывает на то, что переменная Линейное программирование задачи с решением должна быть включена в базисные переменные, что приведет к уменьшению целевой функции. В связи с этим Линейное программирование задачи с решением вычисляется для незанятых клеток; те из них, в которых значение Линейное программирование задачи с решением отрицательно, помечаются. Результат указан в левых нижних углах массива. На этом этапе нулевые значения переменных указывают на то, что их введение в базис не изменит значение целевой функции.

Ясно, что для нашей задачи увеличение Линейное программирование задачи с решением приведет к уменьшению целевой функции. Действительно, каждое увеличение Линейное программирование задачи с решением на 1 уменьшит целевую функцию на 3. При увеличении значения Линейное программирование задачи с решением на число Линейное программирование задачи с решением необходимо уменьшить Линейное программирование задачи с решением на число Линейное программирование задачи с решением, чтобы сохранить сумму в строке (2). Для того чтобы сохранить значение суммы в столбце (1), необходимо увеличить Линейное программирование задачи с решением на число Линейное программирование задачи с решением, а затем для сохранения суммы в строке (1) уменьшить Линейное программирование задачи с решением на число Линейное программирование задачи с решением Заметим, что другой метод: положить Линейное программирование задачи с решением = Линейное программирование задачи с решением уменьшить Линейное программирование задачи с решением на число Линейное программирование задачи с решением до значения 8 — Линейное программирование задачи с решением, поскольку невозможно сохранить сумму в столбце (4), не вводя дополнительных переменных, — приводит к некоторым трудностям и с его помощью невозможно получить базисное решение. Программа должна избегать таких «тупиковых путей».

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

Линейное программирование задачи с решением

Для этого массива

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Значение стоимости Линейное программирование задачи с решением уменьшается:

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Минимальное значение стоимости Линейное программирование задачи с решением равно 121 дол. Отметим, что значение стоимости Линейное программирование задачи с решением задается уравнением

Линейное программирование задачи с решением

что непосредственно следует из уравнения (4.7) , так как в его левой части все слагаемые равны 0 (поскольку либо переменная базисная, а следовательно, коэффициент при ней равен нулю, либо переменная небазисная и, значит, равна 0). Заметим, что уравнение (4.10) — просто частный случай уравнения (3.11) для транспортной задачи.

Проверьте справедливость уравнения (4.10) для каждого из массивов. Такая проверка полезна на каждом шаге итерационной процедуры.

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

Возможно эта страница вам будет полезна:

Контрольная работа линейное программирование

Дисбаланс и вырожденность в транспортной задаче

Выполнение условия (4.1) очень важно в транспортной задаче. Для массива размерностью Линейное программирование задачи с решением оно означает, что в базисное допустимое решение входит Линейное программирование задачи с решением базисная переменная. Предположим, что этот баланс между спросом и предложением нарушен. Пример 1 (вариант примера 1 из разд. 4.1 и 4.2)

Пусть 15, 25, 20 кроватей, хранящихся на складах Линейное программирование задачи с решением, должны быть распределены по четырем магазинам, где требуется 20, 12, 5 и 9 кроватей. Пусть стоимость перевозки одной кровати со складов в магазины задается таблицей

Линейное программирование задачи с решением

Как следует планировать перевозку для минимизации стоимости?

Склады располагают 60 кроватями. Магазинам требуется лишь 46 кроватей. Для того чтобы перейти к транспортной задаче, введем фиктивный магазин, которому требуется 14 кроватей. Стоимость перевозок со склада в этот магазин полагается равной 0. Если в окончательном решении будет получено, что некоторые кровати надо будет отправить в этот магазин, то это будет проигнорировано. Кровати останутся на складе. Таким образом, поставлена транспортная задача, для которой уравнения (4.1) выполняются.

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

Линейное программирование задачи с решением

Переменная Линейное программирование задачи с решением входит в базис; максимальное значение Линейное программирование задачи с решением равно 5; переменная Линейное программирование задачи с решением исключается из базиса:

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

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

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

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

Задача № 22

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

Линейное программирование задачи с решением

Должны быть заключены контракты на продажу 1000 пальто размера Линейное программирование задачи с решением, 1500 пальто размера Линейное программирование задачи с решением и 1200 пальто размера Линейное программирование задачи с решением, однако ограниченность производственных мощностей фирм приводит к тому, что общее количество заказов не может превосходить 1000 пальто для фирмы Линейное программирование задачи с решением, 1500 пальто для фирмы Линейное программирование задачи с решением и 2500 пальто для фирмы Линейное программирование задачи с решением. Необходимо, чтобы эти контракты были заключены с минимизацией общей стоимости, однако ограничения должны быть распределены по фирмам как можно справедливее. Как следует распределить заказы для выполнения этих требований?

Заметим, что общее предложение (5000 пальто) превосходит общий спрос (3700 пальто). Поэтому введем фиктивный сорт пальто, количество которых составит 1300; задача превращается в транспортную. Стоимость одного пальто этого сорта будет нулевой, и спрос на эти пальто в окончательном решении будет игнорироваться. Он будет просто отражать избыточную производственную мощность. Решать задачу удобно, принимая за единицу 100 пальто.

Массив задачи принимает вид

Линейное программирование задачи с решением

Ниже приводятся первое базисное решение, симплекс-множители Линейное программирование задачи с решением, Линейное программирование задачи с решением и т. д. и первая итерация вычислений:

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением
Линейное программирование задачи с решением

Максимальное значение Линейное программирование задачи с решением равно 3, и следующее решение не вырождено:

Линейное программирование задачи с решением

Последнее решение оптимально. Однако, поскольку Линейное программирование задачи с решением, переменная также может быть введена в базис без изменения функции Максимальное значение Линейное программирование задачи с решением равно 2:

Линейное программирование задачи с решением

Следовательно, имеется два оптимальных решения, для которых стоимость Линейное программирование задачи с решением = 410 900 дол.

Первое решение: фирма Линейное программирование задачи с решением поставляет 1000 пальто размера Линейное программирование задачи с решением и 200 пальто размера Линейное программирование задачи с решением; фирма Линейное программирование задачи с решением поставляет 1300 пальто размера Линейное программирование задачи с решением и 1200 пальто размера Линейное программирование задачи с решением.

Второе решение: фирма Линейное программирование задачи с решением поставляет 200 пальто размера Линейное программирование задачи с решением, фирма Линейное программирование задачи с решением — 1000 пальто размера Линейное программирование задачи с решением, фирма Линейное программирование задачи с решением — 1300 пальто размера Линейное программирование задачи с решением и 1200 пальто размера Линейное программирование задачи с решением.

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

Вырожденности можно избежать, слегка изменив суммы по строкам так, чтобы частичные суммы сумм по строкам не совпадали с частичными суммами сумм по столбцам. Можно положить суммы по строкам равными 10,01 ; 15,01; 25,01; по столбцам 10; 15 ; 12 и 13,03. В окончательном решении можно округлить дробные значения до целых. Проведите вычисления (ясно, что они аналогичны вышеописанным вычислениям).

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

Постановка транспортной задачи на эвм

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

Теперь приведем блок-схему определения первого допустимого базисного решения (строки 500-840) [рис. 4.18].

В конце этой процедуры все элементы массива

Линейное программирование задачи с решением

должны быть равны 0. Переменные

Линейное программирование задачи с решением

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

В следующей процедуре (строки 1000-1585) вычисляются Линейное программирование задачи с решением и Линейное программирование задачи с решением и наименьшее значение Линейное программирование задачи с решением, предположим Линейное программирование задачи с решением (рис. 4.19).

Процедура перехода к новому базисному допустимому решению (начиная со строки 2000 до строки 3250) заслуживает внимательного изучения. Поясним ее подробнее. Сначала находится «цепь» ± Линейное программирование задачи с решением клеток, которая не является «тупиковым путем» (строки 2050-2730).

На шаге 1 мы находимся в клетке Линейное программирование задачи с решением — счетчик шагов, Линейное программирование задачи с решением — индикатор «тупикового пути»,

Линейное программирование задачи с решением

клетка, в которую мы попадаем на шаге Линейное программирование задачи с решением. Массив Линейное программирование задачи с решением состоит из ± 1, соответствующих ± Линейное программирование задачи с решением; положим Линейное программирование задачи с решением = 1, если клетка используется,

Линейное программирование задачи с решением

если строки и столбцы входят в цикл.

В команде 2100 на шаге Линейное программирование задачи с решением ищется строка Линейное программирование задачи с решением для столбца, содержащего базисную переменную в неиспользованном столбце (строка 2140)

Линейное программирование задачи с решением

в неотмеченной клетке (строка 2150). Если это единственная переменная в своем столбце, то производится присваивание Линейное программирование задачи с решением = 1 (строка 2170). Разумеется, это не делается в начальном столбце Линейное программирование задачи с решением. После того как подходящая переменная найдена в столбце Линейное программирование задачи с решением, поиск прекращается; при этом Линейное программирование задачи с решением = 1.

Затем Линейное программирование задачи с решением увеличивается для следующего шага, в переменную Линейное программирование задачи с решением заносится номер текущей строки, а в переменную Линейное программирование задачи с решением — номер только что найденного столбца Линейное программирование задачи с решением; соответствующему Линейное программирование задачи с решением присваивается значение — 1, и найденная клетка помечается присвоением Линейное программирование задачи с решением значения 1 (строка 2320). Если мы снова оказались в столбце Линейное программирование задачи с решением, откуда начали, то цикл завершен (строка 2400). В противном случае ищем столбец Линейное программирование задачи с решением для строки, содержащей базисную переменную в неотмеченных строке и клетке; таким образом снова помечаются «тупиковые пути». Как только искомый столбец найден, поиск прекращается присвоением Линейное программирование задачи с решением = 1. Затем Линейное программирование задачи с решением увеличивается для следующего шага, переменной Линейное программирование задачи с решением присваивается номер только что найденной строки Линейное программирование задачи с решением, а Линейное программирование задачи с решением — номер только что обрабатывавшегося столбца; для этой клетки осуществляются присвоения: Линейное программирование задачи с решением = +1, Линейное программирование задачи с решением = 1, после чего программа возвращается к поиску строки в строке 2100 программы.

Линейное программирование задачи с решением

Заметим, что если в процессе поиска строки не удается найти столбец (Линейное программирование задачи с решением = 0 в строке 2190), не являющийся «тупиковым путем», то происходит возвращение (строка 2210) к строке предыдущего поиска столбца. Если в поисках столбца удается найти только строки (Линейное программирование задачи с решением = 0 в строке 2590), соответствующие тупиковым путям, то осуществляется возвращение (строка 2610) к строке предыдущего поиска строки. Однако в силу того, что Линейное программирование задачи с решением сохраняет свое значение, ошибка не повторяется в дальнейшем (Линейное программирование задачи с решением = 1 в строках 2150 и 2550). Поскольку базис задан треугольной системой уравнений, процесс в конце концов закончится и управление будет передано из строки 2400 в строку 3000.

В строках 3000 — 3040 программы содержится наименьшая базисная переменная из клеток, в которых Линейное программирование задачи с решением = — 1. Здесь определяются значение w и положение переменной Линейное программирование задачи с решением, которая будет удалена из базиса. В строках 3100 — 3120 клетки включаются в цепь. В конечном счете переменная Линейное программирование задачи с решением определяется как базисная, переменная Линейное программирование задачи с решением — как небазисная и определяется количество базисных переменных во всех строках и столбцах. Затем программа возвращается к вычислению симплекс-множителей Линейное программирование задачи с решением и Линейное программирование задачи с решением.

При работе программы печать (Линейное программирование задачи с решением и Линейное программирование задачи с решением) в строках 1340— 1342 и наибольшего по модулю значения Линейное программирование задачи с решением в строке 1581, а также печать в строках 2071, 2321 и 2721 могут быть подавлены. Последние три строки отражают цепи и обратный поиск. Печать в строке 3221, определяющая w и переменную для удаления из базиса, тоже может быть подавлена.

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

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

Возможно эта страница вам будет полезна:

Линейное программирование в Excel

Задача о назначениях

Задача № 23

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

При этих ограничениях минимизируется полное время

Линейное программирование задачи с решением

Таким образом, это задача линейного программирования транспортного типа. Поскольку все суммы по строкам и по столбцам равны 1, она вырождена, так что алгоритм решения транспортной задачи применим, но неэффективен. Поскольку задача транспортная, в ее оптимальном решении (целочисленном) пять из величин Линейное программирование задачи с решением будут равны 1, а остальные -0. С другой стороны, в матрице времени размерностью 5X5 надо найти пять элементов — по одному в каждой строке и каждом столбце, таких, что сумма выбранных элементов минимальна. Условие равенства Линейное программирование задачи с решением 0 или 1 в некоторых случаях необходимо, чтобы придать смысл формулировке задачи (см., например, первую фразу рассматриваемого примера). Это постулат.

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

Линейное программирование задачи с решением

где

Линейное программирование задачи с решением

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

Метод Мака для решения задачи о назначении

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

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

Метод Мака имеет преимущество более простого интуитивного обоснования. Это — логический процесс. Сначала опишем шаги этого итеративного процесса,, а программу для ЭВМ приведем в разд. 5.3. Этот метод основан на идее выбора в каждой строке минимального элемента. Вообще говоря, минимальные элементы строк не распределены по всем п столбцам матрицы. Здесь используется идея сложения (или вычитания) одного и того же значения со всеми элементами строки или столбца, чтобы распределить минимальные элементы строк по столбцам (тогда они образуют оптимальный выбор).

Метод Мака для задачи выбора

Основатель метода К. Мак очень хорошо описал его в [15]. Рассматривается задача выбора размерностью Линейное программирование задачи с решением. Выберем по минимальному элементу в каждой строке. Подчеркнем каждый из этих минимальных элементов. Если в каждом столбце имеется ровно по одному подчеркнутому элементу, то подчеркнутые элементы — базис — определяют оптимальный выбор.

Начало

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

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

Шаг 2. Пусть элемент множества Линейное программирование задачи с решением из строки Линейное программирование задачи с решением равен Линейное программирование задачи с решением а минимальный элемент множества Линейное программирование задачи с решением из строки Линейное программирование задачи с решением равен Линейное программирование задачи с решением. Пусть

Линейное программирование задачи с решением

Шаг 3. Увеличить все элементы множества Линейное программирование задачи с решением на Линейное программирование задачи с решением. Шаг 4. Отметить Линейное программирование задачи с решением точками внизу. Теперь Линейное программирование задачи с решением — «отмеченный точками элемент».

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

Теперь можно подчеркнуть элементы в еще одном столбце. Шаг 6. Подчеркнуть последний элемент Линейное программирование задачи с решением полностью. Это — новый подчеркнутый элемент.

Шаг 7. Найти исходный подчеркнутый элемент в той же строке, что Линейное программирование задачи с решением . Убрать подчеркивание. Обозначить столбец, в котором находится этот элемент, Линейное программирование задачи с решением.

Шаг 8. Если Линейное программирование задачи с решением не содержит других элементов, он должен содержать элемент, отмеченный точками. Обозначить этот элемент Линейное программирование задачи с решением и вернуться к шагу 6.

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

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

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

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

Ниже приводится полное описание этого метода для решения примера 1 разд. 5.1.

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

Задача № 24

Ежедневно авиалиния, которая принадлежит некоторой компании, осуществляет следующие перелеты между городами Линейное программирование задачи с решением и Линейное программирование задачи с решением:

Линейное программирование задачи с решением

Компания хочет организовать полеты «туда» и «обратно» так, чтобы минимизировать время простоя при условии, что каждому самолету требуется по крайней мере 1 ч для заправки. Используйте технику решения задачи выбора.

Напишите расписание полетов, совершаемых каждым из самолетов.

Представьте найденное решение в виде диаграммы. Сколько самолетов требуется для полетов по составленному расписанию? Время простоя в каждом случае приведено в таблице.

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Так что последовательность в целом имеет следующий вид:

Линейное программирование задачи с решением
Линейное программирование задачи с решением

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

Реализация метода Мака на эвм

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

В строках 250—310 программы минимальным элементом строки I является Линейное программирование задачи с решением из столбца Линейное программирование задачи с решением. В строках 320-360 пусть Линейное программирование задачи с решением — количество минимумов в столбце Линейное программирование задачи с решением — значение минимума в 1-й строке, Линейное программирование задачи с решением — строка Линейное программирование задачи с решением-го минимума в столбце Линейное программирование задачи с решением — столбец Линейное программирование задачи с решением из строки I. Началу и шагу 1 соответствуют строки программы 400—470, где находится столбец с двумя и более минимумами; строки, в которых находятся эти минимумы, запоминаются в переменных Линейное программирование задачи с решением и т. д. В строке 480 Линейное программирование задачи с решением — количество столбцовое которых производились одновременные увеличения (в начале Линейное программирование задачи с решением = 1); Линейное программирование задачи с решением и т. д. -список номеров столбцов из множества Линейное программирование задачи с решением, a Линейное программирование задачи с решением для таких столбцов равна 1; Линейное программирование задачи с решением — значение, на которое увеличены элементы столбца Линейное программирование задачи с решением.

Шаг 2 — строки программы 520-640; Линейное программирование задачи с решением — разность между элементом в строке Линейное программирование задачи с решением) столбца Линейное программирование задачи с решением и минимумом в строке I. Столбцы множества Линейное программирование задачи с решением, для которых Линейное программирование задачи с решением = 1, исключаются. Наименьшее значение Линейное программирование задачи с решением присваивается IV, и это — наименьшее значение, нужное для соответствия одному из минимумов по строкам в множестве Линейное программирование задачи с решением — столбец соответствующего элемента, a Линейное программирование задачи с решением — номер его строки, Линейное программирование задачи с решением — общее значение, на которое увеличиваются элементы в столбце Линейное программирование задачи с решением (строки 650-670). В данный момент на IV увеличиваются только значения минимумов в строке Линейное программирование задачи с решением. Это — модифицированный шаг 3 (680—700) .

В строке 720 столбец Линейное программирование задачи с решением добавляется к множеству Линейное программирование задачи с решением, т. е. Линейное программирование задачи с решениемЛинейное программирование задачи с решением полагаются равными Линейное программирование задачи с решением. В строке 750 указывает строку минимума в столбце Линейное программирование задачи с решением — столбец минимума в строке Линейное программирование задачи с решением. Строка 770: в столбце Линейное программирование задачи с решением имеется Линейное программирование задачи с решением минимумов. Если в столбце Линейное программирование задачи с решением нет минимумов, минимумы в строке располагаются так, чтобы покрыть один лишний столбец (переход от строки 780 к строке 840). В противном случае эти минимумы прибавляются к Линейное программирование задачи с решением минимумам из предыдущих столбцов, Линейное программирование задачи с решением соответственно увеличивается, а строки минимумов из Линейное программирование задачи с решением запоминаются в Линейное программирование задачи с решением. Это — шаг 5, и в строке программы 520 происходит возвращение к шагу 2.

Если после шага 5 осуществляется переход к строке 840, то необходимо переместить минимум (шаг 6). В строке 850 программы Линейное программирование задачи с решением представляет собой столбец с номером Линейное программирование задачи с решением матрицы Линейное программирование задачи с решением. Вновь обнуляем Линейное программирование задачи с решением, т. е. исключаем его из множества Линейное программирование задачи с решением. Элемент Линейное программирование задачи с решением является тем значением, на которое был номинально увеличен столбец Линейное программирование задачи с решением. Теперь все элементы столбца Линейное программирование задачи с решением фактически увеличены на это значение (строка 880 программы).

В строке 910 программы находится один минимум в столбце Линейное программирование задачи с решением. Новый минимум находится в строке Линейное программирование задачи с решением столбца Линейное программирование задачи с решением (шаг 6); Линейное программирование задачи с решением в строке 930 — столбец предыдущего минимума в строке Линейное программирование задачи с решением, так что в строке 940 полагаем Линейное программирование задачи с решением. Количество минимумов в этом столбце Линейное программирование задачи с решением, где Линейное программирование задачи с решением равно исходному значению Линейное программирование задачи с решением. В строках 970-1020 программы определяется, какой из минимумов столбца Линейное программирование задачи с решением находится в строке Линейное программирование задачи с решением. Он исключается или заменяется. В строке 1030 программы происходит следующее: если в столбце Линейное программирование задачи с решением находится более одного минимума, перераспределение минимумов закончено, Линейное программирование задачи с решением приравнивается 1, управление возвращается к строке 400 (старт) для нахождения столбцов с более чем одним минимумом. Если программа дойдет до строки 1040, то в столбце Линейное программирование задачи с решением будет найден всего один минимум; Линейное программирование задачи с решением — номер его строки, так что новое значение (строка одного минимума в столбце Линейное программирование задачи с решением) и есть новое значение Линейное программирование задачи с решением. Таким образом, процесс повторяется с новым столбцом Линейное программирование задачи с решением в строке 930 программы.

В строку 1500 управление передается из строки 420, где обнаруживается отсутствие столбцов с более чем одним минимумом. Теперь минимумы в строках распределены по столбцам, и оптимальный выбор найден. Строка первого (и единственного) минимума в столбце J есть 1С (см. строку 1520), так что оптимальные выборы извлекаются из элементов строки I столбца JV(I) (см. строку 1550). Они распечатываются, и оптимальная сумма заносится в Т.

Задача № 25

Для матрицы

Линейное программирование задачи с решением

найдите 1) минимальный; 2) максимальный выбор. Данные в строке 2000 пригодны для случая 1). Распечатка результатов в обоих случаях следующая:

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

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

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

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

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

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

найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

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

После введения новых переменных задача принимает стандартную форму

Линейное программирование задачи с решением

Уравнения (6.3) — каноническая форма, соответствующая базисным переменным

Линейное программирование задачи с решением

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

Улучшенный симплекс-метод — это итерационная процедура, основанная на том, что на Линейное программирование задачи с решением-й итерации известны:

базисные переменные и их значения;

обращение базиса;

соответствующие базису симплекс-множители.

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

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

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

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

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

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

Максимальное значение, которое может принимать переменная Линейное программирование задачи с решением без нарушения условий неотрицательности, задается соотношение (см. уравнение (2.14))

Линейное программирование задачи с решением

и это определяет строку базисной переменной, предназначенной для исключения из базиса.

  • Теперь можно вычислить новый базис, его обращение и симплекс-множители.

а) Старый базис Линейное программирование задачи с решением заменяется на новый Линейное программирование задачи с решениемЛинейное программирование задачи с решением.

б) Новые значения базисных переменных есть

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Следовательно,

Линейное программирование задачи с решением

(См. упр. 15 гл. 3).

Таким образом, если

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

столбца и Линейное программирование задачи с решением в качестве ведущего элемента.

г) Для завершения цикла нужны новые симплекс-множители. Из уравнения (3.9) находим исходные значения

Линейное программирование задачи с решением

так как в базис теперь вместо Линейное программирование задачи с решением входит Линейное программирование задачи с решением. Значит,

Линейное программирование задачи с решением

поскольку слагаемое при Линейное программирование задачи с решением равно 0. Следовательно,

Линейное программирование задачи с решением

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

Итак,

Линейное программирование задачи с решением

(см. также уравнение (2.10) и разд. 3.2). Следовательно,

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Задача № 26

Найти неотрицательные Линейное программирование задачи с решением удовлетворяющие условиям

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

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

Линейное программирование задачи с решением

На итерации 0 в базис входят переменные Линейное программирование задачи с решением со значениями 36, 48, 22. Обращения базиса есть просто Линейное программирование задачи с решением, а три симплекс-множителя равны 0. Затем вычисление производится в соответствии с только что описанной итеративной процедурой. Последовательность вычислений состоит в том, чтобы записать значения базисных переменных, обращений и симплекс-множителей на итерации 0. Затем вычисляются Линейное программирование задачи с решением у находится отмеченная звездочкой Линейное программирование задачи с решением-я переменная для включения в базис, вычисляется столбец Линейное программирование задачи с решением (ведущий элемент помечен крестиком), вычисляются новые базисные переменные и определяются их значения, новые обращения и симплекс-множители. Затем итеративная процедура возобновляется. Когда все Линейное программирование задачи с решением станут положительны, минимум будет достигнут.

Линейное программирование задачи с решением

На итерации 4 получаем оптимальное решение, в котором

Линейное программирование задачи с решением

и Линейное программирование задачи с решением достигает минимального значения, равного 202. Легко проверить, что матрица

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Легко проверить, что симплекс-множители оптимальному базису, суть

Линейное программирование задачи с решением

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

Возможно эта страница вам будет полезна:

Курсовая работа по линейному программированию

Инициализация алгоритма

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

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

для функции Линейное программирование задачи с решением — настоящей целевой функции.

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

В соответствии с уравнением (6.4) получаем

Линейное программирование задачи с решением

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

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

Величины как и прежде, равны 0. В фазе I вычислений величины Линейное программирование задачи с решением и Линейное программирование задачи с решением преобразуются в соответствии с уравнением (6.16), использующим Линейное программирование задачи с решением для Линейное программирование задачи с решениеми Линейное программирование задачи с решением для Линейное программирование задачи с решением. Величины Линейное программирование задачи с решением и Линейное программирование задачи с решением вычисляются из уравнений (6 4) и (6.17) соответственно. Следовательно, как только этап I завершится, а функция Линейное программирование задачи с решением обратится в 0 (если этого не произойдет, ограничения не имеют допустимого решения), можно продолжить минимизацию функции Линейное программирование задачи с решением без особых затруднений.

Задача № 27

Найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

Задача в стандартной форме с новыми и искусственными переменны

ми имеет вид

Линейное программирование задачи с решением

На итерации 2 Линейное программирование задачи с решением обращается в 0. Если воспользоваться уравнением (6.4) и подходящими симплекс-множителями для функции Линейное программирование задачи с решением (-5/9, -25/9, 0), то ясно, что функция оптимизируется также и этим базисным допустимым решением, в которому Линейное программирование задачи с решением, и минимальное значение функции Линейное программирование задачи с решением равно 30. Поскольку Линейное программирование задачи с решением третье ограничение превращается в строгое неравенство.

Еще раз о вырожденности

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

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

Итак, вместо следующей задачи:

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

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением

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

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

Линейное программирование задачи с решением

и минимизирующие функцию

Линейное программирование задачи с решением

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

На Линейное программирование задачи с решением-1 итерации получим, например, базис Линейное программирование задачи с решением и его обращение, матрицу с элементами Тогда из уравнения (2.8) ясно, что значения базисных переменных возмущенной задачи имеют вид

Линейное программирование задачи с решением

где Линейное программирование задачи с решением — значения исходной задачи.

Разумеется, выбор Линейное программирование задачи с решением произволен лишь потому, что базис остается допустимым. Если Линейное программирование задачи с решением > 0, то в силу ограниченности элементов можно быть уверенными, что Линейное программирование задачи с решением при достаточно малом Линейное программирование задачи с решением. Если Линейное программирование задачи с решением = 0, то мы должны быть уверены в том, что первое ненулевое положительно, так как Линейное программирование задачи с решением > 0.

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

Линейное программирование задачи с решением

для Линейное программирование задачи с решением

Теперь вырожденность исходной задачи означает, что здесь может встретиться неоднозначность минимизации

Линейное программирование задачи с решением

для Линейное программирование задачи с решением

Если минимум Линейное программирование задачи с решением для Линейное программирование задачи с решением единствен и равен Линейное программирование задачи с решением, то при достаточно малом Линейное программирование задачи с решением минимум (6.21) будет достигаться для одного и того же значения Линейное программирование задачи с решением.

Значения базисных переменных на следующей итерации можно вычислить, используя соотношения (6.9)си (6.10):

Линейное программирование задачи с решением

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

Если в (6.22) возникают неопределенности, следует в (6.21) рассмотреть члены первого порядка по Линейное программирование задачи с решением. Таким образом ищется минимум

Линейное программирование задачи с решением

среди значений Линейное программирование задачи с решением, связанных с неопределенностью (6.22) Итак, Линейное программирование задачи с решением находится из соотношения

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Далее в силу соотношения (6.26) коэффициент при Линейное программирование задачи с решением в уравнении (6.27) будет строго положителен — именно это обеспечивает допустимость базиса. Если неопределенности возникают в (6.22), а затем в (6.26), необходимо учесть также слагаемое с Линейное программирование задачи с решением и определить Линейное программирование задачи с решением из соотношения

Линейное программирование задачи с решением

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

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

Таким образом, видно, что процедура нахождения переменной для исключения из базиса заключается сначала в рассмотрении частных в (6.22), затем (если неопределенности имеются) в переходе к уравнению (6.26), далее (если они повторяются) в переходе к уравнению (6.28), и т. д. по столбцам обращения. Итак, разрешить возникшие трудности можно и без явного введения е в задачу. Достаточно того, чтобы значение Линейное программирование задачи с решением, удовлетворяющее всем требованиям, могло быть найдено. Искать его необязательно.

Новое значение функции Линейное программирование задачи с решением

Линейное программирование задачи с решением

а поскольку Линейное программирование задачи с решением (из уравнения (6.23)), функция Линейное программирование задачи с решением убывает и никогда в дальнейшем не примет предыдущего значения. Таким образом, можно быть уверенным, что предыдущий базис не встретится снова, и процедура должна закончиться самое большее за Линейное программирование задачи с решением шагов (см. разд. 2.5).

Задача № 28

Найти неотрицательные Линейное программирование задачи с решением удовлетворяющие условиям

Линейное программирование задачи с решением

и минимизировать функцию

Линейное программирование задачи с решением
Линейное программирование задачи с решением

Оптимум для функции Линейное программирование задачи с решением равен -7 при

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Поскольку Линейное программирование задачи с решением мало, ясно, что это второе отношение. Неопределенность в «значениях» Линейное программирование задачи с решением разрешается в первом столбце обращения: Линейное программирование задачи с решением

Программа для улучшенного симплекс-метода

Представленная ниже программа реализует идеи настоящей главы. Она похожа на программу гл. 2. Исходная матрица коэффициентов заносится в память как матрица Линейное программирование задачи с решением, правые части ограничений заносятся в столбец 0. Таким образом, в матрицу входят Линейное программирование задачи с решением + 2 строк, Линейное программирование задачи с решением ограничений, целевая функция и искусственная целевая функция. Она имеет Линейное программирование задачи с решением строк помимо строки 0, которые содержат исходные, новые и искусственные переменные. Матрица Линейное программирование задачи с решением состоит из столбцов значений переменных и значений целевой функции, матрицы обращения размерностью Линейное программирование задачи с решением, двух строк симплекс-множителей и последнего столбца, в котором все элементы, кроме последних двух, равны 0, а последние два равны — 1:

Линейное программирование задачи с решением

Матрицам Линейное программирование задачи с решением и Линейное программирование задачи с решением присваиваются значения в строке 60 и строках 100—500.

Величины Линейное программирование задачи с решением из уравнения (6.4) или Линейное программирование задачи с решением из уравнения (6.17) вычисляются в строках 530 и 540. В силу указанного выше вида матрицы Линейное программирование задачи с решением, вычисляются в строках 760—780 и запоминаются как Линейное программирование задачи с решением. Правила предыдущего раздела для разрешения неопределенности реализуются в строках программы 790—1000. Рекомендуем внимательно сравнить этот раздел программы со строками 740-810 программы разд. 2.4.

В качестве иллюстраций работы программы и формата вывода результатов решаются примеры разд. 6.1 — 6.3. Сравните распечатку результатов с приведенными ранее вычислениями. Наконец, решается задача Била. Зацикливание исключается. Проверьте это, переставив ограничения (зацикливания все равно не произойдет).

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

Большим преимуществом улучшенного симплекстметода является уменьшение количества вычислений. Симплекс-метод работает с матрицей Линейное программирование задачи с решением, имеющей Линейное программирование задачи с решением + 2 строки и Линейное программирование задачи с решением столбцов. Улучшенный симплекс-метод работает с матрицей Линейное программирование задачи с решением, имеющей Линейное программирование задачи с решением + 2 строк и Линейное программирование задачи с решением + 1 столбцов. Таким образом, количество вычислений в задаче линейного программирования напрямую связано скорее с количеством ограничений, чем с количеством переменных, которое в общем случае значительно больше.

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

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

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

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

Прямая задача:

найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция Линейное программирование задачи с решением имеет максимальное значение.

Ей соответствует двойственная задача: найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция Линейное программирование задачи с решением имеет минимальное значение.

На самом деле нам уже встречались прямая и двойственная задачи в упр. 5, 6 гл. 2 и в упр. 3, 4 гл. 6, Исходная задача: найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное значение.

Соответствующая двойственная задача: найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

Прямая задача имеет ограничения в виде неравенства со знаком Линейное программирование задачи с решением, а двойственная — со знаком Линейное программирование задачи с решением. Количество переменных в прямой задаче совпадает с количеством переменных в двойственной задаче. Матрица коэффициентов ограничений двойственной задачи является транспонированной матрицей коэффициентов прямой задачи. Коэффициенты целевой функции двойственной задачи являются значениями правых частей ограничений прямой задачи, и наоборот.

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

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное значение.

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

найти такой Линейное программирование задачи с решением, что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

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

Задача № 29

Привести к стандартной форме прямую задачу найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение. Сформулировать двойственную задачу.

Максимизация функции Линейное программирование задачи с решением равносильна минимизации, например, функции Линейное программирование задачи с решением.

Ограничение Линейное программирование задачи с решением умножением на -1 преобразуется в ограничение — Линейное программирование задачи с решением.

Ограничение

Линейное программирование задачи с решением

равносильно двум ограничениям

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное Это — стандартная форма прямой задачи. Двойственная задача имеет следующий вид: найти такие

Линейное программирование задачи с решением

(смысл этих обозначений скоро станет ясен), что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

Это стандартная двойственная задача. Видно, что

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

Задача № 30

Найти двойственную задачу для задачи найти такие Линейное программирование задачи с решением неопределенного знака, что

Линейное программирование задачи с решением

и функция Линейное программирование задачи с решением имеет минимальное значение.

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

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

и функция Линейное программирование задачи с решением имеет максимальное значение.

Двойственная задача приведена в стандартной форме. Однако два последних ограничения

Линейное программирование задачи с решением

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

найти такие Линейное программирование задачи с решением что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

Таким образом, из примеров настоящего раздела видно, что каждому ограничению прямой задачи соответствует переменная двойственной задачи, а каждой переменной прямой задачи соответствует ограничение двойственной задачи. Если ограничение в прямой задаче задано в виде равенства, то соответствующая переменная двойственной задачи не ограничена знаком (пример 1); если переменная прямой задачи не ограничена знаком, соответствующее двойственное ограничение является равенством (пример 2).

Теоремы двойственности

Теорема 1. Двойственная задача к двойственной есть прямая задача.

С помощью уравнений (7.4) двойственная задача может быть записана (исходя из прямой в стандартной форме) следующим образом: найти такой Линейное программирование задачи с решением, что

Линейное программирование задачи с решением

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

найти такой Линейное программирование задачи с решением, что

Линейное программирование задачи с решением

и функция Линейное программирование задачи с решением имеет максимальное значение. Но она равносильна задаче найти такой Линейное программирование задачи с решением, что

Линейное программирование задачи с решением

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

Теорема 2. Значение функции Линейное программирование задачи с решением, соответствующее любому допустимому решению прямой задачи, не меньше значения функции w, соответствующего допустимому решению двойственной задачи.

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

Линейное программирование задачи с решением

Из уравнения (7.3) Линейное программирование задачи с решением Поскольку Линейное программирование задачи с решением, то

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

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

Теорема 3. Если прямая задача имеет конечное решение Линейное программирование задачи с решением, то двойственная задача имеет конечное решение Линейное программирование задачи с решением. При этом симплекс-множители оптимального решения прямой задачи являются значениями переменных в оптимальном решении двойственной задачи, взятыми с противоположным знаком.

Если в ограничения прямой задачи вводятся новые переменные, прямая задача принимает вид

найти такие

Линейное программирование задачи с решением
Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное значение.

Если

Линейное программирование задачи с решением

симплекс-множители оптимального решения, то после умножения ограничений на

Линейное программирование задачи с решением

и прибавления к выражению для функции Линейное программирование задачи с решением получаем уравнение

Линейное программирование задачи с решением

Далее если уравнение (7.6) — оптимальная каноническая форма для функции Линейное программирование задачи с решением, то все коэффициенты левой части неотрицательны. Следовательно,

Линейное программирование задачи с решением

Эти ограничения равносильны ограничениям

Линейное программирование задачи с решением

так что значения — Линейное программирование задачи с решением удовлетворяют свойственным ограничениям.

Разумеется, в уравнении (7.6) коэффициенты при базисных переменных обратятся в 0; сами базисные переменные также равны 0, так что левая часть равна 0 и

Линейное программирование задачи с решением

Таким образом,

Линейное программирование задачи с решением

Но это — значение функции Линейное программирование задачи с решением, соответствующее допустимому решению ограничений двойственной задачи, задаваемому равенствами Линейное программирование задачи с решением.

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

Линейное программирование задачи с решением

Теорема 4. Если двойственная задача имеет конечное решение Линейное программирование задачи с решением, то прямая задача имеет конечное решение Линейное программирование задачи с решением. Значения симплекс-множителей оптимального решения двойственной задачи являются значениями переменных в оптимальном решении прямой задачи.

Это может быть выведено из теорем 1 и 2; но полезно также получить прямое доказательство в матричных обозначениях, аналогичное доказательству теоремы 3.

Двойственная задача с ограничениями в виде равенства может быть записана как

максимизировать функцию

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

где

Линейное программирование задачи с решением

— вектор новых переменных.

Если

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Далее, поскольку функция Линейное программирование задачи с решением максимизируется (а не минимизируется, как обычно), коэффициенты при Линейное программирование задачи с решением и Линейное программирование задачи с решением в левой части уравнения (7.11) не должны быть положительными, следовательно,

Линейное программирование задачи с решением

что можно записать в виде

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Следствием теорем 3 и 4 является то, что при встрече с задачей линейного программирования мы вольны выбирать, решать ли задачу в том виде, как она поставлена, или решать двойственную задачу. Если применяется улучшенный симплекс-метод (что настоятельно рекомендуется), то будут подучены и- значения переменных, и симплекс-множители. Это позволит определить также симплекс-множители и значения переменных другой задачи. Таким образом можно сильно сэкономить время вычислений. Как было указано в разд. 6.4, объем вычислений в задаче линейного программирования связан скорее с количеством ограничений, чем с количеством переменных.

Значит, если в прямую задачу входят 7 ограничений на 3 переменные, преобразования будут производиться в матрице размерностью 9 X 8 на этапе I и в матрице размерностью 8 X 8 на этапе II. В двойственную задачу входят 3 ограничения на 7 переменных, и она независима от этапа I; преобразования будут производиться в матрице размерностью 4X4. Таким образом, из каждой итерации объем вычислений сокращается по меньшей мере в четыре раза.

В качестве иллюстраций к теоремам 3 и 4 рассмотрим задачу найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное значение. Ее двойственная задача имеет вид найти такие

Линейное программирование задачи с решением

что

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

Решение первой задачи на ЭВМ показывает, что в оптимальном решении

Линейное программирование задачи с решением

(из нижней строки) и Линейное программирование задачи с решением = 47. Таким образом, для другой задачи решением является

Линейное программирование задачи с решением
Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

(знаки целевой функции и симплекс-множителей здесь обращены).

Линейное программирование задачи с решением
Линейное программирование задачи с решением
Линейное программирование задачи с решением

Уместно еще одно замечание. Из уравнения (7.6) видно, что в оптимальном решении прямой задачи

Линейное программирование задачи с решением

Из уравнения (7.11) видно, что в оптимальном решении двойственной задачи

Линейное программирование задачи с решением

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

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

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

Анализ полученных результатов с точки зрения двойственности

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

Алгоритм двойственного симплекс-метода (см. разд. 3.3) был выведен без обращения к двойственности. Однако двойственность позволяет взглянуть на процедуру по-другому. Рассмотрим задачу

найти такие

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет минимальное значение.

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

Линейное программирование задачи с решением
Линейное программирование задачи с решением

Таким образом, в оптимальном решении

Линейное программирование задачи с решением
Линейное программирование задачи с решением

Симплекс-множители (коэффициенты при новых переменных Линейное программирование задачи с решением и Линейное программирование задачи с решением в окончательном виде для функции Линейное программирование задачи с решением) равны

Линейное программирование задачи с решением

Рассмотрим двойственную задачу

найти такие

Линейное программирование задачи с решением

и функция

Линейное программирование задачи с решением

имеет максимальное значение.

При обычном подходе к задаче мы минимизируем функцию

Линейное программирование задачи с решением

Приведем таблицу последовательных вычислений:

Линейное программирование задачи с решением

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

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

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

Линейное программирование задачи с решением

принимает минимальные значения (см. уравнение (4.2)).

Для решения двойственной задачи необходимо найти такие Линейное программирование задачи с решением(знаки которых не определены, поскольку ограничения исходной задачи являются равенствами), что

Линейное программирование задачи с решением

принимает максимальное значение.

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

Дело в том, что умножение в прямой задаче Линейное программирование задачи с решением-й строки и Линейное программирование задачи с решением-го столбца на Линейное программирование задачи с решением и Линейное программирование задачи с решением с последующим прибавлением к выражению для функции Линейное программирование задачи с решением дает соотношение

Линейное программирование задачи с решением

(см. уравнение (4.7) ).

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

Когда для небазисных переменных

Линейное программирование задачи с решением

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

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

Линейное программирование задачи с решением

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

Линейное программирование задачи с решением

Обычно Линейное программирование задачи с решением, но здесь, пренебрегая этим, имеет смысл сформулировать задачу в общем виде. Запишем ограничения (7.18) и (7.19) в виде

Линейное программирование задачи с решением

и определим функцию Лагранжа

Линейное программирование задачи с решением

где Линейное программирование задачи с решением и Линейное программирование задачи с решением — так называемые множители Лагранжа.

Условный минимум, определенный уравнением (7.17), задается безусловным минимумом, определенным уравнением (7.22), необходимые условия которого задаются уравнениями

Линейное программирование задачи с решением

следовательно,

Линейное программирование задачи с решением

Видно, что уравнения (7.24) и (7.25) равносильны уравнениям (7.18) и (7.19). Уравнения (7.26) и (7.27) отражают свойство комплементарности дополнительных переменных. Множители Лагранжа Линейное программирование задачи с решением, эквивалентны симплекс-множителям.

Значения переменных удовлетворяют ограничениям

Линейное программирование задачи с решением

Далее из уравнения (7.22) получаем уравнения

Линейное программирование задачи с решением

Сравните их с уравнением (3.17).

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

Линейное программирование задачи с решением

Сравните с уравнениями (7.7). Таким образом, из уравнения (7.23) имеем

Линейное программирование задачи с решением

следовательно

Линейное программирование задачи с решением

так что значения —Линейное программирование задачи с решением удовлетворяют двойственным ограничениям.

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

Линейное программирование задачи с решением

в силу уравнений (7.27) при Линейное программирование задачи с решением Для этих значений

Линейное программирование задачи с решением

т. e. Линейное программирование задачи с решением в обозначениях прямой и двойственной задач.

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

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

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

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

Задачи линейного программирования были первыми подробно изученными задачами поиска экстремума функций при наличии ограничений типа неравенств. В1820 г. Фурье и затем в 1947 г. Данциг предложили метод направленного перебора смежных вершин в направлении возрастания целевой функции — симплекс-метод, ставший основным при решении задач линейного программирования.

Математическая модель задачи линейного программирования

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

Примеры решения задач по линейному программированию

При этом на переменные Примеры решения задач по линейному программированию наложены линейные ограничения:

Примеры решения задач по линейному программированию

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

Совокупность целевой функции (1.1) и системы ограничений (1.2) называется математической моделью задачи линейного программирования.

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

Возможно эта страница вам будет полезна:

Предмет математическое программирование

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

Задача линейного программирования с двумя переменными. Графическое решение ЗЛП с двумя переменными

Математическая модель ЗЛП с двумя переменными такова

Примеры решения задач по линейному программированию

где

Примеры решения задач по линейному программированию

данные числа.

Введем на плоскости прямоугольную систему координат. Тогда допустимую область задачи (2.1) можно изобразить графически, как множество точек плоскости, координаты которых удовлетворяют сразу всем неравенствам задачи (2.1). Рассмотрим неравенство

Примеры решения задач по линейному программированию

Каждое такое неравенство определяет полуплоскость, лежащую по одну сторону прямой

Примеры решения задач по линейному программированию

Координаты точек другой полуплоскости удовлетворяют противоположному неравенству

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Пример задачи с решением:

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

Целевая функция Примеры решения задач по линейному программированию принимает одно и то же значение Примеры решения задач по линейному программированию во всех точках прямой Примеры решения задач по линейному программированию. Такая прямая называется линией уровня целевой функции.

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

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Пример задачи с решением:

Понятие об анализе на чувствительность

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

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

Пример задачи с решением:

Первая задача анализа на чувствительность

Требуется ответить на такие вопросы:

  • На сколько можно изменить (увеличить или уменьшить) правую часть некоторого ограничения, чтобы оптимальное значение целевой функции не изменилось?
  • На сколько нужно изменить правую часть некоторого ограничения, чтобы улучшить значение целевой функции?

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

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

Если, например, увеличить правую часть ограничения Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию, сделать ее больше нуля, прямая Примеры решения задач по линейному программированию переместится вниз. Но до тех пор, пока точка Примеры решения задач по линейному программированию пересечения прямой Примеры решения задач по линейному программированию с прямой Примеры решения задач по линейному программированию лежит выше точки Примеры решения задач по линейному программированию по-прежнему достигается во всех точках отрезка Примеры решения задач по линейному программированию и равен 1000. В частности, точка Примеры решения задач по линейному программированию (35; 7,5) будет одним из оптимальных решений задачи. Последний раз это произойдет, когда точки Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию сольются. Подставляя в уравнение Примеры решения задач по линейному программированию координаты точки Примеры решения задач по линейному программированию, получаем, что

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Отметим, что неравенство

Примеры решения задач по линейному программированию

можно переписать в виде

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

При перемещении вверх прямой Примеры решения задач по линейному программированию отрезок Примеры решения задач по линейному программированию, в конце концов, стянется в точку Примеры решения задач по линейному программированию (35; 70/3). Уравнение прямой Примеры решения задач по линейному программированию:

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

становятся связывающими оба ограничения:

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Если запас сырья превзойдет величину 490/3 , то ограничение по запасу сырья перестанет влиять на форму допустимой области (уже не будет связывающим) и, значит, на оптимальное решение. Объем запаса сырья не следует увеличивать сверх числа 490/3, это не приведет к росту прибыли.

Вторая задача анализа на чувствительность

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

У нас всего одно связывающее ограничение. Мы показали, что целевую функцию можно увеличить на 1900/3 единицы, если увеличить запасы сырья на 190/3 единицы.

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

В нашем примере ценность единственного ресурса равна

Примеры решения задач по линейному программированию

Другими словами, увеличение на единицу объема ресурса приведет к росту целевой функции на 10 единиц.

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

Третья задача анализа на чувствительность

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

Рассмотрим такую целевую функцию

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Эта прямая проходит через точку (0,0) — начало координат — при любых значениях Примеры решения задач по линейному программированию. Условно «разрешим» параметру Примеры решения задач по линейному программированию принимать также значения Примеры решения задач по линейному программированию. Уравнение (2.2) перепишем в виде

Примеры решения задач по линейному программированию

Коэффициент Примеры решения задач по линейному программированию равен тангенсу угла наклона прямой (2.3) к оси Примеры решения задач по линейному программированию. Изменение величины Примеры решения задач по линейному программированию означает вращение прямой (2.3) относительно начала координат. Когда Примеры решения задач по линейному программированию, прямая (2.3) совпадает с осью Примеры решения задач по линейному программированию; когда Примеры решения задач по линейному программированию, прямая (2.3) совпадает с осью Примеры решения задач по линейному программированию.

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Обратимся к целевой функции

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Когда Примеры решения задач по линейному программированию (единица продукции Примеры решения задач по линейному программированию не приносит прибыли), линия уровня Примеры решения задач по линейному программированию совпадает с осью Примеры решения задач по линейному программированию. Вектор Примеры решения задач по линейному программированию, указывающий направление возрастания целевой функции, имеет координаты (20, 0). Он расположен горизонтально и указывает в сторону положительной полуоси Примеры решения задач по линейному программированию. Максимум целевой функции достигается во всех точках отрезка Примеры решения задач по линейному программированию. Самое естественное оптимальное решение —

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Параллельность прямых означает пропорциональность коэффициентов при переменных в уравнениях этих прямых.

Уравнение прямой Примеры решения задач по линейному программированию

Примеры решения задач по линейному программированию

Уравнение линии уровня

Примеры решения задач по линейному программированию

Отсюда Примеры решения задач по линейному программированию. Итак, когда Примеры решения задач по линейному программированию, максимум Примеры решения задач по линейному программированию достигается во всех точках отрезка Примеры решения задач по линейному программированию и равен 1000.

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

Примеры решения задач по линейному программированию

откуда

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Подведем итоги.

  1. Примеры решения задач по линейному программированию достигается во всех точках отрезка Примеры решения задач по линейному программированию и равен 700.
  2. Примеры решения задач по линейному программированию достигается в вершине Примеры решения задач по линейному программированию (35; 7,5) и равен Примеры решения задач по линейному программированию
  3. Примеры решения задач по линейному программированию Оптимальными являются точки отрезка Примеры решения задач по линейному программированию, Примеры решения задач по линейному программированию
  4. Примеры решения задач по линейному программированию. Оптимальная точка — вершина Примеры решения задач по линейному программированию(150/7; 100/7), Примеры решения задач по линейному программированию
  5. Примеры решения задач по линейному программированию Максимум Примеры решения задач по линейному программированию достигается в вершине Примеры решения задач по линейному программированию.

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

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

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

Рассмотрим ограничение по запасам сырья из нашего примера

Примеры решения задач по линейному программированию

Заменим константу 2 переменной Примеры решения задач по линейному программированию и рассмотрим уравнение прямой

Примеры решения задач по линейному программированию

Будем менять коэффициент Примеры решения задач по линейному программированию от 0 до Примеры решения задач по линейному программированию. Прямая (2.4) проходит через точку (0; 25) при любых значениях коэффициента Примеры решения задач по линейному программированию. Когда Примеры решения задач по линейному программированию меняется от 0 до Примеры решения задач по линейному программированию, прямая (2.4) совершает поворот на 90° из начального горизонтального положения (Примеры решения задач по линейному программированию = 0) в конечное вертикальное Примеры решения задач по линейному программированию. Легко убедиться, что вращение происходит по часовой стрелке (рис. 2. 12).

Когда Примеры решения задач по линейному программированию достигается в точке Примеры решения задач по линейному программированию(35; 70/3): если продукция Примеры решения задач по линейному программированию совсем не требует расхода сырья, ее нужно изготовить как можно больше. Но ограничения не позволяют изготовить более 35 единиц продукции Примеры решения задач по линейному программированию. Оптимальное значение Примеры решения задач по линейному программированию находится из уравнения

Примеры решения задач по линейному программированию

Если

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Значит, вершина Примеры решения задач по линейному программированию является оптимальной, пока значения Примеры решения задач по линейному программированию лежат в интервале (4/21; 2). Координаты вершины Примеры решения задач по линейному программированию:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Как только значение Примеры решения задач по линейному программированию превзойдет 2, оптимальная точка переместится в вершину Примеры решения задач по линейному программированию. Так будет, пока вершина Примеры решения задач по линейному программированию не сольется с вершиной Примеры решения задач по линейному программированию(15,10). При этом коэффициента Примеры решения задач по линейному программированию равен (100-4 * 10)/15 =4.

Итак, если 2 < Примеры решения задач по линейному программированию < 4, максимум Примеры решения задач по линейному программированию достигается в точке Примеры решения задач по линейному программированию. Ее координаты можно найти, решив систему уравнений

Примеры решения задач по линейному программированию

Отсюда

Примеры решения задач по линейному программированию

Когда

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

определяется из условия

Примеры решения задач по линейному программированию

Тогда

Примеры решения задач по линейному программированию

Найдем то значение Примеры решения задач по линейному программированию, при котором допустимая область становится пустой (не хватает сырья для изготовления 15 необходимых изделий Примеры решения задач по линейному программированию). Это случится, когда прямая Примеры решения задач по линейному программированию пройдет через точку Примеры решения задач по линейному программированию. Следовательно,

Примеры решения задач по линейному программированию

Значит, если

Примеры решения задач по линейному программированию

допустимая область пуста, ЗЛП не имеет решения.

Подведем итоги.

  1. Примеры решения задач по линейному программированию Оптимальная вершина — Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию
  2. Примеры решения задач по линейному программированию Оптимальная вершина — Примеры решения задач по линейному программированию. Она лежит на пересечении прямых Примеры решения задач по линейному программированию. Координаты вершины Примеры решения задач по линейному программированию
  3. Примеры решения задач по линейному программированию. Оптимальное решение достигается во всех точках отрезка Примеры решения задач по линейному программированию. Вершина Примеры решения задач по линейному программированию(150/7; 100/7) лежит на пересечении прямых Примеры решения задач по линейному программированию Вершина Примеры решения задач по линейному программированию(35; 7,5) лежит на пересечении прямых Примеры решения задач по линейному программированию.
  4. Примеры решения задач по линейному программированию. Максимум целевой функции достигается в точке Примеры решения задач по линейному программированию с координатами Примеры решения задач по линейному программированию. Точка Примеры решения задач по линейному программированию лежит на пересечении прямых Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию.
  5. Примеры решения задач по линейному программированию. Оптимальная вершина-Примеры решения задач по линейному программированию. Точка Примеры решения задач по линейному программированию лежит на пересечении прямых Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию.
  6. Примеры решения задач по линейному программированию. Допустимая область пуста, задача не имеет решения.

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

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

Примеры решения задач по линейному программированию

Задачу (3.1) — (3.2) можно записать компактней. Обозначим через

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Примеры решения задач по линейному программированию-мерный вектор коэффициентов целевой функции; через

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Тогда задача (3.1) — (3.2) записывается так

Примеры решения задач по линейному программированию

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

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

Чтобы представить задачу (3.1) — (3.2) в канонической форме, нужно уметь:

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

Под выражением «нужно уметь переходить» понимается утверждение о переходе от исходной ЗЛП к ЗЛП, заданной в канонической форме так, чтобы, зная оптимальное решение канонической ЗЛП, указать оптимальное решение исходной.

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

Переход от неравенств к уравнениям. Рассмотрим неравенство

Примеры решения задач по линейному программированию

Пусть вектор

Примеры решения задач по линейному программированию

некоторое решение этого неравенства. Тогда

Примеры решения задач по линейному программированию

Обозначим разность

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

решение уравнения

Примеры решения задач по линейному программированию

Пусть теперь вектор

Примеры решения задач по линейному программированию

есть решение уравнения

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Установлено взаимно однозначное соответствие между всеми решениями неравенства (3.3) и уравнения (3.4). В этом смысле неравенство (3.3) эквивалентно уравнению (3.4).

Так как в целевую функцию Примеры решения задач по линейному программированию переменная Примеры решения задач по линейному программированию не входит, то значения Примеры решения задач по линейному программированию на соответствующих друг другу решениях неравенства (3.3) и уравнения (3.4) совпадают. Другими словами, неравенство

Примеры решения задач по линейному программированию

приводится к уравнению

Примеры решения задач по линейному программированию

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

Аналогично из неравенства

Примеры решения задач по линейному программированию

получается эквивалентное уравнение

Примеры решения задач по линейному программированию

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

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

Как удовлетворить требованию неотрицательности переменных

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

Примеры решения задач по линейному программированию

где

Примеры решения задач по линейному программированию

Система уравнений (3.2) примет вид

Примеры решения задач по линейному программированию

Вместо целевой функции

Примеры решения задач по линейному программированию

рассмотрим целевую функцию

Примеры решения задач по линейному программированию

Любому решению

Примеры решения задач по линейному программированию

системы (3.2) можно поставить в соответствие бесконечно много решений

Примеры решения задач по линейному программированию

системы (3.7), (3.7′), где

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Но для всякого такого решения Примеры решения задач по линейному программированию значение целевой функции (3.8) на нем равно

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

т.е. равно значению целевой функции (3.1) на решении Примеры решения задач по линейному программированию.

Обратно, каждому решению

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

системы (3.7), (3.7′), ставится в соответствие решение

Примеры решения задач по линейному программированию

системы (3.2), где

Примеры решения задач по линейному программированию

причем значения целевых функций (3.1) и (3.8) на этих решениях совпадают.

Поэтому, если

Примеры решения задач по линейному программированию

оптимальное решение задачи (3.7), (3.7′), (3.8), максимизирующее целевую функцию (3.8), то вектор

Примеры решения задач по линейному программированию

оптимальное решение задачи (3.1), (3.2). На векторе Примеры решения задач по линейному программированию целевая функция (3.1) достигает своего максимума.

Пример задачи с решением:

Решение системы линейных уравнений по методу Гаусса (методу исключения неизвестных)

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

Примеры решения задач по линейному программированию

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

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

Используя перечисленные преобразования, систему (3.9) можно привести к виду, для которого описание множества решений системы (3.9) не представляет труда. Для этого в каждом Уравнении нужно оставить переменную, которая исключается из всех остальных уравнений системы. Такая переменная называется базисной переменной данного уравнения. Базисная переменная входит в свое уравнение с коэффициентом 1, во все остальные уравнения эта переменная входит с коэффициентом 0. Любую переменную можно сделать базисной в любом уравнении.

Пример задачи с решением:

Опорные решения

Далее будем считать, что система (3.9) и эквивалентная ей система (3.15) являются системой ограничений некоторой канонической ЗЛП. Поэтому на переменные Примеры решения задач по линейному программированию наложены условия неотрицательности. Свободные переменные системы (3.15) уже не совсем свободны. Они могут принимать только неотрицательные значения и только такие, что вычисленные по формулам (3.16) значения базисных переменных также получаются неотрицательными.

Среди бесконечного множества решений системы (3.15) мы выделим конечный набор решений, каждое из которых называется опорным. Исключительная роль опорных решений (ОР) при поиске оптимального решения ЗЛП будет обоснована позже. А сейчас просто определим, что такое опорное решение.

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

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

Система (3.13) не позволяет получить ОР. Если положить

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Перейдем от системы (3.13) к системе, в которой базисная переменная первого уравнения — Примеры решения задач по линейному программированию. Для чего поделим на -1,4 все коэффициенты первого уравнения и исключим затем Примеры решения задач по линейному программированию из второго уравнения. Получим систему

Примеры решения задач по линейному программированию

ОР таково:

Примеры решения задач по линейному программированию

Коротко это можно записать так:

Примеры решения задач по линейному программированию

Сделаем теперь Примеры решения задач по линейному программированию базисной переменной второго уравнения. Поделим все коэффициенты второго уравнения на 5/7 и затем исключим Примеры решения задач по линейному программированию из первого уравнения. Получим систему

Примеры решения задач по линейному программированию

Соответствующее OP:

Примеры решения задач по линейному программированию

Переход от одного опорного решения к другому

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Вычисления новых коэффициентов удобно свести в таблицу (табл. 3.1). Покажем расчеты на примере. Обратимся к системе (3.18) и заменим во втором уравнении базисную переменную Примеры решения задач по линейному программированию на переменную Примеры решения задач по линейному программированию.

Примеры решения задач по линейному программированию

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

В части I табл. 3.1 записана система (3.18), в части II — преобразованная система. Базисная переменная Примеры решения задач по линейному программированию заменена на переменную Примеры решения задач по линейному программированию.

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

Примеры решения задач по линейному программированию

В части II табл. 3.1 можно заполнить вторую строку.

Пересчитаем элементы первой строки.

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

Примеры решения задач по линейному программированию

Чтобы каждый раз не пользоваться громоздкой формулой, можно обратиться к простому геометрическому правилу пересчета коэффициентов («диагональному» правилу).

Нужно мысленно соединить пересчитываемое число и опорный элемент диагональю прямоугольника, а затем построить вторую диагональ. Так, если соединить число -4/5 Примеры решения задач по линейному программированию с опорным элементом Примеры решения задач по линейному программированию, то на второй диагонали окажутся числа Примеры решения задач по линейному программированию. Чтобы получить новое значение коэффициента Примеры решения задач по линейному программированию, нужно из прежнего значения Примеры решения задач по линейному программированию вычесть произведение чисел, стоящих на второй диагонали, т.е.

Примеры решения задач по линейному программированию

Теперь можно указать новое OP:

Примеры решения задач по линейному программированию

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

Вырожденные и невырожденные опорные решения

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Если считать базисной переменйой первого уравнения переменную Примеры решения задач по линейному программированию, получим OP = (1; 0; 0; 0); если считать, что базисная переменная первого уравнения — это Примеры решения задач по линейному программированию, получается ОР = (0; 0; 1; 0). Оба эти ОР вырожденные, только одна базисная переменная больше нуля. После умножения на -2 второго уравнения и исключения Примеры решения задач по линейному программированию из первого система приводится к виду

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Выражение целевой функции Z через свободные переменные. Оценки свободных переменных

Рассмотрим каноническую ЗИП с системой ограничений, приведенной к стандартному виду.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Числа

Примеры решения задач по линейному программированию

называются оценками свободных переменных

Примеры решения задач по линейному программированию

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

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

Вектор

Примеры решения задач по линейному программированию

это вектор коэффициентов при переменной Примеры решения задач по линейному программированию в системе (3.23).

Число Примеры решения задач по линейному программированию — это скалярное произведение векторов Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию, Примеры решения задач по линейному программированию где вектор

Примеры решения задач по линейному программированию

состоит из правых частей системы (3.22).

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

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

Примеры решения задач по линейному программированию

Выразим целевую функцию Примеры решения задач по линейному программированию через свободные переменные Примеры решения задач по линейному программированию (табл. 3.2).

В первой строке табл. 3.2 над переменными

Примеры решения задач по линейному программированию

записаны соответствующие коэффициенты целевой функции.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Числа

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

Подчеркнем, что формулы

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

можно представить в виде

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Рассмотрим ЗЛП из предыдущего примера. Выразим базисные переменные и целевую функцию через свободные переменные.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Тогда

Примеры решения задач по линейному программированию

На OP Примеры решения задач по линейному программированию = (0,0,0, 4, 6) целевая функция Примеры решения задач по линейному программированию равна -6. Можно ли увеличить значение Примеры решения задач по линейному программированию? Можно, если оставить, например, Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию равными нулю, а переменную Примеры решения задач по линейному программированию сделать больше нуля. Тогда целевая функция возрастет, ведь

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

Целевая функция Примеры решения задач по линейному программированию увеличилась на 16. Новое ОР —Примеры решения задач по линейному программированию = (0,4, О, 0, 18). Теперь базисными переменными стали переменные Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию. В табл. 3.3 показаны соответствующие преобразования.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Можно ли продолжать увеличивать Примеры решения задач по линейному программированию? Оставим переменные Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию равными нулю. От переменной Примеры решения задач по линейному программированию целевая функция и базисные переменные зависят так

Примеры решения задач по линейному программированию

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

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

Теперь можно легко сформулировать общий признак неограниченности целевой функции в допустимой области.

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

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

Примеры решения задач по линейному программированию

Для любой базисной переменной Примеры решения задач по линейному программированию имеем:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Аналогично формулируется признак неограниченности целевой функции снизу.

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

Примеры решения задач по линейному программированию

В этом случае

Примеры решения задач по линейному программированию

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

Попытаемся найти минимум целевой функции Примеры решения задач по линейному программированию Для чего возвратимся к выражениям (3.28), (3.29) и к части I табл. 3.3.

Из (3.28) следует, что Примеры решения задач по линейному программированию можно сделать меньше числа -6, если оставить переменные Примеры решения задач по линейному программированию равными 0, а переменную Примеры решения задач по линейному программированию сделать больше 0. Увеличивать переменную Примеры решения задач по линейному программированию беспредельно нельзя. Если Примеры решения задач по линейному программированию, то базисные переменные выражаются через Примеры решения задач по линейному программированию так:

Примеры решения задач по линейному программированию

поэтому максимально возможное значение Примеры решения задач по линейному программированию= 6, тогда переменная Примеры решения задач по линейному программированию обратится в 0. Это значит, что получено новое ОР —Примеры решения задач по линейному программированию = (0; 0; 6; 16; 0), на котором

Примеры решения задач по линейному программированию

Базисные переменные этого OP—Примеры решения задач по линейному программированию, Примеры решения задач по линейному программированию; свободные переменные — Примеры решения задач по линейному программированию. В табл. 3.4 преобразования выглядят следующим образом:

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Рассмотрим следующую ЗЛП

Примеры решения задач по линейному программированию

Система (3.31) такова, что Примеры решения задач по линейному программированию — базисная переменная первого уравнения, Примеры решения задач по линейному программированию — второго. Соответствующее ОР — вектор Примеры решения задач по линейному программированию = (6; 0; 0; 0; 2), целевая функция на нем равна Примеры решения задач по линейному программированию = -3 * 6 — 2 х 2 = -22.

Выразим целевую функцию и базисные переменные через свободные переменные.

Примеры решения задач по линейному программированию

Тогда

Примеры решения задач по линейному программированию

Можно ли подобрать такое допустимое решение системы (3.31), на котором целевая функция была бы меньше -22? Нельзя! И это сразу видно из (3.32). Когда все свободные переменные равны нулю, Примеры решения задач по линейному программированию = -22. Но стоит хотя бы одной свободной переменной стать больше нуля, как Примеры решения задач по линейному программированию сразу увеличится, в (3.32.) все свободные переменные входят с положительными коэффициентами. Итак, Примеры решения задач по линейному программированию = -22, достигается минимальное значение целевой функции на ОР Примеры решения задач по линейному программированию = (6; 0; 0; 2).

Теперь можно сформулировать достаточный признак достижения целевой функцией минимума на данном ОР.

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

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

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

Соответствующие ОР являются оптимальными.

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

Примеры решения задач по линейному программированию

Переменную Примеры решения задач по линейному программированию можно увеличивать до тех пор, пока обе переменные Примеры решения задач по линейному программированию неотрицательны. Переменная Примеры решения задач по линейному программированию станет равной нулю, когда Примеры решения задач по линейному программированию = 3; переменная Примеры решения задач по линейному программированию станет равной нулю, когда Примеры решения задач по линейному программированию = 2. Значит, Примеры решения задач по линейному программированию не может быть больше 2. При Примеры решения задач по линейному программированию = 2 получается новое ОР: Примеры решения задач по линейному программированию =(2; 2; 0; 0; 0).

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Из уравнения

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Следовательно, та переменная Примеры решения задач по линейному программированию обращается в 0 первой, для которой отношение (3.36) минимально. В только что рассмотренном примере min (6/2; 2/1) = 2, достигался он на отношении, соответствующем базисной переменной Примеры решения задач по линейному программированию (базисной переменной второго уравнения). Поэтому переменная Примеры решения задач по линейному программированию сменила во втором уравнении в качестве базисной переменную Примеры решения задач по линейному программированию.

Базисная переменная заменяется в том уравнении, для которого достигается минимум отношения

Примеры решения задач по линейному программированию

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

Так как

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Очередное ОР:

Примеры решения задач по линейному программированию

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

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

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

Примеры решения задач по линейному программированию

Так как

Примеры решения задач по линейному программированию

то переменная Примеры решения задач по линейному программированию будет только возрастать при увеличении Примеры решения задач по линейному программированию, а переменная Примеры решения задач по линейному программированию будет уменьшаться. Она уменьшится до нуля, когда Примеры решения задач по линейному программированию станет равной 2,4/1 = 2,4. На новом OP Примеры решения задач по линейному программированию = (0; 0; 2,4; 2,8; 0) целевая функция Примеры решения задач по линейному программированию равна -6,8 + 5 х 2,4 = 5,2.

Перейдем к табл. 3.7, где записана стандартная форма системы уравнений при ОР Примеры решения задач по линейному программированию, когда базисными являются переменные Примеры решения задач по линейному программированию (в первом уравнении) и Примеры решения задач по линейному программированию (во втором уравнении).

Примеры решения задач по линейному программированию

Оценки всех свободных переменных положительные,

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Целевую функцию нельзя более увеличить. Оптимальные значения переменных:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Теорема о достижимости оптимального значения целевой функции задачи линейного программирования на опорном решении

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Новое значение переменной Примеры решения задач по линейному программированию равно числу

Примеры решения задач по линейному программированию

а новое значение Примеры решения задач по линейному программированию равно числу

Примеры решения задач по линейному программированию

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

Следовательно, для невырожденного ОР признак оптимальности является не только достаточным, но и необходимым.

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

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

Примеры решения задач по линейному программированию

Для ОР Примеры решения задач по линейному программированию = (0; 0; 0; 1) признак оптимальности не выполняется, так как Примеры решения задач по линейному программированию. Целевую функцию можно было бы увеличить, если можно было бы увеличить переменную Примеры решения задач по линейному программированию. Но как только станет больше 0, переменная Примеры решения задач по линейному программированию станет меньше 0. Поэтому Примеры решения задач по линейному программированию. Если поменять в первом уравнении базисные переменные, заменить Примеры решения задач по линейному программированию переменной Примеры решения задач по линейному программированию то система ограничений и целевая функция примут вид

Примеры решения задач по линейному программированию

Теперь все оценки свободных переменных положительны, поэтому ясно, что на векторе Примеры решения задач по линейному программированию = (0; 4; 0; 2; 2) целевая функция достигает максимума.

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

Пример задачи с решением:

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

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

Шаг 1. Получить исходное ОР данной задачи.

Шаг 2. Проверить, выполняется ли для данного ОР признак оптимальности. Если это так, оптимальное решение получено, конец. В противном случае перейти к шагу 3.

Шаг 3. Проверить, выполняется ли для данного ОР признак неограниченности целевой функции в допустимой области. Если это так, задача не имеет решения. Конец. В противном случае перейти к шагу 4.

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

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

Примеры решения задач по линейному программированию

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

Шаг 6. Перейти к новому ОР, используя формулы (3.20).

Шаг 7. Перейти к шагу 2.

Решение оформляется в так называемых симплекс-таблицах. Построенные ранее табл. 3.1-3.13 являются симплекс-таблицами.

Так как число ОР конечно, через конечное число шагов алгоритм закончит работу либо на шаге 2, либо на шаге 3.

Чтобы описанный алгоритм заработал, нужно научиться получать исходное ОР данной ЗЛП. Если система ограничений приведена к каноническому виду, получение стандартной формы системы уравнений — задача того же порядка сложности, что и нахождение оптимального решения в соответствии с шагами 2-7.

Описанию способа получения исходного ОР посвящен следующий параграф.

Получение исходного ОР. Метод искусственного базиса

Пусть система уравнений ЗЛП приведена к каноническому виду

Примеры решения задач по линейному программированию

Но система ограничений (4.1) не записана в стандартной форме, в уравнениях (4.1) не выделены базисные переменные.

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

Примеры решения задач по линейному программированию

В каждое из уравнений системы (4.1) добавлена искусственная базисная переменная. ЗЛП (4.2) — (4.3′) можно начать решать симплекс-методом. Относительно решения задачи (4.2) — (4.3′) можно сказать следующее.

  1. Целевая функция Примеры решения задач по линейному программированию ограничена снизу числом 0, Примеры решения задач по линейному программированию, ведь по условию Примеры решения задач по линейному программированию. Следовательно, случай Примеры решения задач по линейному программированию невозможен, задача (4.2) — (4.3′) всегда имеет решение.
  2. Если Примеры решения задач по линейному программированию, то система (4.1) не имеет ни одного решения, уравнения (4.1) несовместны: если Примеры решения задач по линейному программированию — допустимое решение системы (4.1), то Примеры решения задач по линейному программированию — допустимое решение системы (4.3). Но Примеры решения задач по линейному программированию, противоречие с предположением Примеры решения задач по линейному программированию.
  3. Если Примеры решения задач по линейному программированию, то все искусственные переменные равны 0. Следовательно, в оптимальном ОР задачи (4.2) — (4.3′) базисными являются переменные системы (4.1). Тогда искусственные переменные можно просто отбросить и перейти к системе (4.1), записанной в стандартной форме.

Описанный метод получения исходного ОР данной системы уравнений называется методом искусственного базиса.

Пример задачи с решением:

Об альтернативных оптимальных решениях задачи линейного программирования

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

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

Примеры решения задач по линейному программированию

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

Пример задачи с решением:

Об анализе на чувствительность

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

Примеры задач с решением:

Основы теории двойственности. Определение пары двойственных задач

Рассмотрим пару задач линейного программирования, связанных между собой симметричными зависимостями. В частности, целевая функция одной задачи максимизируется, другой — минимизируется. Задачу, для которой требуется найти максимум целевой функции, назовем задачей (1), симметричную ей задачу — задачей (2). Условимся все ограничения-неравенства задачи (1) записывать в виде Примеры решения задач по линейному программированию, все ограничения-неравенства задачи (2) — в виде Примеры решения задач по линейному программированию. Целевую функцию задачи (1) обозначим буквой Примеры решения задач по линейному программированию, целевую функцию задачи (2) — буквой Примеры решения задач по линейному программированию.

Задачи (1) и (2) называют парой двойственных задач линейного программирования (или просто двойственной парой), если выполнены следующие соотношения:

  1. В задаче (1) Примеры решения задач по линейному программированию неизвестных и Примеры решения задач по линейному программированию ограничений (без учета условий неотрицательности), в задаче (2) Примеры решения задач по линейному программированию неизвестных и Примеры решения задач по линейному программированию ограничений (без учета условий неотрицательности). Ограничения задачи (1) находятся во взаимно однозначном соответствии с переменными задачи (2). Переменные задачи (1) находятся во взаимно однозначном соответствии с ограничениями задачи (2). Переменные задачи (1) обозначим через Примеры решения задач по линейному программированию; переменные задачи (2) — через Примеры решения задач по линейному программированию.
  2. Матрицы ограничений задач (1) и (2) взаимно транспонированы. Строка коэффициентов системы ограничений задачи (1)— это столбец коэффициентов системы ограничений задачи (2) и наоборот. Если Примеры решения задач по линейному программированию — это коэффициенты при переменной Примеры решения задач по линейному программированию в Примеры решения задач по линейному программированию-ом ограничении задачи (1), Примеры решения задач по линейному программированию, то в задаче (2) коэффициент Примеры решения задач по линейному программированию стоит при переменной Примеры решения задач по линейному программированию в Примеры решения задач по линейному программированию-м ограничении.
  3. Правые части системы ограничений задачи (1) — это коэффициенты целевой функции задачи (2); коэффициенты целевой функции задачи (1) — это правые части системы ограничений задачи (2). Если Примеры решения задач по линейному программированию — правая часть Примеры решения задач по линейному программированию-го ограничения задачи (1), то Примеры решения задач по линейному программированию — коэффициент при Примеры решения задач по линейному программированию в целевой функции задачи (2), Примеры решения задач по линейному программированию. Если Примеры решения задач по линейному программированию — коэффициент при Примеры решения задач по линейному программированию в целевой функции задачи (1), то Примеры решения задач по линейному программированию — правая часть Примеры решения задач по линейному программированию-го ограничения задачи (2 ), Примеры решения задач по линейному программированию.
  4. Каждому ограничению-неравенству задачи (1) соответствует условие неотрицательности ассоциированной с этим ограничением переменной задачи (2). Каждому ограничению-равенству задачи (1) соответствует переменная задачи (2) без ограничений на знак. Наоборот, каждому ограничению-неравенству задачи (2) соответствует неотрицательная переменная задачи (1), каждому ограничению-равенству задачи (2) соответствует переменная задачи (1) произвольного знака.

Задача (1) называется двойственной задаче (2); задача (2) — двойственной задаче (1).

Из определения двойственной пары следует, что отношение двойственности взаимное, задача, двойственная двойственной, совпадает с исходной задачей.

Примеры задач с решением:

Несколько замечаний об умножении матриц

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

Примеры решения задач по линейному программированию

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

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

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

Примеры решения задач по линейному программированию

Произведение матриц транспонируется по правилу

Примеры решения задач по линейному программированию

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

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Несколько замечаний о свойствах скалярного произведения векторов

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

Примеры решения задач по линейному программированию

Примеры решения задач по линейному программированию

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

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

Теоремы двойственности

Теорема 1 (основное неравенство теории двойственности).

Если Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию — произвольные допустимые решения пары двойственных задач (5.3), (5.4), то

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Следствие 1. Если допустимые решения Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию пары двойственных задач (5.3) и (5.4) таковы, что Примеры решения задач по линейному программированию, то Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию — оптимальные решения этих задач.

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

Следствие 2. Если целевая функция Примеры решения задач по линейному программированию задачи (5.3) не ограничена сверху на допустимом множестве задачи (5.3), то у задачи (5.4) нет ни одного допустимого решения. Если целевая функция Примеры решения задач по линейному программированию задачи (5.4) не ограничена снизу на допустимом множестве задачи (5.4), то у задачи (5.3) нет ни одного допустимого решения.

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

Первая теорема двойственности

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

Будем предполагать, что известно оптимальное решение задачи (5.3). Чтобы провести доказательство в другую сторону, нужно привести задачу (5.4) к каноническому виду.

Одновременно с общим доказательством покажем на конкретном примере, как, имея оптимальную симплекс-таблицу для задачи (5.3), получить оптимальное решение задачи (5.4).

Примеры задач с решением:

Вторая теорема двойственности

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Тогда

Примеры решения задач по линейному программированию

В силу допустимости векторов

Примеры решения задач по линейному программированию

можно записать такую цепочкуравенств:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Условия (5.10) называются условиями дополняющей нежесткости.

Другими словами, если переменная Примеры решения задач по линейному программированию задачи (5.3) отлична от нуля, соответствующее ей Примеры решения задач по линейному программированию-e ограничение двойственной задачи обращается в строгое равенство.

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

Примеры задач с решением:

Двойственный симплекс-метод

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

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

Можно предложить симметричный алгоритм, основанный на переборе допустимых решений задачи (5.4). Перебор осуществляется с помощью симплекс-таблиц, в каждой из которых все оценки Примеры решения задач по линейному программированию неотрицательны, Примеры решения задач по линейному программированию (обеспечение допустимости вектора Примеры решения задач по линейному программированию). Но значения переменных Примеры решения задач по линейному программированию хотя и удовлетворяют системе ограничений задачи (5.3) Примеры решения задач по линейному программированию, но не удовлетворяют условию Примеры решения задач по линейному программированию (среди правых частей есть отрицательные). На каждом новом векторе Примеры решения задач по линейному программированию целевая функция Примеры решения задач по линейному программированию. Незадачи (5.4) меньше, чем на предыдущем. Через конечное число шагов находится Примеры решения задач по линейному программированию, что означает одновременное определение Примеры решения задач по линейному программированию и оптимального решения Примеры решения задач по линейному программированию (все правые части симплекс-таблицы становятся неотрицательными). Описанный алгоритм называется двойственным симплекс-методом. Обоснование двойственного симплекс-метода сопроводим решением примера.

Пример задачи с решением:

Двойственность и анализ на чувствительность

Выясним, как, зная оптимальное решение задачи (5.3), получить новое оптимальное решение, если в исходную математическую модель внесены изменения.

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

Примеры решения задач по линейному программированию

Применим метод искусственного базиса (табл. 5.5).

Примеры решения задач по линейному программированию

Оптимальные значения переменных:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Кроме того,

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Контроль:

Примеры решения задач по линейному программированию

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

Изменение значений правых частей системы ограничений

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

Примеры решения задач по линейному программированию

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

Пусть, например, правая часть первого уравнения возросла на единицу, а правая часть второго уменьшилась на единицу, т.е.

Примеры решения задач по линейному программированию

Обе правые части по-прежнему больше 0. Оптимальное решение ЗЛП

Примеры решения задач по линейному программированию

дается вектором

Примеры решения задач по линейному программированию

Изменение коэффициентов целевой функции

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

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

Если в исходную модель включаются новые переменные

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Пусть, например, задача (5.26) изменилась так:

Примеры решения задач по линейному программированию

Здесь

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Включение дополнительных ограничений

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

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

Примеры решения задач по линейному программированию

Уравнение

Примеры решения задач по линейному программированию

примет вид

Примеры решения задач по линейному программированию

Последняя симплекс-таблица станеттакой (табл. 5.6):

Примеры решения задач по линейному программированию

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

Метод потенциалов решения транспортной задачи. Математическая модель транспортной задачи

Математическая модель транспортной задачи (ТЗ) рассматривалась в главе 1. Повторим ее описание.

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

Примеры решения задач по линейному программированию

Всего неизвестных Примеры решения задач по линейному программированию, они называются перевозками. Будем полагать, что числа Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию (Примеры решения задач по линейному программированию) — натуральные. Тогда и оптимальное решение ТЗ можно искать в натуральных числах.

Кроме того, будем рассматривать только закрытые ТЗ, когда сумма всех запасов равна сумме всех потребностей

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Любую открытую

Примеры решения задач по линейному программированию

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

Условие ТЗ удобно записывать в матрице, которая называется матрицей перевозок. В ней Примеры решения задач по линейному программированию + 1 строка и Примеры решения задач по линейному программированию + 1 столбец. В первой строке указаны величины потребностей, в первом столбце — значения запасов. В клетках внутренней матрицы (их Примеры решения задач по линейному программированию штук) записывают стоимости перевозок и сами перевозки. Стоимости перевозок условимся записывать в правом верхнем углу клеток. Нумеровать будем только строки и столбцы внутренней матрицы.

Ниже приведена матрица перевозок закрытой ТЗ с тремя поставщиками и пятью потребителями (табл. 6.1).

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Запишем математическую модель первой из указанных задач. В ней 3×5 = 15 переменных.

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Методы получения исходного допустимого решения ТЗ

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

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

Для рассматриваемой ТЗ получается исходное решение, представленное в табл. 6.3 (нулевые перевозки не пишутся).

Примеры решения задач по линейному программированию

Найдем значение целевой функции.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Целевая функция равна:

Примеры решения задач по линейному программированию

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

Минимальное значение стоимости равно 2, таких стоимостей 3:

Примеры решения задач по линейному программированию

Начнем, например, с перевозки Примеры решения задач по линейному программированию. Максимально возможное значение Примеры решения задач по линейному программированию равно 10. Полагаем Примеры решения задач по линейному программированию = 10 и вычеркиваем первый столбец. Запасы первого поставщика теперь равны 20. Обратимся к перевозке Примеры решения задач по линейному программированию Ее нужно положить равной 20, так как Примеры решения задач по линейному программированию. Теперь вычеркиваются первая строка и пятый столбец. Далее полагаем Примеры решения задач по линейному программированию и вычеркиваем третью строку. Четвертому потребителю требуется доставить еще 10 единиц товара. В матрице остались не-вычеркнутыми вторая, третья, четвертая клетки второй строки. Минимальная стоимость в невычеркнутых клетках равна 4 Примеры решения задач по линейному программированию. Полагаем Примеры решения задач по линейному программированию. Затем полагаем

Примеры решения задач по линейному программированию

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

Задача, двойственная к транспортной задаче. Соотношения двойственности и описание метода потенциалов

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Дадим переменным сквозную нумерацию

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Затем построим математическую модель двойственной задачи.

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Условия неотрицательности на двойственные переменные не накладываются, ведь все ограничения транспортной задачи — это ограничения-равенства.

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Соотношения двойственности и описание метода потенциалов.

Для пары двойственных задач (6.1) — (6.4) и (6.5) — (6.6) условия дополняющей нежесткости формулируются следующим образом.

Допустимые решения Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию двойственной пары (6.1) — (6.4) и (6.5) — (6.6) оптимальны тогда и только тогда, когда справедливы равенства:

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Так как ненулевых перевозок 7:

Примеры решения задач по линейному программированию

то для определения восьми неизвестных потенциалов имеется 7 уравнений:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Проверим на оптимальность решение, полученное по методу минимальной стоимости (табл. 6.6).

Примеры решения задач по линейному программированию

В этой матрице всего 6 ненулевых перевозок. Для определения восьми неизвестных потенциалов имеется всего 6 уравнений.

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Далее находятся потенциалы

Примеры решения задач по линейному программированию

и

Примеры решения задач по линейному программированию

Проверка на соответствие системе ограничений двойственной задачи показывает, что нарушается условие Примеры решения задач по линейному программированию так как 0 +4 > 3 (см. табл. 6.6). И это решение не оптимально.

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

Циклы в матрице

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

Примеры решения задач по линейному программированию

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

Свойства циклов.

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

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

База индукции. Если

Примеры решения задач по линейному программированию

цикл очевиден.

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

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

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

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

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

Примеры решения задач по линейному программированию

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

а) Этот цикл единственен.

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

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

Из единственности цикла следует утверждение б).

Примеры решения задач по линейному программированию

Выберем произвольную вершину цикла и отметим ее знаком «+». Перейдем по строке (столбцу) в смежную вершину и отметим ее знаком «-». Обходя последовательно вершины цикла, припишем им поочередно знаки «+» и «-», пока не пометим все вершины (рис. 6.4). Число вершин в цикле четно, противоречия при расстановке знаков не случится. Любая пара смежных вершин окажется помеченной разными знаками, поэтому в любой строке (столбце) матрицы число вершин цикла, которым приписан знак «+», равно числу вершин цикла, которым приписан знак «-». Цикл, вершины которого помечены описанным способом, называется означенным циклом.

Примеры решения задач по линейному программированию

Циклы в матрице перевозок транспортной задачи.

Рассмотрим матрицу перевозок транспортной задачи, в которой стоит допустимое решение ТЗ, состоящее из т + п — 1 перевозок. Некоторые из перевозок могут быть нулевыми. Клетки матрицы перевозок с явно указанными перевозками назовем занятыми, остальные клетки — свободными.

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

Действительно, в силу указанного в параграфе 6.2 свойства таких решений, в матрице перевозок существует строка (столбец), в которой (котором) лежит только одна занятая клетка. В такой строке (столбце) нельзя поместить вершину цикла. После вычеркивания этой строки (столбца) в матрице вновь появляется строка (столбец) с единственной перевозкой. И в этой строке (столбце) не может лежать вершина цикла. В результате окажутся вычеркнутыми все строки и столбцы матрицы, места для цикла нет. Цикл пересчета. Циклом пересчета называется означенный цикл, построенный в матрице перевозок ТЗ. Все вершины цикла, кроме одной, лежат в занятых клетках, и только одна вершина, причем помеченная знаком «+», лежит в свободной клетке. Пример цикла пересчета показан в табл. 6.7. Свободная клетка — (1,5).

Примеры решения задач по линейному программированию

Сдвигом по циклу пересчета на число Примеры решения задач по линейному программированию называется следующая операция. Ко всем перевозкам, стоящим в клетках, содержащих вершины цикла со знаком «+», прибавляется число Примеры решения задач по линейному программированию. Из всех перевозок, стоящих в клетках, содержащих вершины цикла со знаком «-», вычитается число Примеры решения задач по линейному программированию. Значит, чтобы перевозки остались неотрицательными, число Примеры решения задач по линейному программированию не должно превышать минимальной из перевозок, отмеченных знаком «-».

После сдвига по приведенному в табл. 6.7 циклу пересчета на число 10 получится матрица перевозок, приведенная в табл. 6.8.

Сдвиг по циклу переводит допустимое решение ТЗ в другое допустимое решение. Это вытекает из свойства 5 циклов (см. выше): в каждой строке (столбце) матрицы лежит одинаковое число вершин цикла пересчета, отмеченное знаками «+» и «-», сумма перевозок, стоящих в каждой строке (столбце), не меняется после сдвига по циклу. Это и означает допустимость нового решения (сумма перевозок в Примеры решения задач по линейному программированию-й строке равна запасам Примеры решения задач по линейному программированию-го поставщика; сумма перевозок в Примеры решения задач по линейному программированию-м столбце равна потребности Примеры решения задач по линейному программированию-го потребителя, Примеры решения задач по линейному программированию).

Примеры решения задач по линейному программированию

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

Для решения из табл. 6.7 максимальная величина сдвига равна Примеры решения задач по линейному программированию, сразу две перевозки обратятся в 0. Чтобы число занятых клеток по-прежнему было равно 7, проставим явно нулевую перевозку в одной из освободившихся клеток. Пусть это будет клетка с меньшей стоимостью Примеры решения задач по линейному программированию. Результаты сдвига показаны в табл. 6.9.

Примеры решения задач по линейному программированию

Новое значение целевой функции равно

Примеры решения задач по линейному программированию

Целевая функция уменьшилась на 200 единиц.

Из свойства 4 циклов (параграф 6.4) следует, что если в матрице перевозок стоит такое допустимое решение ТЗ, что нельзя построить цикл, все вершины которого лежат в занятых клетках, после сдвига по циклу пересчета цикл, все вершины которого лежат в занятых клетках, вновь не строится.

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

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

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

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Таким образом, если клетка Примеры решения задач по линейному программированию — потенциальная, Примеры решения задач по линейному программированию целевая функция Примеры решения задач по линейному программированию уменьшится в результате сдвига по циклу. Докажем формулу (6.9).

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

Примеры решения задач по линейному программированию

Изменение целевой функции Примеры решения задач по линейному программированию после сдвига по циклу равно

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

Подставляя формулы (6.11) в (6.10), получим

Примеры решения задач по линейному программированию

В рассмотренном примере клетка (1, 5) была потенциальной:

Примеры решения задач по линейному программированию

Величина сдвига

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Проверим на оптимальность вновь полученное решение (табл. 6.10).

Примеры решения задач по линейному программированию

Положим Примеры решения задач по линейному программированию, тогда

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

В матрице имеется единственная потенциальная клетка — (2, 5), так как

Примеры решения задач по линейному программированию

Построим для нее цикл пересчета. Так случилось, что в одной из вершин, помеченных знаком «-», стоит нулевая перевозка. Сдвиг можно произвести только на величину Примеры решения задач по линейному программированию = 0. Изменения целевой функции не будет,

Примеры решения задач по линейному программированию

Но после сдвига нулевая перевозка переместится во вторую строку (табл. 6.11). Проверим на оптимальность новое решение.

Примеры решения задач по линейному программированию

Если

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Клетка (1, 3) — потенциальная,

Примеры решения задач по линейному программированию

Построим для потенциальной клетки цикл пересчета. Можно произвести сдвиг по циклу на величину Примеры решения задач по линейному программированию = 20. Оставим нулевую перевозку в клетке (1,5) Примеры решения задач по линейному программированию, клетка (2,3) станет свободной (табл. 6.12). Новое значение целевой функции равно 470, она уменьшилась на 20 единиц, Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию

Примеры решения задач по линейному программированию

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

Оптимальные значения переменных:

Примеры решения задач по линейному программированию

Описание метода потенциалов

Чтобы решить ТЗ методом потенциалов, нужно выполнить следующие действия.

  1. Определить исходное допустимое решение ТЗ по методу северо-западного угла или минимальной стоимости. В этом решении должны быть заданы Примеры решения задач по линейному программированию перевозок, некоторые из них могут равняться 0.
  2. В соответствии с условиями дополняющей нежесткости рассчитать значения Примеры решения задач по линейному программированию потенциалов Примеры решения задач по линейному программированию правилу Примеры решения задач по линейному программированию, если клетка Примеры решения задач по линейному программированию занята перевозкой.
  3. Проверить, удовлетворяют ли найденные значения потенциалов системе ограничений задачи, двойственной к транспортной: Примеры решения задач по линейному программированию. Если это так, то вектор Примеры решения задач по линейному программированию и вектор Примеры решения задач по линейному программированию — оптимальные решения соответственно ТЗ и двойственной задачи. В противном случае перейти к шагу 4.
  4. Выбрать любую потенциальную клетку Примеры решения задач по линейному программированию (такую клетку, что для нее Примеры решения задач по линейному программированию) и построить для выбранной клетки цикл пересчета. Произвести сдвиг по циклу на величину Примеры решения задач по линейному программированию, где Примеры решения задач по линейному программированию — перевозки, стоящие в вершинах цикла, отмеченных знаком «-».

После сдвига по циклу значение целевой функции ТЗ уменьшится на величину Примеры решения задач по линейному программированию. Перейти к шагу 2.

Еще один пример (блокирование перевозок)

Решим такую транспортную задачу (табл. 6.13.) при дополнительном условии, что все запасы третьего поставщика должны быть полностью вывезены.

Примеры решения задач по линейному программированию

Эта задача открыта,

Примеры решения задач по линейному программированию

Нужно добавить еще одного потребителя с потребностью

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Найдем исходное допустимое решение по методу минимальной стоимости и проверим его на оптимальность (табл. 6.15).

Целевая функция равна

Примеры решения задач по линейному программированию

После расчета потенциалов выясняется, что в матрице имеется одна потенциальная клетка — (2, 5), так как

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Построим для этой клетки цикл пересчета. Величина сдвига

Примеры решения задач по линейному программированию

Проверим на оптимальность новое решение (табл. 6.16).

Примеры решения задач по линейному программированию

Потенциальных клеток больше нет,

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Оптимальные значения перевозок:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Неиспользованными остались 10 единиц запасов первого поставщика и 30 единиц запасов второго. Оптимальные значения переменных двойственной задачи:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Паросочетания. Определения и примеры

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

В частном случае, когда вес всех ребер равен единице, ЗМП сводится к задаче о наибольшем паросочетании (ЗНПС). Далее мы рассмотрим частный случай ЗМП — задачу о назначениях (ЗН), которая часто встречается в приложениях, а также транспортную задачу (ТЗ), которая является обобщением ЗН.

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

— чередующаяся.

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Основная теорема о наибольших паросочетаниях

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

Необходимость следует из определения увеличивающей цепи.

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

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

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

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

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

Рассмотрим в качестве примера граф, изображенный на рис. 7.2. В этом графе выделено паросочетание

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Ребра увеличивающей цепи

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

изображенное на рис. 7.4.

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

Наибольшее паросочетание в двудольном графе

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Условия (7.2) и (7.3) означают, что никакие два выбранных ребра не могут иметь общих вершин. Запишем задачу, двойственную задаче (7.1) — (7.3). Обозначим через Примеры решения задач по линейному программированию двойственные переменные, соответствующие условиям (7.2), через Примеры решения задач по линейному программированию — двойственные переменные, соответствующие условиям (7.3), через Примеры решения задач по линейному программированию — двойственные переменные, соответствующие условиям (7.3′) Примеры решения задач по линейному программированию. Тогда двойственная задача есть задача минимизации суммы

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Обозначим через Примеры решения задач по линейному программированию переменную, равную нулю, если вершина Примеры решения задач по линейному программированию не вошла в Примеры решения задач по линейному программированию-разделяющее множество, и равную единице в противном случае, Примеры решения задач по линейному программированию. Для вершин множества Примеры решения задач по линейному программированию введем обозначение Примеры решения задач по линейному программированию. Кроме того, вводятся переменные Примеры решения задач по линейному программированию, чтобы в задаче 1) — (7.3′) было Примеры решения задач по линейному программированию переменных, Примеры решения задач по линейному программированию равна 0, если Примеры решения задач по линейному программированию (в графе есть ребро Примеры решения задач по линейному программированию),и равна 1,если Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию (ребро (V., fr) в графе отсутствует). Тогда задача (7.4)—(7.6) и будет математической моделью задачи отыскания в двудольном графе минимального Примеры решения задач по линейному программированию-разделяющего множества вершин.

Среди оптимальных решений задач (7.1) — (7.3) и (7.4) — (7.6) всегда есть целочисленные, ведь в любом графе, безусловно, существуют и минимальное Примеры решения задач по линейному программированию-разделяющее множество вершин, и наибольшее паросочетание, поэтому можно воспользоваться первой теоремой двойственности, не обращая внимания на условия целочисленности переменных

Примеры решения задач по линейному программированию

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

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

Алгоритм отыскания увеличивающей цепи для паросочетания в двудольном графе

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

Примеры решения задач по линейному программированию

и стоит 0, если такого ребра нет. Подобные матрицы называются (0,1 )-матрицами. Строки и столбцы матрицы назовем общим термином «ряд». Клетки с единицами назовем допустимыми, с нулями — недопустимыми. Множество рядов покрывает допустимые клетки данной таблицы, если каждая допустимая клетка содержится хотя бы в одном ряду из этого множества. Совокупность допустимых клеток назовем независимой, если никакие две клетки не лежат в одном ряду.

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

В этих определениях теорема Кенига — Эгервари принимает вид: максимальное число независимых допустимых клеток равно минимальному числу рядов, покрывающих все допустимые клетки.

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

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

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

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

Шаг 4. Повторять шаги 2, 3 до тех пор, пока

а) либо будет помечен столбец, не содержащий кружка;

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

В случае б) ни одной увеличивающей цепи для паросочетания построить нельзя, оно — наибольшее. В случае а) перейти к шагу 5.

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

Пример задачи с решением:

Задача об оптимальных назначениях

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

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

Примеры решения задач по линейному программированию

при условиях

Примеры решения задач по линейному программированию

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

Часто ЗН формулируется как задача минимизации, если Примеры решения задач по линейному программированию — не доход, а затраты на выполнение Примеры решения задач по линейному программированию-м исполнителем Примеры решения задач по линейному программированию-й работы. Так как целевая функция транспортной задачи, обобщающей ЗН, минимизируется, в дальнейшем и для целевой функции ЗН будем искать минимум. А переход от задачи минимизации к задаче отыскания максимума целевой функции осуществляется просто. Пусть

Примеры решения задач по линейному программированию

Положим,

Примеры решения задач по линейному программированию

Тогда задача минимизации выражения и задача максимизации функции

Примеры решения задач по линейному программированию

эквивалентны.

Если в ЗН число работ не равно числу исполнителей, достаточно ввести соответствующее дополнительное число работ (исполнителей) с одинаковыми затратами, равными нулю.

Далее будем считать, что матрица затрат квадратная.

Запишем задачу, двойственную к ЗН. Обозначим через Примеры решения задач по линейному программированию двойственные переменные, соответствующие ограничениям (7.8) Примеры решения задач по линейному программированию; через Примеры решения задач по линейному программированию — двойственные переменные, соответствующие ограничениям (7.9) Примеры решения задач по линейному программированию.

Двойственная задача такова: максимизировать

Примеры решения задач по линейному программированию

при условиях

Примеры решения задач по линейному программированию

По второй теореме двойственности допустимые решения Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию, задач (7.7)—(7.9′) и (7.10)— (7.11)оптимальны тогда и только тогда, когда

Примеры решения задач по линейному программированию

(Условия дополняющей нежесткости).

Предположим, что найдено некоторое допустимое решение Примеры решения задач по линейному программированию задачи (7.10) — (7.11).

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

а) в паросочетание вошли Примеры решения задач по линейному программированию ребер;

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

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

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

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

Примеры решения задач по линейному программированию

Чтобы доказать допустимость нового решения, достаточно показать, что

Примеры решения задач по линейному программированию

если строка Примеры решения задач по линейному программированию помечена, а столбец Примеры решения задач по линейному программированию не помечен. Но это следует из способа выбора Примеры решения задач по линейному программированию. При этом на новом решении целевая функция двойственной задачи увеличилась. Действительно, пусть число ребер в наибольшем паросочетании равно Примеры решения задач по линейному программированию; число непомеченных строк равно Примеры решения задач по линейному программированию, число помеченных столбцов равно Примеры решения задач по линейному программированию. Тогда Примеры решения задач по линейному программированию. Целевая функция двойственной задачи на новом решении равна:

Примеры решения задач по линейному программированию

Теперь можно снова найти в матрице затрат те клетки, для которых

Примеры решения задач по линейному программированию

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

Формальное описание алгоритма.

Шаг 1. Найти допустимое решение двойственной задачи, положив

Примеры решения задач по линейному программированию

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

Шаг 2. Положить

Примеры решения задач по линейному программированию

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

а) в паросочетание вошли Примеры решения задач по линейному программированию ребер;

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

В случае а) перейти к шагу 6, в случае б) — к шагу 4.

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

Шаг 5. Пересчитать значения двойственных переменных по правилу

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Перейти к шагу 2.

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

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

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

Пример задачи с решением:

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

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

Потоки в сетях

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

Примеры решения задач по линейному программированию

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

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

Условие (8.1) называют уравнением сохранения потока. Оно означает, что суммарный поток, втекающий во всякую вершину, отличную от источника и стока, равен суммарному потоку, вытекающему из этой вершины.

Условие (8.2) означает, что поток на каждой дуге ограничен ее пропускной способностью.

Пример транспортной сети с заданными потоками на дугах показан на рис. 8.1. Числа над дугами означают пропускные способности, числа в скобках — потоки.

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

и ненасыщенной — в противном случае. На рис. 8.1 насыщенными являются дуги

Примеры решения задач по линейному программированию

Остальные дуги — ненасыщенные.

Из условия сохранения потока (8.1) следует, что суммарный поток, вытекающий из источника, равен суммарному потоку, втекающему в сток.

Примеры решения задач по линейному программированию

Для доказательства формулы (8.3) достаточно просуммировать потоки на дугах транспортной сети двумя способами. Первый раз надо суммировать потоки на дугах, считая, что каждая дуга выходит из некоторой вершины. Второй раз нужно вычислить ту же сумму, полагая, что каждая дуга входит в некоторую вершину. Затем применить (8.1).

Число Примеры решения задач по линейному программированию называется величиной потока или просто потоком в транспортной сети. На рис. 8.1 показана транспортная сеть с потоком величины Примеры решения задач по линейному программированию = 5 + 3= 6 + 2=8.

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

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

Разрезы

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

Примеры решения задач по линейному программированию

так, чтобы

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

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

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

Для данной сети можно построить 8 разрезов. Назовем некоторые из них.

Пусть

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

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

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

Величина максимального потока не превышает

Примеры решения задач по линейному программированию

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

Теорема Форда — Фалкерсона о максимальном потоке и минимальном разрезе

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

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

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

1) все дуги цепи, которые проходятся в направлении их ориентации (прямые дуги), не насыщены;

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

На рис. 8.4 приведен пример такой цепи для сети на рис. 8.3.

Примеры решения задач по линейному программированию

В рассматриваемой цепи можно переслать дополнительный поток из источника в сток. Действительно, положим

Примеры решения задач по линейному программированию

где минимум берется по всем прямым дугам цепи;

Примеры решения задач по линейному программированию

где минимум берется по всем обратным дугам цепи;

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

Рис. 8.4. Пример потока, который можно увеличить

Докажем теорему Форда — Фалкерсона. Пусть в сети задан максимальный поток, величина которого равна Примеры решения задач по линейному программированию. Определим разрез Примеры решения задач по линейному программированию, указав вершины множества Примеры решения задач по линейному программированию. Положим Примеры решения задач по линейному программированию.

Если

Примеры решения задач по линейному программированию

Если

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Имеем:

Примеры решения задач по линейному программированию

Обозначим через Примеры решения задач по линейному программированию переменные двойственной задачи, соответствующие ограничениям (8.11). Переменные, соответствующие ограничениям (8.12), обозначим

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Математическая модель двойственной задачи такова:

Примеры решения задач по линейному программированию

Положим

Примеры решения задач по линейному программированию

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

Положим

Примеры решения задач по линейному программированию

Покажем, что построено допустимое решение задач (8.14) — (8.18).

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

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

Примеры решения задач по линейному программированию

Осталось показать, что выполнены условия дополняющей нежесткости.

Пусть

Примеры решения задач по линейному программированию

Разберем 4 случая.

Вершина Примеры решения задач по линейному программированию помечена, вершина Примеры решения задач по линейному программированию помечена. Тогда

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Вершина Примеры решения задач по линейному программированию помечена, вершина Примеры решения задач по линейному программированию не помечена. Тогда

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Вершина Примеры решения задач по линейному программированию не помечена, вершина Примеры решения задач по линейному программированию не помечена. Тогда

Примеры решения задач по линейному программированию

Пусть

Примеры решения задач по линейному программированию

Источник помечен, возможны два случая.

Вершина Примеры решения задач по линейному программированию помечена, тогда

Примеры решения задач по линейному программированию

Вершина Примеры решения задач по линейному программированию не помечена, тогда

Примеры решения задач по линейному программированию

Пусть

Примеры решения задач по линейному программированию

Сток не помечен, возможны два случая.

Вершина Примеры решения задач по линейному программированию помечена, тогда

Примеры решения задач по линейному программированию

Вершина Примеры решения задач по линейному программированию не помечена, тогда

Примеры решения задач по линейному программированию

Итак,

Примеры решения задач по линейному программированию

Теорема доказана.

Алгоритм Форда — Фалкерсона решения задачи о максимальном потоке (метод расстановки пометок)

Алгоритм Форда — Фалкерсона решения задачи о максимальном потоке следует непосредственно из доказательства теоремы Форда — Фалкерсона. В нем осуществляется систематический поиск увеличивающих цепей из источника в сток по правилу (8.9). Как только не удается найти увеличивающую цепь, алгоритм прекращает работу: в сети построен максимальный поток.

Формальное описание алгоритма.

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

Шаг 2. Выбрать любую помеченную вершину Примеры решения задач по линейному программированию (первоначально это единственная вершина Примеры решения задач по линейному программированию). Рассмотреть все непомеченные вершины Примеры решения задач по линейному программированию, связанные дугами с вершиной Примеры решения задач по линейному программированию. Тем вершинам Примеры решения задач по линейному программированию, для которых Примеры решения задач по линейному программированию, приписать метку Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию, где Примеры решения задач по линейному программированию. Тем вершинам Примеры решения задач по линейному программированию, для которых Примеры решения задач по линейному программированию, приписать метку Примеры решения задач по линейному программированию, где Примеры решения задач по линейному программированиюПримеры решения задач по линейному программированию.

Шаг 3. Повторять шаг 2 до тех пор, пока:

а) или окажется помеченной вершина Примеры решения задач по линейному программированию;

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

В случае а) перейти к шагу 4, а в случае б) — к шагу 6.

Шаг 4. Найдена увеличивающая цепь, по которой из источника в сток можно переслать дополнительные единицы потока.

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

Шаг 5. Стереть все пометки, кроме метки источника, и возвратиться к шагу 2.

Шаг 6. В транспортной сети построен максимальный поток. Множество дуг, ведущих из помеченных вершин в непомеченные, образует минимальный разрез. Конец.

Пример задачи с решением:

Алгоритм Форда — Фалкерсона для транспортной сети, имеющей вид двудольного графа

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

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

Пример транспортной сети дан на рис. 8.11. Соответствующая ей таблица — табл. 8.1.

Примеры решения задач по линейному программированию

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

Шаг 1. Пометить каждую строку Примеры решения задач по линейному программированию, для которой разность Примеры решения задач по линейному программированию больше 0, Меткой Примеры решения задач по линейному программированию, где Примеры решения задач по линейному программированию. Если ни одной такой метки приписать нельзя, данный поток — максимальный. Конец.

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

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

Шаг 4. Повторять шаги 2 и 3 до тех пор, пока

а) не будет помечен столбец Примеры решения задач по линейному программированию с разностью Примеры решения задач по линейному программированию0 или

б) новых пометок приписать нельзя и для всех помеченных столбцов

Примеры решения задач по линейному программированию

В случае а) перейти к шагу 5, в случае б) — к шагу 6.

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

Примеры решения задач по линейному программированию

Стереть все пометки и возвратиться к шагу 1.

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

Найдем максимальный поток для транспортной сети, показанной на рис. 8Л1 (табл. 8.2).

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

Шаг 2. Метим второй столбец меткой Примеры решения задач по линейному программированию.

Шаг 3. От второго столбца помечаются строки 2 и 3. Метка второй строки:

Примеры решения задач по линейному программированию

Метка третьей строки:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Шаг 2. От второй строки можно пометить первый столбец меткой

Примеры решения задач по линейному программированию

Но поток на дуге Примеры решения задач по линейному программированию равен 2, а ее пропускная способность равна 3, следовательно, найдена увеличивающая цепь (рис. 8.12), вдоль которой можно увеличить поток на 1. Определим вершины этой цепи. Сток метится от первого столбца. Первый столбец помечен от первой строки, вторая строка помечена от второго столбца, второй столбец помечен от первой строки, первая строка помечена от источника (см. табл. 8.2).

Отметим знаком «+» потоки на прямых дугах и знаком «-» потоки на обратных дугах найденной увеличивающей цепи. Прибавим к потокам, отмеченным знаком «+», и вычтем из потоков, отмеченных знаком «-», единицу (см. рис. 8.12). Величина потока в транспортной сети увеличится на 1.

Попытаемся Ьнова увеличить поток (табл. 8.3).

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

В дальнейшем мы будем: решать подобные задачу для более простого случая, когда пропускные способности дуг двудольного графа так велики, что их можно положить равными Примеры решения задач по линейному программированию. Тогда вместо символа Примеры решения задач по линейному программированию в правом верхнем углу допустимой клетки будем писать знак «х» — признак допустимости. Шаг 2 упростится и будет таким:

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

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

Примеры решения задач по линейному программированию

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

Напомним математическую модель задачи, двойственной транспортной.

Максимизировать целевую функцию

Примеры решения задач по линейному программированию

при условиях

Примеры решения задач по линейному программированию

Воспользуемся условиями дополняющей нежесткости. Допустимые решения

Примеры решения задач по линейному программированию

ТЗ и двойственной ей задачи оптимальны тогда и только тогда, когда справедливы равенства

Примеры решения задач по линейному программированию

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

Пусть найдено допустимое решение

Примеры решения задач по линейному программированию

задач (8.21) — (8.22). Выделим в матрицу затрат те клетки (Примеры решения задач по линейному программированию), для которых

Примеры решения задач по линейному программированию

Будем считать эти клетки допустимыми, построим соответствующую транспортную сеть (рис. 8.14) и решим для этой сети задачу о максимальном потоке.

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

Примеры решения задач по линейному программированию

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

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

б) не все запасы вывезены (соответственно не все потребности удовлетворены).

Тогда, как следует из (8.19),

Примеры решения задач по линейному программированию

Отсюда

Примеры решения задач по линейному программированию

В этом случае решение Примеры решения задач по линейному программированию задачи (8.21) — (8.22) можно улучшить так же, как при решении ЗН.

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

Пересчитаем значения двойственных переменных по правилу:

Примеры решения задач по линейному программированию

Допустимость нового решения очевидна. Вычислим значение целевой функции на нем:

Примеры решения задач по линейному программированию

Итак, на новом решении

Примеры решения задач по линейному программированию

целевая функция двойственной задачи увеличилась.

Снова найдем в матрице стоимостей те клетки, для которых

Примеры решения задач по линейному программированию

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

Формальное описание алгоритма

Шаг 1. Найти исходное допустимое решение двойственной задачи, положив

Примеры решения задач по линейному программированию

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

Шаг 2. Положить

Примеры решения задач по линейному программированию

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

а) все потребности удовлетворены;

б) не все потребности удовлетворены.

В случае а) перейти к шагу 6, в случае б) — к шагу 4.

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

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

Шаг 6. Положить Примеры решения задач по линейному программированию, если дуги Примеры решения задач по линейному программированию нет в транспортной сети или поток на ней равен 0. В противном случае положить Примеры решения задач по линейному программированию. Оптимальные значения перевозок найдены. Конец.

Для удобства вычислений шаг 5 формулируется по-другому.

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

Решим ТЗ, заданную в табл. 8.4.

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Шаг 1. Определяем допустимое решение двойственной задачи.

Примеры решения задач по линейному программированию

Исходное значение целевой функции двойственной задачи таково:

Примеры решения задач по линейному программированию

Шаг 2. Вычисляем

Примеры решения задач по линейному программированию

Результаты расчетов приведены в табл. 8.5.

Примеры решения задач по линейному программированию

Шаг 3. Решим задачу о максимальном потоке, считая допустимыми клетки с нулями. Ход решения отражен в табл. 8.6.

Для сокращения числа итераций начальный поток взят ненулевым. Не вывезены запасы 4-го и 5-го поставщиков. У первого поставщика осталось 40, у второго — 30 единиц продукта. Метим четвертую и пятую строки соответственно метками Примеры решения задач по линейному программированию и Примеры решения задач по линейному программированию. От четвертой строки по допустимым клеткам метятся 1, 4, 5-й столбцы меткой Примеры решения задач по линейному программированию. От пятой строки метится по допустимой клетке 6-й столбец меткой Примеры решения задач по линейному программированию.

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

Примеры решения задач по линейному программированию

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

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

От 5-го и 6-го столбцов нельзя пометить ни одной строки. От помеченной первой строки метятся 2-й и 3-й столбцы меткой (1+, 40). Но третий потребитель недополучил 70 единиц товара. Найдена увеличивающая цепь. Восстановим ее (рис. 8.15).

Третий столбец по прямой дуге помечен от первой строки; 1-я строка по обратной дуге помечена от 1-го столбца; 1-й столбец по прямой дуге помечен от 4-й строки; 4-я строка помечена от источника. Сток метится от 3-го столбца меткой (3\ min(40, 80 — 10))=(3+, 40). В табл. 8.6 прямые дуги цепи отмечены знаком «+», обратные — знаком «-».

Увеличиваем поток на прямых дугах на 40 единиц и уменьшаем поток на обратной дуге на 40 единиц (табл. 8.7).

Примеры решения задач по линейному программированию

Пытаемся снова увеличить поток. Пятая строка получает метку Примеры решения задач по линейному программированию, от нее 6-й столбец получает метку Примеры решения задач по линейному программированию. Больше ничего отметить нельзя. Для данной транспортной сети найден максимальный поток, но не все запасы 5-го поставщика вывезены (соответственно 3-й потребитель недополучил 30 единиц груза). Можно улучшить решение двойственной задачи.

Шаг 4. Перечеркиваем в матрице стоимостей Примеры решения задач по линейному программированию (см. табл. 8.5) непомеченные 1-ю, 2-ю, 3-ю, 4-ю строки и помеченный 6-й столбец. Минимальный элемент в оставшейся части таблицы равен 1.

Прибавим единицу к дважды прочеркнутым элементам и вычтем единицу из непрочеркнутых элементов (табл. 8.8).

Примеры решения задач по линейному программированию

Вычислим изменение целевой функции двойственной задачи.

Примеры решения задач по линейному программированию

На новом допустимом решении двойственной задачи значение целевой функции равно 1140 + 30 = 1170.

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

Снова переходим к шагу 2 (табл. 8.9). Мы начинаем с потока, который был построен как максимальный на предыдущей итерации.

Примеры решения задач по линейному программированию

Пятая строка получает метку Примеры решения задач по линейному программированию. От нее меткой Примеры решения задач по линейному программированию метятся 1,2,6-й столбцы. От 2-го столбца меткой Примеры решения задач по линейному программированию метится первая строка. От 1-й строки можно пометить меткой Примеры решения задач по линейному программированию 3-й столбец, от которого меткой Примеры решения задач по линейному программированию метится сток. На самом деле меток можно поставить больше, все они указаны в табл. 8.9, но мы показали только, как метятся вершины увеличивающей цепи, по которой можно увеличить поток на 30 единиц. Прямые дуги этой цепи: (s, 5 стр.), (5 стр., 2 столб.), (1 стр., 3 столб.), (3 столб., t). Обратная дуга одна — (1 стр., 2 столб.). Увеличиваем поток на прямых дугах и уменьшаем поток на обратной дуге на 30 единиц (табл. 8.10).

Все запасы вывезены, все потребности удовлетворены. Оптимальные перевозки следующие:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

Остальные перевозки равны нулю.

Оптимальное решение двойственной задачи:

Примеры решения задач по линейному программированию
Примеры решения задач по линейному программированию

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

Оптимальное значение целевой функции ТЗ равно

Примеры решения задач по линейному программированию

Для контроля вычислим значение целевой функции двойственной задачи по значениям двойственных переменных:

Примеры решения задач по линейному программированию

Разумеется, значения целевых функций совпали.