
Алгоритмы на графах.ppt
- Количество слайдов: 44
Алгоритмы на графах Представления графов Понятие остовного дерева минимального веса Алгоритмы для отыскания остовного дерева минимального веса 1
Представления графов Выбор соответствующей структуры данных для представления графа имеет принципиальное значение при разработке эффективных алгоритмов. При решении задач используются следующие пять основных способов представления графа: матрица инциденций; матрица смежности; списки ребер; структура смежности; векторы смежности. Рассмотрим эти представления графа более подробно. 2
матрица инциденций Это матрица А с n строками, соответствующими вершинам, и m столбцами, соответствующими ребрам. Для ориентированного графа столбец, соответствующий дуге (х, у) Е, содержит -1 в строке, соответствующей вершине х, 1 в строке, соответствующей вершине у, и нули во всех остальных строках 1 -2 1 -4 2 -1 3 -2 4 -3 4 -2 V 1 -1 -1 1 0 0 0 V 2 1 0 -1 1 0 1 V 3 0 0 0 -1 1 0 V 4 0 1 0 0 -1 -1 Ориентированный граф и его матрица инциденций 3
Неориентированный граф и его матрица инциденций • В случае неориентированного графа столбец, соответствующий ребру (х, у), содержит 1 в строках, соответствующих узлам х и у, и нули в остальных строках. 1 -2 1 -5 2 -5 3 -4 3 -5 4 -5 V 1 1 1 0 0 V 2 1 0 0 0 V 3 0 0 0 1 1 0 V 4 0 0 0 1 V 5 0 1 1 4
Анализ матрицы инциденций • С алгоритмической точки зрения матрица инциденций является, вероятно, самым худшим способом представления графа, который только можно себе представить. – Во-первых, он требует n*т ячеек памяти, причем большинство этих ячеек вообще занято нулями. – Неудобен также доступ к информации. Ответ на элементарные вопросы типа “существует ли дуга (х, y)? ”, “к каким вершинам ведут ребра из х? ” требует в худшем случае перебора всех столбцов матрицы, а следовательно, m шагов. 5
матрица смежности Пусть G=(V, E)- простой орграф, в котором вершины предполагаются упорядоченными от Vi до Vn. Матрица А размера nxn, элементы aij которой задаются выражением aij =1, если ( Vi , Vj) Е aij =0, в противном случае называется матрицей смежности графа G или матрицей соединений. Каждый элемент этой матрицы либо 0, либо 1 V 2 V 3 V 4 V 1 0 0 V 2 1 0 1 1 V 3 0 0 0 1 V 4 1 0 0 0 6
Анализ матрицы смежности достоинства • Матрица смежности данного орграфа G=(V, E) зависит от упорядоченных элементов V. – Для различных упорядочений элементов V получаются различные матрицы смежности одного и того же графа. – Тем не менее любая матрица смежности графа G может быть получена из другой матрицы смежности этого же графа путем перестановки некоторых строк и соответствующих им столбцов. • Основным преимуществом матрицы смежности является тот факт, что за один шаг можно получить ответ на вопрос “существует ли ребро из х в у? 7
Анализ матрицы смежности недостатки • Недостатком же является тот факт, что независимо от числа ребер объем занятой памяти составляет n 2. На практике это неудобство можно иногда уменьшить, храня целую строку (столбец) матрицы в одном машинном слове. Это возможно для малых n. Для простых неориентированных графов эта матрица смежности симметрична. • Трудно внести изменения в граф 8
Дополнительные возможности матрицы смежности • Понятие матричного представления можно расширить на мультиграфы и взвешенные графы. • В случае мультиграфа или взвешенного графа aij = wij , где wij - либо кратность, либо вес ребра. В этом случае матрица смежности называется матрицей весов. • Если в каждой вершине графа имеются только петли, матрица смежности является диагональной. 9
Представление графа с помощью списка рёбер • Если граф является разреженным, то возможно, что более эффективно представлять ребра графа парами вершин. • Такое представление называется списком ребер графа. Это представление можно реализовать двумя массивами • g=(g 1, g 2, g 3, . . . g. E)-начальные вершины ребер, h=(h 1, h 2, h 3. . . , h. E)-конечные вершины ребер. • Каждый элемент в массиве есть метка вершины, а i-е ребро графа выходит из вершины gi и входит в вершину hi. 10
Пример g=(1, 1, 2, 3, 4, 4) h=(2, 4, 1, 2, 3, 2) Анализ Очевидно, что объем памяти в этом случае 2 m (m - количество рёбер). Неудобством является большое число шагов в худшем случае), необходимое для множества вершин, к которым ведут ребра вершины. составляет (порядка m получения из данной 11
Представление графа с помощью структур смежности • структура смежности - список всех последователей (соседей) каждой вершины. • Для каждой вершины задается список всех последователей (соседей) этой вершины. 12
Пример 1: 2, 4 2: 1 3: 2 4: 2, 3 v 1 v 4 v 2 v 3 1: 2, 4 2: 1, 3, 4 3: 2, 4 4: 1, 2, 3 Анализ Если для хранения метки вершины используется одно машинное слово, то структура смежности ориентированного графа требует V+E слов, а для неориентированного V+2*E слов. Структуры смежности могут быть удобно реализованы списком списков или массивом из V линейно связанных списков, где каждый список содержит последователей некоторой вершины. Такое представление желательно для алгоритмов, в которых в графе добавляются или удаляются вершины. 13
Вектор смежности Номер строки соответствует номеру узла. Каждая строка содержит номера смежных узлов. v 1 v 2 2 1 2 2 4 0 0 3 0 0 v 4 v 3 2 1 4 3 4 2 0 4 0 3 14
Заключение • Для представления ориентированных графов можно также использовать списковые структуры. Списковые структуры в основном используются при обработке символов. При этом характерны две черты: 1. Непредсказуемые требования памяти 2. Высокая интенсивность обработки данных • Во многих задачах на графах выбор представления является решающим для эффективности алгоритма. С другой стороны, переход от одного представления к другому относительно прост и имеет сложность O(V 2). 15
Алгоритм отыскания остовного дерева минимального веса • Определение: Остовное дерево (стягивающее дерево, каркас) – это граф, в котором каждая пара вершин связана одной и только одной цепью. • Теорема: Граф G является связным тогда и только тогда, когда он содержит остовное дерево. • Число различных каркасов полного связного неориентированного графа с N вершинами было найдено впервые Коли и равно N(N-2). 16
5 1 3 7 4 6 3 2 4 9 8 5 7 3 5 8 4 5 3 2 8 1 5 3 2 6 2 3 4 4 W=23 4 4 8 5 W=21 W=26 7 W=23 1 3 6 3 3 4 2 7 W=42 1 5 1 9 5 9 3 3 6 2 4 5 W=23 Взвешеный граф и некоторые из его остовных деревьев с весами. 17
Алгоритмы для отыскания остовного дерева минимального веса • Каркас связанного графа можно искать с помощью различных методов. • Для поиска произвольного каркаса используются: – Грубый метод – Метод поиска в глубину; – Метод поиска в ширину • Для поиска каркасов минимального веса применяются алгоритм Прима алгоритм Краскала 18
Грубый алгоритм: • выбираем самое дешевое ребро, затем к нему добавляется самое дешевое из оставшихся и т. д. • При этом окончательная подсеть должна содержать: – все вершины; – должна быть связной; – не должна содержать циклов; – должна иметь минимально возможный вес. 19
Блок – схема грубого алгоритма Инициализация Проверка связности выход Поиск ребра минимального веса Проверка циклов Включение ребра в остовное дерево Подалгоритмы определения связности и наличия циклов могут сделать этот алгоритм неэффективным. Исключение ребра из исходного графа 20
Пример: задача коммивояжёра для 5 пунктов 8 5 14 6 4 1 7 13 9 11 ∞ 15 3 12 9 7 8 11 ∞ 15 14 13 9 15 ∞ 12 14 7 14 12 ∞ 6 8 2 14 11 13 14 6 ∞ 1 11 11 5 2 12 12 4 14 3 1 5 2 4 3 14 6 подcеть не является связной и имеется цикл. 6 Соединим узлы 1 и 2 с узлами 3, 4, 5 связью с минимальным весом и уберём из цикла связь с максимальным весом. Получаем остовное дерево 21
Проверка связности графа • Разделим все вершины графа на три разновидности: – Вершины, про которые ничего не известно; – Вершины, которые могут быть достигнуты из начальной вершины и которые не были обработаны. – Вершины, которые могут быть достигнуты из начальной вершины и которые были обработаны. • В этом алгоритме три этапа - первоначальная разметка, распространение разметки и формирование результата. 22
• 1. Первоначальная разметка – Пометим все вершины первым маркером - нам про них ничего не известно – Выберем любую вершину (например первую (или нулевую)), пометим ее вторым маркером, ведь она может быть достигнута сама из себя. • 2. Разметка соседних вершин – Если нет вершин, помеченных вторым маркером - переходим к третьему этапу. – Выберем любую вершину, помеченную вторым маркером. Пометим ее третьим маркером. Все вершины, соседние с данной и помеченные первым маркером, пометим вторым маркером. – Повторим этот пункт с начала. • 3. Завершение работы – Если нужно получить список вершин, входящих в одну компоненту связности с заданной вершиной, то выбираем вершины, помеченные третьим маркером, в отдельный массив. – Если нужно получить список вершин, не входящих в одну компоненту связности с заданной вершиной, то выбираем вершины, помеченные первым маркером в отдельный массив и возвращаем полученный массив. – Если нужно просто проверить граф на связность, то считаем вершины, помеченные первым маркером, и сравниваем получившееся число с нулем. Если число вершин, помеченные первым маркером, равно нулю, то граф связный. 23
• Если использовать метод отрабатывания назад, то получаем естественную процедуру отыскания остовного дерева минимального веса, которая последовательно находит циклы в графе и разрывает их, удаляя из цикла ребро обладающее наибольшим весом. • Рассмотренный алгоритм является грубым алгоритмом, т. к. выбор ребер производится без учета воздействия, которое он может оказать на последующие выборы. • Любое остовное дерево с п вершинами имеет (п -1) ребро. 24
Поиск в глубину в графе • Общая идея этого метода состоит в следующем. – Предположим, что мы находимся в вершине V. Если существует новая (еще не просмотренная) вершина U, то мы рассматриваем эту вершину (она перестает быть новой) и, начиная с нее, продолжаем поиск. – Если же не существует ни одной новой вершины, смежной с V, то мы говорим, что вершина U использована, возвращаемся в вершину, из которой мы попали в V, и продолжаем процесс (если V=V 0, то поиск закончен). • Другими словами, поиск в глубину из вершины U основывается на поиске в глубину из всех новых вершин, смежных с U. 25
пример 9 3 8 2 2 5 7 5 3 1 12 4 4 1 6 11 12 8 10 13 10 6 9 7 11 13 26
• Этот алгоритм легко записать с помощью рекурсивной процедуры • Алгоритм просматривает каждую вершину в точности один раз и его сложность порядка O(n+m), где n-количество узлов, m- количество ребер. • Методика поиска в глубину очевидным образом переносится на ориентированные графы. • Для уверенности в том, что поиск закончится, необходимо предусмотреть остановку на определенной глубине. 27
Разновидности поиска в глубину • Для геометрического поиска пути можно сделать два дополнения. – добавление метки на каждую ячейку с длиной найденного к ней кратчайшего пути; алгоритм больше не посетит эту ячейку пока не будет иметь к ней путь с меньшей стоимостью. – выбор вначале соседей, которые ближе к цели. • С этими двумя дополнениями, можно заметить, что поиск в глубину быстро найдет путь. • Могут обрабатываться даже взвешенные пути, если сделать остановку по общей накопленной стоимости вместо общего расстояния. 28
Алгоритм последовательных приближений при поиске в глубину (IDDFS) • в алгоритме поиска в глубину существует еще одна проблема - выбор правильной глубины остановки. • Если она будет слишком маленькой, то путь не будет найден; если слишком большой, то потенциально можно потратить много времени впустую, исследуя слишком глубоко, или найти путь с очень высокой стоимостью. • Эти проблемы решаются итеративным углублением техника, при которой выполняется поиск в глубину с увеличивающейся глубиной до тех пор, пока путь не будет найден. • При поиске пути мы можем не начинать с глубины равной единице, а сразу начать с глубины равной расстоянию по прямой от старта к цели. Этот поиск является асимптотически оптимальным среди всех 29 переборных алгоритмов по времени и памяти.
Алгоритм “лучший-первый” • Это первый рассматриваемый эвристический поиск, который принимает во внимание знания о пространстве поиска для направления своих усилий. • Он похож на алгоритм Дейкстры, за исключением того, что узлы в списке оцениваются по приблизительному оставшемуся расстоянию до цели. Эта оценка так же не требует наличия обновлений, в отличие от алгоритма Дейкстры. • Это самый быстрый из всех планирующих алгоритмов рассмотренных ранее, который направляется по прямой к цели. • Он так же имеет и свои слабости. Он не принимает во внимание накопленную стоимость пути, направляясь по прямой через зону с высокой стоимостью, а не обходя ее. 30
Поиск в ширину в графе • Суть метода (в сжатой формулировке): • рассматриваются все вершины, связанные с текущей. • Принцип выбора следующей вершины – выбирается та, которая была рассмотрена раньше. • Для реализации данного принципа необходима структура данных “очередь”. 31
пример 3 2 12 6 2 9 7 1 5 3 4 1 12 4 5 6 13 11 13 10 7 8 9 10 11 8 32
Для рассматриваемого примера описание графа с помощью структур смежности имеет вид: 33
Анализ • Вычислительная сложность поиска в ширину также имеет порядок т+n, так каждая вершина помещается в очередь и удаляется из очереди в точности один раз. • Имеется множество простых проблем. Одна заключается в том, что поиск идет равномерно во всех направлениях, вместо того, чтобы быть направленным в сторону цели. 34
Сравнение • Оба вида поиска в графе—в глубину и в ширину могут быть использованы для нахождения пути между фиксированными вершинами v и и. Достаточно начать поиск в графе с вершины v и вести его до момента посещения вершины и. • Преимуществом поиска в глубину является тот факт, что в момент посещения вершины и стек содержит последовательность вершин, определяющую путь из v в u. • Недостатком поиска в глубину является то, что полученный таким образом путь в общем случае не будет кратчайшим путем из v в и. • От этого недостатка свободен метод нахождения пути, основанный на поиске в 35 ширину.
Двунаправленный поиск в ширину • Это улучшает простой поиск в ширину тем, что запускаются два одновременных поиска в ширину из стартового и конечного узлов и останавливается, когда узел из одного фронта поиска находит соседний узел из другого фронта. • Это может улучшить простой поиск в ширину (обычно в 2 раза), но все еще является очень неэффективным. • Хитрости, наподобие этой, хорошо запомнить, так как они могут пригодиться в дальнейшем. • Можно доказать, что данный алгоритм корректно строит стягивающее дерево для произвольного связного графа за 0(n + m) шагов. 36
Остовное дерево наименьшей стоимости • Пусть G =(V, Е)-связный взвешенный неориентированный граф, для которого задана матрица смежности, отображающая веса ребер в числа (вещественные или целые). Стоимость (вес) остовного дерева определяется как сумма стоимостей (весов) его ребер. • Цель — найти для графа G остовное дерево наименьшей стоимости (минимального веса). Полный граф с n вершинами содержит nn-2 остовных деревьев. Поиск каждого остовного дерева занимает О(е) времени. В полном дереве количество ребер е=n*(n-1)/2. Тогда решение задачи прямым поиском имело бы сложность О(nn-2 n(n-1)/2)=О(nn) • Алгоритмы Прима и Краскала, предназначенные для поиска каркаса минимального веса, гарантирует без проведения проверок, что создана связная сеть без циклов. 37
Алгоритм Прима • Алгоритм Прима заключается в следующем. – – • Вначале выбираем некоторую вершину v, остальные (n - 1) вершин графа отмечаются как невыбранные. Определяются веса между выбранной вершиной v и остальными невыбранными вершинами. Выбираем вершину с наименьшим весом до нее, фиксируем выбранные ребро и вес. Выбранную вершину исключаем из перечня невыбранных, число не выбранных вершин уменьшаем на 1. Все эти шаги повторяем до тех пор, пока не будут выбраны всё вершины, т. е. (n - 1) раз. 38
Блок – схема алгоритма Инициализация Остались ли не выбранные узлы выход Поиск ребра минимального веса между выбранной вершиной U и невыбранной V Включение ребра в остовное дерево Помечаем вершину V как выбранную 39
Пример 1 8 7 5 14 6 4 13 11 9 14 Выбранная вершина 2 15 3 12 5 6 4 2 6 3 4 3 1 7 1 9 7 5 2 6 9 11 5 5 ->4: 6 1 3 2 7 12 14 4 ->1: 7 1 3 2 9 11 1 ->3: 9 1 7 4 1 2 3 6 8 13 14 - 4 1 2 Выбранная дуга и вес 5 1 5 Невыбранные вершины и веса до них 2 11 1 ->2: 11 2 Выбраны все 2 6 4 3 40
Алгоритм Краскала • В отличие от алгоритма Прима, этот алгоритм не требует прохода по всем вершинам для нахождения ребра с минимальным весом. Вместо этого он использует 'жадный' подход. Работаем с вершинами, а не с ребрами G. Это дает нам n связных компонент. Будем увеличивать их размер по ребру за раз. • Число ребер, необходимое для остовного дерева: n-1. • Результат. Каркас с минимальным суммарным весом 41
Алгоритм • Шаг 1. Начать с вполне несвязного графа G, содержащего n вершин. • Шаг 2. Упорядочить ребра графа G в порядке неубывания их весов. • Шаг 3. Начав с первого ребра в этом перечне, добавлять ребра в графе G, соблюдая условие: добавление не должно приводить к появлению цикла в G. • Шаг 4. Повторять шаг 3 до тех пор, пока число ребер в G не станет равным n-1. Получившееся дерево является каркасом минимального веса. • Сложность алгоритма составляет O(m*lg m). mчисло рёбер. 42
Пример 8 1 7 5 14 6 13 9 11 Вершины Вес выборка 1 7 9 5 4 + 7 1 4 + 8 5 1 - 1 3 + 11 12 6 9 4 2 15 14 1 2 + 12 3 4 - 13 5 2 - 14 5 3 - 14 2 4 - 15 2 3 - 3 11 5 2 6 4 3 43
Другие алгоритмы поиска множества путей и кратчайших путей • алгоритм Форда-Беллмана, если нет контуров отрицательного веса, то он находит минимальный путь между двумя заданными вершинами • алгоритм Дейкстры, если нет отрицательных ребер, то он позволяет найти пути из заданной вершины во все остальные • алгоритм Флойда позволяет найти кратчайшие пути между всеми вершинами графа • алгоритм Уоршала позволяет получить путевую матрицу, которая содержит все пути между различными узлами 44