1. 1

# конспект · шаг 1 из 1

Конспект раздела: потоки, паросочетания и линейное программирование

выжимка - её можно унести в заметки

Понятия

Сеть обычного потока - граф с пропускными способностями, истоком s и стоком t. Поток - числа на рёбрах: не больше пропускной способности, с сохранением во всех вершинах, кроме s и t. Разрез - разбиение вершин, отделяющее s от t; его пропускная способность считается только по рёбрам СЛЕВА НАПРАВО.

Остаточная сеть обычного потока: прямой остаток c−f, обратный f−ℓ, где ℓ - нижняя граница потока; при ℓ=0 обратный остаток равен f. Цена обратного ребра равна минус цене прямого, а не обязательно отрицательна.

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

Линейное программирование - максимизация линейной цели при линейных ограничениях. Двойственная задача - зеркальная: ограничения становятся переменными. Теневая цена - двойственная переменная, прирост оптимума от единицы ресурса.

Что унести

Весь раздел держится на одной идее - у ответа есть свидетель:

поток         ↔  разрез            max |f| = min c(S, T)
паросочетание ↔  вершинное покрытие |M| = |C|            (Кёниг, двудольный граф)
прямая ЛП     ↔  двойственная ЛП    cᵀx = bᵀy            (сильная двойственность)

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

задача алгоритм цена
максимальный поток Форд-Фалкерсон с произвольным путём O(E·|f|) при целых пропускных способностях
Эдмондс-Карп (кратчайший путь) O(V·E²)
Диниц (слоистая сеть) O(V²·E), на единичных O(E·√E)
минимальный разрез обход остаточной сети из s O(V + E) поверх потока
двудольное паросочетание Кун O(V·E)
Хопкрофт-Карп O(E·√V)
паросочетание в общем графе Эдмондс, сжатие цветков O(V³)
линейная задача симплекс экспонента в худшем случае, быстр на практике
внутренней точки полиномиальный
поток минимальной стоимости SSP с потенциалами O(K·E·log V)
назначения n×n венгерский O(n³)
ЧТО СВОДИТСЯ К ПАРОСОЧЕТАНИЮ (двудольный граф, |M| - максимальное паросочетание)
    минимальное вершинное покрытие      |M|
    максимальное независимое множество  |V| − |M|
    минимальное рёберное покрытие       |V| − |M|      (без изолированных вершин)
    минимальное покрытие путями в DAG   |V| − |M|      (в расщеплённом графе)

ЧТО СВОДИТСЯ К ПОТОКУ
    паросочетание            единичные пропускные способности
    назначения и транспорт   пропускные способности + цены
    выбор проектов, сегментация изображения   минимальный разрез
    кратчайший путь          поток величины 1 с ценами

Целые вершины даёт структура ограничений: матрицы обычного потока без множителей на дугах и двудольного паросочетания вполне унимодулярны, поэтому при целых нижних и верхних границах потока и балансах все вершины их многогранников целые. Как только это свойство теряется, требование целых значений превращает задачу в целочисленное программирование, а оно в общем случае NP-трудно (конкретная задача при этом может оказаться и лёгкой).

Признаки, по которым задачу узнают в чужой формулировке: есть ограниченные связи и надо пропустить побольше (поток); надо сопоставить одно с другим по принципу «не больше одного» (паросочетание); есть цены и надо подешевле (поток минимальной стоимости); есть ресурсы, ограничения и линейная выгода (ЛП). Отдельный вопрос, который стоит задать до выбора алгоритма: что именно оптимизируется - РАЗМЕР, СТОИМОСТЬ или УСТОЙЧИВОСТЬ; в последнем случае это стабильное паросочетание и совсем другой алгоритм.

Тихие ошибки раздела: считать разрез по рёбрам в обе стороны; писать поток без обратных рёбер; искать путь обходом в глубину на больших пропускных способностях; не обнулять пометки в Куне; применять Кёнига и формулы |V| − |M| к недвудольному графу; искать оптимум ЛП перебором целых точек; запускать SSP без минимального по стоимости старта своей величины; искать отрицательный цикл в исходной сети вместо остаточной.

Выпуклые и обобщённые потоки

Выпуклая стоимость C(x) задаёт цену всего объёма; цена следующего блока зависит от текущего x. Целый и непрерывный оптимумы могут различаться. Цена прямого остаточного блока Δ равна C(x+Δ)−C(x), обратного - C(x−Δ)−C(x), если соответствующий шаг допустим. Это не один постоянный тариф. Линеаризация по единицам может развернуть числовую ёмкость в столько же дуг; оценку времени нельзя объявлять полиномиальной по длине записи ёмкости без проверки.

Обобщённый поток: дуга с множителем μ>0 переносит единицу из начала и даёт μ единиц у конца. Балансы и остаточные дуги учитывают этот множитель; обычная целочисленность больше не гарантирована. Чтобы моделировать свободную мощность, явно предусмотри её неиспользование: обязательный баланс сам по себе не задаёт «до».

Куда это ведёт

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

Комментарии

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

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

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