Как метод симплекс решает сложные задачи оптимизации

3

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

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

Почему нам нужен систематический подход

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

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

Джордж Данциг решил эту проблему в 1947 году. Он работал математическим консультантом для ВВС США. У военных были масштабные проблемы логистики. Им нужно было оптимизировать маршруты поставок и распределение ресурсов. Данциг разработал метод симплекс, чтобы отсечь лишнее.

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

Как работает метод симплекс пошагово

Процесс систематичен. Он переходит от одного варианта к следующему. Вот как это происходит на практике.

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

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

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

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

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

Конкретный пример: максимизация прибыли фабрики

Давайте рассмотрим конкретный случай. Фабрика производит два продукта. Назовем их x1 и x2. Прибыль от второго типа в два раза выше, чем от первого. Общая прибыль представлена уравнением:

x1 + 2×2

Это ваша целевая функция. Вы хотите ее максимизировать.

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

Вот реальные ограничения:

  • Сырье для x2 ограничивает производство пятью единицами за партию (x2 ≤ 5).
  • Сырье для x1 ограничивает производство восемью единицами за партию (x1 ≤ 8).
  • Время работы станков позволяет производить максимум десять единиц в сумме (x1 + x2 ≤ 10).
  • Вы не можете производить отрицательные количества (x1 ≥ 0 и x2 ≥ 0).

Метод симплекс находит значения x1 и x2, которые максимизируют прибыль в пределах этих границ. Любое решение — это пара чисел (x1, x2). Например, производство трех единиц x1 и шести единиц x2 является допустимой точкой (3, 6).

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

Чтобы увидеть, как метод симплекс определяет оптимальную вершину, рассмотрим целевую функцию x1 + 2×2 = k. Если вы установите k равным 4, вы получите линию на графике. По мере увеличения k вы получаете параллельные линии. Наибольшее значение k, которое все еще касается области допустимых решений, является максимально возможной прибылью.

В этом примере линия для k = 15 касается области в точке (5, 5). Если k выше, линия выходит за пределы допустимого множества. Оптимальное решение заключается в производстве равных количеств каждого товара.

Почему вершины важны в линейном программировании

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

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

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

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

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

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

Представьте себе slack как оставшуюся мощность. Если у вас есть ограничение вида $x_1 \le 8$, вы добавляете переменную $x_3$ так, чтобы $x_1 + x_3 = 8$. И помните, что $x_3$ должно быть больше или равно нулю. Вы делаете это для каждого ограничения.

  • $x_1 + x_3 = 8$ (при $x_3 \ge 0$)
  • $x_2 + x_4 = 5$ (при $x_4 \ge 0$)
  • $x_1 + x_2 + x_5 = 10$ (при $x_5 \ge 0$)

Вам также нужна переменная для самой целевой функции. Назовем её $x_0$. Если ваша цель — максимизировать $x_0 = x_1 + 2x_2$, вы переписываете её в виде $x_1 + 2x_2 — x_0 = 0$.

Теперь задача стала проще. Найдите неотрицательные значения для $x_1$ через $x_5$. Сделайте $x_0$ как можно большим.

Начало в начале координат

С чего начать? Самая простая точка — это начало координат. Обнулите все переменные решения. $x_1 = 0$. $x_2 = 0$.

Это допустимое решение. Это крайняя точка. Фактически, это стартовая вершина. Значение целевой функции $x_0$ также равно нулю. Не очень хорошо, но это законное действие.

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

Посмотрите на уравнение целевой функции: $x_1 + 2x_2 — x_0 = 0$. Выразив $x_0$, получаем $x_0 = x_1 + 2x_2$.

Увеличение $x_1$ добавляет 1 к общему значению. Увеличение $x_2$ добавляет 2. $x_2$ — явный победитель. Она дает наибольшее увеличение $x_0$ на единицу изменения. Итак, вы выбираете $x_2$ и увеличиваете её.

Столкновение с первым ограничением

Вы не можете увеличивать $x_2$ бесконечно. Переменные должны оставаться неотрицательными. Если вы увеличите $x_2$ больше 5, что-то пойдет не так. В частности, посмотрите на второе ограничение: $x_2 + x_4 = 5$.

Если $x_2 = 6$, то $x_4$ станет равным -1. Это запрещено. Требование неотрицательности действует как жесткое ограничение. Предел составляет 5.

Итак, вы устанавливаете $x_2 = 5$. Как теперь выглядит решение?

  • $x_2 = 5$
  • $x_1 = 0$ (по-прежнему равно нулю)
  • $x_4 = 0$ (эта переменная достигла предела, поэтому теперь она равна нулю)
  • $x_3 = 8$ (поскольку $0 + 8 = 8$)
  • $
Попередня статтяКак Фонд Дж. Пола Гетти переосмысляет историю искусства и консервацию