1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# теория · шаг 2 из 6

Симплекс: ходить по вершинам, а не перебирать их

Коротко

Вершин у задачи может быть C(m, n) - перебрать нельзя. Симплекс-метод ходит по вершинам, как по графу: стоит в одной, смотрит на соседние и переходит в ту, где цель растёт; когда роста нет ни в одну сторону - это оптимум. Технически вершина задаётся базисом - набором переменных, которым разрешено быть ненулевыми; шаг метода меняет в базисе одну переменную. Две неприятности: вырожденность (шаг не меняет цель, и метод может зациклиться - лечится правилом Блэнда) и худший случай, который экспоненциален (куб Кли-Минти). При этом на практике симплекс быстр, а полиномиальные гарантии дают другие методы - эллипсоидный и внутренней точки.

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

Как думаешь, зачем вообще алгоритм

Перебор вершин для двух переменных выглядел честной работой: десяток пересечений, проверил допустимость, выбрал лучшее. Прикинь теперь задачу планирования смен: 200 переменных и 500 ограничений. Сколько вершин надо перебрать?

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

На что это похоже

Подъём в гору в тумане. Ты стоишь на склоне и видишь только тропинки от своего места. Выбираешь ту, что ведёт вверх, идёшь по ней до развилки, там снова смотришь. Когда все тропинки ведут вниз - ты на вершине. Для выпуклой горы (а многогранник выпуклый) такой подъём гарантированно приводит на САМУЮ высокую точку, и в этом вся сила: локальный максимум здесь совпадает с глобальным.

Механизм: базис и шаг

Сначала неравенства превращают в равенства, добавляя дополнительные переменные - остатки ресурсов:

2x + 3y <= 12        →      2x + 3y + s₁ = 12,   s₁ >= 0
4x +  y <= 10        →      4x +  y + s₂ = 10,   s₂ >= 0

Теперь переменных больше, чем уравнений. Базисное решение: выбираем m переменных (базис), остальные приравниваем нулю и решаем систему. Каждому допустимому базисному решению соответствует вершина многогранника.

шаг симплекса:
    1. выбрать ВХОДЯЩУЮ переменную - ту, чей рост увеличивает цель
       (если такой нет - текущая вершина оптимальна, стоп)
    2. выбрать ВЫХОДЯЩУЮ переменную - ту, которая первой упрётся в ноль
       при росте входящей (правило отношений)
       (если ни одна не упирается - цель не ограничена, стоп)
    3. поменять их местами в базисе и пересчитать

Геометрически шаг - это переход по ребру многогранника в соседнюю вершину. Цель при этом не убывает.

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

Правило

Симплекс-метод ходит по вершинам многогранника, а не перебирает их. Вершине соответствует базис - набор переменных, которым разрешено быть ненулевыми; шаг меняет одну переменную в базисе и переводит точку в соседнюю вершину, не ухудшая цель. Нет входящей переменной - оптимум найден; нет выходящей - цель не ограничена. Худший случай экспоненциален (куб Кли-Минти заставляет метод обойти все 2ⁿ вершин), на практике же число шагов обычно порядка числа ограничений. Полиномиальные гарантии дают эллипсоидный метод (Хачиян, 1979) и методы внутренней точки (Кармаркар, 1984); последние применяют для по-настоящему больших задач.

Разбор: два шага на задаче про цех

Задача из прошлого урока: максимизировать 5x + 4y при 2x + 3y <= 12, 4x + y <= 10.

старт: базис {s₁, s₂}, то есть x = y = 0        вершина (0, 0), цель 0

шаг 1. входящая: x (его коэффициент в цели 5 - самый большой рост)
       правило отношений: s₁ упрётся при x = 12/2 = 6
                          s₂ упрётся при x = 10/4 = 2.5  ← меньше, выходит s₂
       новый базис {s₁, x}                      вершина (2.5, 0), цель 12.5
       «пересчитать» значит выразить новую базисную переменную через небазисные
       и подставить это выражение в остальные строки и в цель - после чего цель
       выглядит как 12.5 + 2.75y − 1.25s₂, и выгодность y видна прямо в ней

шаг 2. входящая: y (её коэффициент в пересчитанной цели +2.75, то есть рост выгоден)
       правило отношений: упирается s₁, при x = 2.5 остаётся y <= 2.8
       новый базис {x, y}                       вершина (1.8, 2.8), цель 20.2

шаг 3. входящих переменных нет - рост цели невозможен ни в одну сторону
       ОПТИМУМ: 20.2

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

Разбор: почему худший случай всё-таки экспоненциален

Кли и Минти в 1972 году построили пример: слегка «покосившийся» n-мерный куб. У куба 2ⁿ вершин, и на этом кубе классический симплекс с правилом «входит переменная с самым выгодным коэффициентом» обходит ВСЕ вершины, прежде чем добраться до оптимума.

куб размерности n: 2ⁿ вершин, симплекс обходит их все, то есть делает 2ⁿ − 1 шаг
n = 3   →   8 вершин,  7 шагов вместо трёх
n = 50  →   2⁵⁰ вершин, это больше 10¹⁵ шагов

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

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

Что ломается без этого

Первое: писать симплекс руками без правила против зацикливания и получить бесконечный цикл на вырожденной задаче - она встречается чаще, чем кажется. Второе: выбирать выходящую переменную не по правилу отношений, а «первую попавшуюся» - решение станет недопустимым. Третье: забывать про начальную допустимую вершину: если нулевая точка недопустима (есть ограничения >= с положительной правой частью), нужен подготовительный этап - метод двух фаз или большие штрафы. Четвёртое: ожидать от симплекса целых ответов - он даёт вершину, а она бывает дробной. Пятое: считать, что «экспоненциальный худший случай» означает «медленно»: на практике шагов обычно от m до 3m, и именно поэтому метод жив уже восемьдесят лет.

Зачем это в работе

Писать симплекс руками почти никогда не нужно - за тебя это уже написали. Но понимать, что внутри, приходится: когда решатель говорит «задача не ограничена», значит в модели забыто ограничение; когда «несовместна» - значит ограничения противоречат друг другу, и надо искать какое; когда решение оказалось дробным - значит решалась линейная задача, а нужна была целочисленная, и это совсем другое время работы. Плюс словарь: basis - базис, slack - дополнительная переменная, degenerate - вырожденная вершина, pivot - сам шаг смены базиса (и «ведущий элемент», вокруг которого идёт пересчёт). В логах решателей эти слова встречаются постоянно.

Теперь сам

Задача: максимизировать 3x + 2y при x + y <= 4, x <= 3, x, y >= 0. Пройди симплекс от точки (0, 0) и назови вершины, через которые он пройдёт.

Ответ. Дополнительные переменные: x + y + s₁ = 4, x + s₂ = 3.

Старт: базис {s₁, s₂}, точка (0, 0), цель 0.

Шаг 1: входящая - x (коэффициент 3 больше, чем 2). Правило отношений: s₁ упирается при x = 4/1 = 4, s₂ - при x = 3/1 = 3. Меньше у s₂, значит она выходит. Новая вершина (3, 0), цель 9.

Шаг 2: входящая - y (её рост всё ещё увеличивает цель). Упирается s₁: при x = 3 остаётся y <= 1. Новая вершина (3, 1), цель 9 + 2 = 11.

Шаг 3: входящих нет - обе переменные в базисе, и увеличить цель нечем. Оптимум 11 в точке (3, 1).

Путь: (0, 0) → (3, 0) → (3, 1). Вершину (0, 4) метод не осматривал - и это нормально: она хуже, а доказательство оптимальности даёт не перебор, а отсутствие выгодного направления.

Главное

Симплекс-метод ходит по вершинам многогранника по рёбрам, а не перебирает все C(m, n) вершин. Вершине соответствует базис - набор ненулевых переменных; шаг меняет одну переменную в базисе: входящую выбирают по росту цели, выходящую - по правилу отношений. Нет входящей - оптимум, нет выходящей - цель не ограничена. Вырожденность может привести к зацикливанию, от него спасает правило Блэнда. Худший случай экспоненциален (куб Кли-Минти, 2ⁿ вершин), но на практике шагов порядка числа ограничений; полиномиальные гарантии дают эллипсоидный метод и методы внутренней точки, и современные решатели используют и то и другое.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.