Практическое применение теории графов
Скачать 3.14 Mb.
|
ПРАКТИЧЕСКОЕ ПРИМЕНЕНИЕ ТЕОРИИ ГРАФОВЛЕКЦИЯ 8 ГРАФОВЫЕ АЛГОРИТМЫ Опишем основные графовые алгоритмы, которые становятся очень полезными для анализа, а также области их применения. ПОИСК В ШИРИНУОбход или поиск — это одна из фундаментальных операций, выполняемых на графах. Поиск в ширину начинается с определённой вершины, затем исследуются все её соседи на данной глубине и происходит переход к вершинам следующего уровня. В графах, в отличие от деревьев, могут быть циклы — пути, в которых первая и последняя вершины совпадают. Поэтому необходимо отслеживать посещённые алгоритмом вершины. При реализации алгоритма поиска в ширину используется структура данных «очередь». На рисунке 1 показан пример того, как выглядит поиск в ширину на графе. Жёлтым цветом помечаются обнаруженные вершины, красным — посещённые. Применяется для: определения кратчайших путей и минимальных остовных деревьев; индексации веб-страниц поисковыми ботами; поиска в соцсетях; нахождения доступных соседних узлов в одноуровневых сетях, таких как BitTorrent. ПОИСК В ШИРИНУРис. 1 Визуальное отображение обхода на графах (поиск в ширину) ПОИСК В ГЛУБИНУПоиск в глубину начинается с определённой вершины, затем уходит как можно дальше вдоль каждой ветви и возвращается обратно. Здесь тоже необходимо отслеживать посещённые алгоритмом вершины. Для того, чтобы стало возможным возвращение обратно, при реализации алгоритма поиска в глубину используется структура данных «стек». На рисунке 2 показан пример того, как выглядит поиск в глубину на том же графе, который использован на рисунке 1. Граф обходится на всю глубину каждой ветви с возвращением обратно. Применяется: для нахождения пути между двумя вершинами; для обнаружения циклов на графе; в топологической сортировке; в головоломках с единственным решением (например, лабиринтах). ПОИСК В ГЛУБИНУРис. 2 Визуальное отображение обхода на графах (поиск в глубину) КРАТЧАЙШИЙ ПУТЬКратчайший путь от одной вершины графа к другой — это путь, при котором сумма весов рёбер, его составляющих, должна быть минимальна. На рисунке 3 показан кратчайший путь на графе от вершины 1 до вершины 6. Алгоритмы нахождения кратчайшего пути: Алгоритм Дейкстры. Алгоритм Беллмана-Форда. Алгоритм поиска A* Алгоритм Флойда — Уоршелла Алгоритм Джонсона Алгоритм Ли (волновой алгоритм) Поиск кратчайшего пути на основе алгоритма Килдала. Применяются в: картографических сервисах типа Google maps или Apple maps для прокладки маршрутов и определения местоположения; сетях для решения проблемы минимальной задержки пути; абстрактных автоматах для определения через переход между различными состояниями возможных вариантов достижения некоторого целевого состояния, например минимально возможного количества ходов, необходимого для победы в игре. КРАТЧАЙШИЙ ПУТЬРис. 3 Визуальное отображение кратчайшего пути от вершины 1 к вершине 6 ОБНАРУЖЕНИЕ ЦИКЛОВЦикл — это путь, в котором первая и последняя вершины графа совпадают. То есть путь, начинающийся и завершающийся в одной и той же вершине, называется циклом. Обнаружение циклов — это процесс выявления таких циклов. На рисунке 4 показано, как происходит обнаружение цикла. Алгоритмы обнаружения цикла: Алгоритм Флойда. Алгоритм Брента. Применяются: в распределённых алгоритмах, использующих сообщения; для обработки крупных графов с использованием распределённой системы обработки в кластере; для обнаружения взаимоблокировок в системах с параллельным выполнением; в криптографических приложениях для выявления ключей сообщения, которые могут соответствовать одному и тому же зашифрованному значению. ОБНАРУЖЕНИЕ ЦИКЛОВРис. 4 Цикл Минимальное остовное дерево — это подмножество рёбер графа, которое соединяет все вершины, имеющие минимальную сумму весов рёбер, и без циклов. На рисунке 5 показан процесс получения минимального остовного дерева. Алгоритмы поиска минимального остовного дерева: (мы их не берем, почему?) Алгоритм Прима. Алгоритм Крускала. Применяются: для создания деревьев для распределения данных в компьютерных сетях; в кластерном анализе с использованием графов; при сегментации изображений; при социально-географическом районировании, когда смежные регионы объединяются. Рис. 5 Визуальное отображение минимального остовного дерева Граф считается сильно связным, если все вершины в графе достижимы из всех остальных вершин. На рисунке 6 показан пример того, как выглядит граф с тремя сильно связными компонентами, вершины которых окрашены в красный, зелёный и жёлтый цвета. Алгоритмы поиска сильных компонент связности: Алгоритм Косараджу. Алгоритм Тарьяна. Применяются: для вычисления декомпозиции Далмейджа-Мендельсона, которая представляет собой разделение вершин двудольного графа на подмножества; в соцсетях для поиска групп сильно связанных между собой людей и выдачи рекомендаций на основе общих интересов. Рис. 6 Сильно связные компоненты Топологическая сортировка графа — это такое линейное упорядочение его вершин, в котором для каждого направленного ребра, например (u, v), вершина u предшествует вершине v. На рисунке 7 показан пример топологического упорядочения вершин, согласно которому вершина 5 должна следовать за вершинами 2 и 3, а вершина 6 — за вершинами 4 и 5. Алгоритмы поиска топологической сортировки: Алгоритм Кана. Алгоритм на основе поиска в глубину. Применяются: при планировании выполнения команд; при сериализации данных; определения порядка выполняемых при компиляции задач в Makefiles; для разрешения зависимостей символов в компоновщиках. Рис. 7 Топологическая сортировка РАСКРАСКА ГРАФОВПри раскраске графов элементам графа присваиваются цвета с учётом определённых условий. Раскраска вершин — наиболее часто используемый метод окраски графов. При этом вершины графа окрашиваются с использованием k цветов, а любым двум соседним вершинам должны соответствовать разные цвета. Другие методы окраски — раскраска рёбер и раскраска граней. Хроматическое число графа — это наименьшее количество цветов, необходимых для окрашивания графа. На рисунке 8 показан пример того, как выглядит раскраска вершин графа с использованием 4-х цветов. Алгоритмы с раскраской графов: Алгоритмы, использующие поиск в ширину или поиск в глубину. Жадная раскраска. Применяются для: составления расписаний; назначения радиочастот мобильных сетей; моделирования и решения головоломок типа судоку; проверки того, является ли граф двудольным; раскрашивания географических карт стран или штатов, на которых соседние страны или штаты имеют разные цвета. РАСКРАСКА ГРАФОВРис. 8 Раскраска вершин МАКСИМАЛЬНЫЙ ПОТОКМожно смоделировать граф в виде сети потоков с весами рёбер в качестве пропускной способности этих потоков. В задаче максимального потока требуется найти такой путь потока, который может обеспечить максимально интенсивность потока. На рисунке 9 показан пример того, как выглядит нахождение максимального потока сети и определение конечного значения потока. Алгоритмы нахождения максимального потока: Алгоритм Форда-Фулкерсона. Алгоритм Эдмондса-Карпа. Алгоритм Диница. Применяются: в авиакомпаниях для составления полётного расписания экипажей; при сегментации изображений для определения фона и переднего плана изображения. МАКСИМАЛЬНЫЙ ПОТОКРис. 9 Определение максимального потока ПАРОСОЧЕТАНИЯПаросочетание на графе — это набор рёбер, которые не имеют общих вершин (т.е. хотя бы двух рёбер, не имеющих общей вершины). Паросочетание называется максимальным, если оно содержит максимально возможное число рёбер, сочетающихся с как можно большим количеством вершин. На рисунке 10 показано получение полного паросочетания в двудольном графе с двумя наборами вершин, обозначенных оранжевым и синим цветами. Алгоритмы нахождения паросочетаний: Алгоритм Хопкрофта-Карпа. Венгерский алгоритм. Алгоритм сжатия цветков. Применяются: в подборе пары для жениха или невесты (задача о стабильных браках); для определения вершинного покрытия; в теории транспорта для решения задачи распределения ресурсов и оптимизации перевозок. ПАРОСОЧЕТАНИЯРис. 10 Паросочетания двудольного графа |