Скачать презентацию Алгоритмы на графах Представления графов Понятие остовного дерева Скачать презентацию Алгоритмы на графах Представления графов Понятие остовного дерева

Алгоритмы на графах.ppt

  • Количество слайдов: 44

Алгоритмы на графах Представления графов Понятие остовного дерева минимального веса Алгоритмы для отыскания остовного Алгоритмы на графах Представления графов Понятие остовного дерева минимального веса Алгоритмы для отыскания остовного дерева минимального веса 1

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

матрица инциденций Это матрица А с n строками, соответствующими вершинам, и m столбцами, соответствующими матрица инциденций Это матрица А с 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 матрица смежности Пусть 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) зависит от упорядоченных Анализ матрицы смежности достоинства • Матрица смежности данного орграфа 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) Анализ Пример 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 Пример 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 Вектор смежности Номер строки соответствует номеру узла. Каждая строка содержит номера смежных узлов. 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 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 Пример: задача коммивояжёра для 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. Первоначальная разметка – Пометим все вершины первым маркером - нам про • 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 пример 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) • в алгоритме поиска в глубину Алгоритм последовательных приближений при поиске в глубину (IDDFS) • в алгоритме поиска в глубину существует еще одна проблема - выбор правильной глубины остановки. • Если она будет слишком маленькой, то путь не будет найден; если слишком большой, то потенциально можно потратить много времени впустую, исследуя слишком глубоко, или найти путь с очень высокой стоимостью. • Эти проблемы решаются итеративным углублением техника, при которой выполняется поиск в глубину с увеличивающейся глубиной до тех пор, пока путь не будет найден. • При поиске пути мы можем не начинать с глубины равной единице, а сразу начать с глубины равной расстоянию по прямой от старта к цели. Этот поиск является асимптотически оптимальным среди всех 29 переборных алгоритмов по времени и памяти.

Алгоритм “лучший-первый” • Это первый рассматриваемый эвристический поиск, который принимает во внимание знания о Алгоритм “лучший-первый” • Это первый рассматриваемый эвристический поиск, который принимает во внимание знания о пространстве поиска для направления своих усилий. • Он похож на алгоритм Дейкстры, за исключением того, что узлы в списке оцениваются по приблизительному оставшемуся расстоянию до цели. Эта оценка так же не требует наличия обновлений, в отличие от алгоритма Дейкстры. • Это самый быстрый из всех планирующих алгоритмов рассмотренных ранее, который направляется по прямой к цели. • Он так же имеет и свои слабости. Он не принимает во внимание накопленную стоимость пути, направляясь по прямой через зону с высокой стоимостью, а не обходя ее. 30

Поиск в ширину в графе • Суть метода (в сжатой формулировке): • рассматриваются все Поиск в ширину в графе • Суть метода (в сжатой формулировке): • рассматриваются все вершины, связанные с текущей. • Принцип выбора следующей вершины – выбирается та, которая была рассмотрена раньше. • Для реализации данного принципа необходима структура данных “очередь”. 31

пример 3 2 12 6 2 9 7 1 5 3 4 1 12 пример 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 Для рассматриваемого примера описание графа с помощью структур смежности имеет вид: 33

Анализ • Вычислительная сложность поиска в ширину также имеет порядок т+n, так каждая вершина Анализ • Вычислительная сложность поиска в ширину также имеет порядок т+n, так каждая вершина помещается в очередь и удаляется из очереди в точности один раз. • Имеется множество простых проблем. Одна заключается в том, что поиск идет равномерно во всех направлениях, вместо того, чтобы быть направленным в сторону цели. 34

Сравнение • Оба вида поиска в графе—в глубину и в ширину могут быть использованы Сравнение • Оба вида поиска в графе—в глубину и в ширину могут быть использованы для нахождения пути между фиксированными вершинами v и и. Достаточно начать поиск в графе с вершины v и вести его до момента посещения вершины и. • Преимуществом поиска в глубину является тот факт, что в момент посещения вершины и стек содержит последовательность вершин, определяющую путь из v в u. • Недостатком поиска в глубину является то, что полученный таким образом путь в общем случае не будет кратчайшим путем из v в и. • От этого недостатка свободен метод нахождения пути, основанный на поиске в 35 ширину.

Двунаправленный поиск в ширину • Это улучшает простой поиск в ширину тем, что запускаются Двунаправленный поиск в ширину • Это улучшает простой поиск в ширину тем, что запускаются два одновременных поиска в ширину из стартового и конечного узлов и останавливается, когда узел из одного фронта поиска находит соседний узел из другого фронта. • Это может улучшить простой поиск в ширину (обычно в 2 раза), но все еще является очень неэффективным. • Хитрости, наподобие этой, хорошо запомнить, так как они могут пригодиться в дальнейшем. • Можно доказать, что данный алгоритм корректно строит стягивающее дерево для произвольного связного графа за 0(n + m) шагов. 36

Остовное дерево наименьшей стоимости • Пусть G =(V, Е)-связный взвешенный неориентированный граф, для которого Остовное дерево наименьшей стоимости • Пусть 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 Выбранная вершина Пример 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 вершин. • Алгоритм • Шаг 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 Пример 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