Автор работы: Пользователь скрыл имя, 11 Января 2014 в 04:39, реферат
1. Графы являются моделью представления данных, основанных на отношениях между элементами множеств.
2. Для представления графов используется несколько способов: список ребер, матрица смежности, матрица инцидентности.
3. Для организации поиска на графах используются обходы в глубину и в ширину.
4. Реализацию обходов можно осуществлять рекурсивными и нерекурсивными алгоритмами.
5. От вида графа и способа его представления зависит временная сложность выполнения алгоритма.
Введение………………………………………………………………………... 3
1 Алгоритмы обхода графа……………………………………………………. 5
1.1 Поиск в глубину…………………………………………………….. 6
1.2 Поиск в ширину……………………………………………………... 7
2 Алгоритмы нахождения кратчайшего пути………………………………... 9
2.1 Алгоритм Дейкстры………………………………………………… 10
2.2 Алгоритм Флойда…………………………………………………… 12
2.3 Переборные алгоритмы…………………………………………….. 15
Заключение…………………………………………………………………….. 20
Федеральное агентство по образованию
Ангарская
государственная техническая
Кафедра вычислительных машин и комплексов
Реферат по дисциплине «Структуры и алгоритмы» на тему:
«Кратчайший маршрут: установка меток, коррекция меток, другие задачи поиска кратчайшего маршрута, алгоритм Флойда, применения метода поиска кратчайшего маршрута»
Выполнил: студент группы ИВТз-11-1
Уманцев В. А.
Проверил: доцент
Засухина О. А.
Ангарск
2013 г.
Содержание
Введение………………………………………………………… |
3 |
1 Алгоритмы обхода графа…………………… |
5 |
1.1 Поиск в глубину…………………………………………………….. |
6 |
1.2 Поиск в ширину………………………………………… |
7 |
2 Алгоритмы нахождения
кратчайшего пути……………………………….. |
9 |
2.1 Алгоритм Дейкстры………………………………… |
10 |
2.2 Алгоритм Флойда……………………………………… |
12 |
2.3 Переборные алгоритмы………………………… |
15 |
Заключение…………………………………………………… |
20 |
Введение
Теория графов в последнее время широко используется в различных отраслях науки и техники. Быстрое развитие данная теория получила с созданием электронно-вычислительной техники, которая позволяла решить многие задачи алгоритмизации.
Граф – это совокупность двух конечных множеств: множества точек и множества линий, попарно соединяющих некоторые из этих точек. Множество точек называется вершинами (узлами) графа. Множество линий, соединяющих вершины графа, называются ребрами (дугами) графа.
Ориентированный граф (орграф) – граф, у которого все ребра ориентированы, т.е. ребрам которого присвоено направление.
Неориентированный граф (неорграф) – граф, у которого все ребра неориентированы, т.е. ребрам которого не задано направление.
Смешанный граф – граф, содержащий как ориентированные, так и неориентированные ребра.
Петлей называется ребро, соединяющее вершину саму с собой. Две вершины называются смежными, если существует соединяющее их ребро. Ребра, соединяющие одну и ту же пару вершин, называются кратными.
Простой граф – это граф, в котором нет ни петель, ни кратных ребер.
Мультиграф – это граф, у которого любые две вершины соединены более чем одним ребром.
Маршрутом в графе называется конечная чередующаяся последовательность смежных вершин и ребер, соединяющих эти вершины.
Маршрут называется открытым, если его начальная и конечная вершины различны, в противном случае он называется замкнутым.
Маршрут называется цепью, если все его ребра различны. Открытая цепь называется путем, если все ее вершины различны.
Замкнутая цепь называется циклом, если различны все ее вершины, за исключением концевых.
Граф называется связным, если для любой пары вершин существует соединяющий их путь.
Вес вершины – число (действительное, целое или рациональное), поставленное в соответствие данной вершине (интерпретируется как стоимость, пропускная способность и т. д.). Вес (длина) ребра – число или несколько чисел, которые интерпретируются по отношению к ребру как длина, пропускная способность и т. д.
Взвешенный граф – граф, каждому ребру которого поставлено в соответствие некое значение (вес ребра).
Выбор структуры данных для хранения графа в памяти компьютера имеет принципиальное значение при разработке эффективных алгоритмов. Рассмотрим несколько способов представления графа.
Пусть задан граф (например, рис. 1), у которого количество вершин равно n, а количество ребер – m. Каждое ребро и каждая вершина имеют вес – целое положительное число. Если граф не является помеченным, то считается, что вес равен единице.
Рис. 1. Граф
1. Список ребер – это множество, образованное парами смежных вершин (рис. 2). Для его хранения обычно используют одномерный массив размером m, содержащий список пар вершин, смежных с одним ребром графа. Список ребер более удобен для реализации различных алгоритмов на графах по сравнению с другими способами.
Рис. 2. Список
ребер графа
2. Матрица смежности – это двумерный массив размерности nxn, значения элементов которого характеризуются смежностью вершин графа (рис. 3). При этом значению элемента матрицы присваивается количество ребер, которые соединяют соответствующие вершины. Данный способ действенен, когда надо проверять смежность или находить вес ребра по двум заданным вершинам.
Рис. 3. Матрица
смежности графа
3. Матрица инцидентности – это двумерный массив размерности nxm, в котором указываются связи между инцидентными элементами графа (ребро и вершина). Столбцы матрицы соответствуют ребрам, строки – вершинам (рис. 4). Ненулевое значение в ячейке матрицы указывает связь между вершиной и ребром. Данный способ является самым емким для хранения, но облегчает нахождение циклов в графе.
Рис. 4. Матрица
инцидентности графа
Существует много алгоритмов на графах, в основе которых лежит систематический перебор вершин графа, такой что каждая вершина просматривается (посещается) в точности один раз. Поэтому важной задачей является нахождение хороших методов поиска в графе.
1 Алгоритмы обхода графа
Под обходом графов (поиском на графах) понимается процесс систематического просмотра всех ребер или вершин графа с целью отыскания ребер или вершин, удовлетворяющих некоторому условию.
При решении многих задач, использующих графы, необходимы эффективные методы регулярного обхода вершин и ребер графов. К стандартным и наиболее распространенным методам относятся:
Эти методы чаще всего рассматриваются на ориентированных графах, но они применимы и для неориентированных, ребра которых считаются двунаправленными. Алгоритмы обхода в глубину и в ширину лежат в основе решения различных задач обработки графов, например, построения остовного леса, проверки связности, ацикличности, вычисления расстояний между вершинами и других.
1.1 Поиск в глубину
При поиске в глубину посещается первая вершина, затем необходимо идти вдоль ребер графа, до попадания в тупик. Вершина графа является тупиком, если все смежные с ней вершины уже посещены. После попадания в тупик нужно возвращаться назад вдоль пройденного пути, пока не будет обнаружена вершина, у которой есть еще не посещенная вершина, а затем необходимо двигаться в этом новом направлении. Процесс оказывается завершенным при возвращении в начальную вершину, причем все смежные с ней вершины уже должны быть посещены.
Таким образом, основная идея поиска в глубину – когда возможные пути по ребрам, выходящим из вершин, разветвляются, нужно сначала полностью исследовать одну ветку и только потом переходить к другим веткам (если они останутся нерассмотренными).
Алгоритм поиска в глубину
Шаг 1. Всем вершинам графа присваивается значение не посещенная. Выбирается первая вершина и помечается как посещенная.
Шаг 2. Для последней помеченной как посещенная вершины выбирается смежная вершина, являющаяся первой помеченной как не посещенная, и ей присваивается значение посещенная. Если таких вершин нет, то берется предыдущая помеченная вершина.
Шаг 3. Повторить шаг 2 до тех пор, пока все вершины не будут помечены как посещенные (рис. 5).
Рис. 5. Демонстрация алгоритма поиска в глубину
//Описание функции алгоритма поиска в глубину
void Depth_First_Search(int n, int **Graph, bool *Visited,
int Node){
Visited[Node] = true;
cout << Node + 1 << endl;
for (int i = 0 ; i < n ; i++)
if (Graph[Node][i] && !Visited[i])
Depth_First_Search(n,Graph,
}
Также часто используется нерекурсивный алгоритм поиска в глубину. В этом случае рекурсия заменяется на стек. Как только вершина просмотрена, она помещается в стек, а использованной она становится, когда больше нет новых вершин, смежных с ней.
Временная сложность зависит от представления графа. Если применена матрица смежности, то временная сложность равна O(n2), а если нематричное представление – O(n+m): рассматриваются все вершины и все ребра.
1.2 Поиск в ширину
При поиске в ширину, после посещения первой вершины, посещаются все соседние с ней вершины. Потом посещаются все вершины, находящиеся на расстоянии двух ребер от начальной. При каждом новом шаге посещаются вершины, расстояние от которых до начальной на единицу больше предыдущего. Чтобы предотвратить повторное посещение вершин, необходимо вести список посещенных вершин. Для хранения временных данных, необходимых для работы алгоритма, используется очередь – упорядоченная последовательность элементов, в которой новые элементы добавляются в конец, а старые удаляются из начала.
Таким образом, основная идея поиска в ширину заключается в том, что сначала исследуются все вершины, смежные с начальной вершиной (вершина с которой начинается обход). Эти вершины находятся на расстоянии 1 от начальной. Затем исследуются все вершины на расстоянии 2 от начальной, затем все на расстоянии 3 и т.д. Обратим внимание, что при этом для каждой вершины сразу находятся длина кратчайшего маршрута от начальной вершины.
Алгоритм поиска в ширину
Шаг 1. Всем вершинам графа присваивается значение не посещенная. Выбирается первая вершина и помечается как посещенная (и заносится в очередь).
Шаг 2. Посещается первая вершина из очереди (если она не помечена как посещенная). Все ее соседние вершины заносятся в очередь. После этого она удаляется из очереди.
Шаг 3. Повторяется шаг 2 до тех пор, пока очередь не пуста (рис. 6).
Рис. 6. Демонстрация
алгоритма поиска в ширину
//Описание функции алгоритма поиска в ширину
void Breadth_First_Search(int n, int **Graph,
bool *Visited, int Node){
int *List = new int[n]; //очередь
int Count, Head; // указатели очереди
int i;
// начальная инициализация
for (i = 0; i < n ; i++)
List[i] = 0;
Count = Head = 0;
// помещение в очередь вершины Node
List[Count++] = Node;
Visited[Node] = true;
while ( Head < Count ) {
//взятие вершины из очереди
Node = List[Head++];
cout << Node + 1 << endl;
// просмотр всех вершин, связанных с вершиной Node
for (i = 0 ; i < n ; i++)
// если вершина ранее не просмотрена
if (Graph[Node][i] && !Visited[i]){
// заносим ее в очередь
List[Count++] = i;
Visited[i] = true;
}
}
}
Сложность поиска в ширину при нематричном представлении графа равна O(n+m), ибо рассматриваются все n вершин и m ребер. Использование матрицы смежности приводит к оценке O(n2).
2 Алгоритмы нахождения кратчайшего пути
Нахождение кратчайшего пути на сегодняшний день является жизненно необходимой задачей и используется практически везде, начиная от нахождения оптимального маршрута между двумя объектами на местности (например, кратчайший путь от дома до университета), в системах автопилота, для нахождения оптимального маршрута при перевозках, коммутации информационного пакета в сетях и т.п.
Кратчайший путь рассматривается при помощи некоторого математического объекта, называемого графом. Поиск кратчайшего пути ведется между двумя заданными вершинами в графе. Результатом является путь, то есть последовательность вершин и ребер, инцидентных двум соседним вершинам, и его длина.
Рассмотрим три наиболее эффективных алгоритма нахождения кратчайшего пути:
Указанные алгоритмы легко
выполняются при малом
2.1 Алгоритм Дейкстры
Данный алгоритм является алгоритмом на графах, который изобретен нидерландским ученым Э. Дейкстрой в 1959 году. Алгоритм находит кратчайшее расстояние от одной из вершин графа до всех остальных и работает только для графов без ребер отрицательного веса.
Каждой вершине приписывается вес – это вес пути от начальной вершины до данной. Также каждая вершина может быть выделена. Если вершина выделена, то путь от нее до начальной вершины кратчайший, если нет – то временный. Обходя граф, алгоритм считает для каждой вершины маршрут, и, если он оказывается кратчайшим, выделяет вершину. Весом данной вершины становится вес пути. Для всех соседей данной вершины алгоритм также рассчитывает вес, при этом ни при каких условиях не выделяя их. Алгоритм заканчивает свою работу, дойдя до конечной вершины, и весом кратчайшего пути становится вес конечной вершины.
Шаг 1. Всем вершинам, за исключением первой, присваивается вес равный бесконечности, а первой вершине – 0.
Шаг 2. Все вершины не выделены.
Шаг 3. Первая вершина объявляется текущей.