Все материалы, размещенные на этой страничке украдены с других сайтов. Владельцев авторских и прочих прав прошу меня простить.


Графы

Владимир Давыдов
СИ-307
2004
Путь минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Дейкстры)
Нахождение K путей минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Йена)

Граф G задается множеством точек (вершин) х1, х2,..., хn. (которое обозначается через Х) и множеством линий (ребер) а1, а2,...,аm. (которое обозначается символом А), соединяющих между собой все или часть этих точек. Таким образом, граф G полностью задается (и обозначается) парой (Х, А). Если ребра из множества А ориентированы, что обычно показывается стрелкой, то они называются дугами, и граф с такими ребрами называется ориентированным графом, .
    Например, если дорога имеет не двух-, а одностороннее движение то направление этого движения будет показано стрелкой.
    Если ребра не имеют ориентации, то граф называется неориентированным , (двухстороннее движение).
    В ориентированном графе дуга обозначается упорядоченной парой, состоящей из начальной и конечной вершин (т.е. двумя концевыми вершинами дуги), ее направление предполагается заданным от первой вершины ко второй. Так, например, на рис. 2 обозначение (х13) относится к дуге а1.
    Другое, употребляемое чаще описание ориентированного графа G состоит в задании множества вершин Х и соответствия Г, которое показывает как между собой связаны вершины. Соответствие Г называется отображением множества Х в Х, а граф в этом случае обозначается парой G=(Х, Г). Так, например, для графа на рис. 2:
    Г (х1)={х2, х3}, т.е. вершины х2 и х3 являются конечными вершинами дуг, у которых начальной вершиной является вершина х1.
    На рис. 3: Г (х1)={х2, х4, х5}, (неориентированное ребро представляется как две противоположно направленные дуги, соединяющие те же самые вершины.)
   Путем (или ориентированным маршрутом) ориентированного графа называется последовательность дуг, в которой конечная вершина всякой дуги, отличной от последней, является начальной вершиной следующей.
Так, на рис. 5 последовательности дуг

а6, а5, а9, а8, а4. (1)
а1, а6, а5, а9. (2)
а1, а6, а5, а9, а10, а6, а4. (3)

являются путями.
   Ориентированной цепью (орцепью) называется такой путь, в котором каждая дуга используется не больше одного раза. Так, например приведенные выше пути (1) и (2) являются орцепями, а путь (3) не является таким, т.к. дуга а6 в нем используется дважды.
   Простой орцепью называется такой путь, в котором каждая вершина используется не более одного раза. Например, путь (2) является простой орцепью, а пути (1) и (3) – нет.
   Маршрут есть неориентированный “двойник” пути, и это понятие рассматривается в тех случаях, когда можно пренебречь направленностью дуг в графе. Таким образом, маршрут есть последовательность ребер ä1, ä2,..., äq, в которой каждое ребро аq за исключением первого и последнего ребер, связано с ребрами аi-1 и аi+1 своими концевыми вершинами. Последовательности дуг:

ä2, ä4, ä8, ä10, (4)
ä2, ä7, ä8, ä4, ä3, (5)
ä10 , ä7 , ä4 , ä8 , ä7 , ä2. (6)

в графе, изображенном на рис. 5, являются маршрутами; две точки над символом дуги означают, что ее ориентацией пренебрегают, т.е. дуга рассматривается как неориентированное ребро. Также путь или маршрут можно изображать последовательностью вершин. Например, путь (1) будет выглядеть следующем образом: х2, х5, х4, х3, х5, х6. Иногда дугам графа приписываются числа, называемые весом, стоимостью, или длиной этой дуги. В этом случае граф называется графом со взвешенными дугами. А если вес приписывается вершинам графа, то тогда получается граф со взвешенными вершинами. Если в графе веса приписаны и дугам и вершинам, то он называется просто взвешенным. При рассмотрении пути µ представленного последовательностью дуг (ä1, ä2,..., äq), за его вес принимается число l(µ), равное сумме весов всех дуг, входящих в µ, т.е.

   Пусть дан граф G=(Х, Г), дугам которого приписаны веса (стоимости/длины), задаваемые матрицей С=[cij]. Задача о кратчайшем пути состоит в нахождении кратчайшего пути от заданной начальной вершины sx до заданной конечной вершины tx, при условии, что такой путь существует tR(s) (здесь R(s)-множество, достижимое из вершины s.) и все циклы в графе имеют неотрицательный суммарный вес. Так как если в графе будет присутствовать цикл с отрицательным суммарным весом и хi- некоторая его вершина, то, двигаясь от s к хi, обходя этот цикл достаточно большое число раз и попадая, наконец в t, получится путь со сколь угодно малым () весом. Таким образом, в этом случае кратчайшего пути не существует. Так что неориентированные дуги (ребра) графа G не могут иметь отрицательные веса.
   Следующие задачи являются непосредственными обобщениями сформулированной выше задачи о кратчайшем пути.
1)Для заданной начальной вершины s найти кратчайшие пути между s и всеми другими вершинами хiX.
2)Найти кратчайшие пути между всеми парами вершин.
Почти все методы, позволяющие решить задачу о кратчайшем (s-t)-пути, дают также (в процессе решения) и все кратчайшие пути от s к хi. Таким образом, они позволяют решить задачу с небольшими дополнительными вычислительными затратами. С другой стороны, задача №1 может быть решена либо n-кратным применением алгоритма задачи №2, причем на каждом шаге в качестве начальной вершины s берутся различные вершины, либо однократным применением специального алгоритма.
Наиболее распространенные методы их решения – это использование алгоритма Дейкстры (для нахождения кратчайшего пути между двумя вершинами), алгоритма Флойда (для нахождения кратчайших путей между всеми парами вершин) и алгоритма Йена (для нахождения k – кратчайших путей в графе).

Путь минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Дейкстры)

Процедура находит путь минимального веса в графе G = (V, E) заданном весовой матрицей W у которой элемент wij  равен весу ребра соединяющего i-ую и j-ую вершины. При этом предполагается, что все элементы wij  неотрицательны. Путь ищется из вершины номер u к вершине номер u. Процедура использует алгоритм Дейкстры. Для представления веса, равного бесконечности, используется число GM, передаваемое в алгоритм. Это число можно задавать в зависимости от конкретной задачи.

Алгоритм по которому происходит поиск заключается в следующем:

  1. всем веpшинам пpиписывается вес - вещественное число, d(i) := GM для всех вершин кроме вершины с номером u, а d(u) := 0
  2. всем веpшинам пpиписывается метка m(i) := 0
  3. вершина u объявляется текущей: t := u
  4. для всех вершин у которых m(i) равно 0, пересчитываем вес по формуле: d(i) := min{d(i), d(t)+W[t,i]}
  5. среди вершин для которых выполнено m(i) = 0 ищем ту для которой d(i) минимальна, если минимум не найден, т.е. вес всех не "помеченных" вершин равен бесконечности (GM), то путь не существует, покидаем алгоритм
  6. иначе найденную вершину c минимальным весом полагаем текущей и помечаем (m(t) := 1)
  7. если t = u, то найден путь веса d(t), покидаем алгоритм
  8. переходим на шаг 4.

На выходе имеем переменную length, которая определяет длину пути (length равно -1 если пути не существует, length равно 0, если u равно u), переменную Weight - вес пути и массив Path содержащий последовательность номеров вершин определяющих путь. В алгоритме не упомянуто, как же определить сам путь, но это легко выяснить, если посмотреть блок-схему.


Нахождение K путей минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Йена)

Алгоритм предназначен для нахождения К путей минимальной длины во взвешеном графе соединяющих вершины u, u. Ищутся пути, которые не содержат петель. Алгоритм прислал Pavel Mikheyev.

Итак задача состоит в отыскании нескольких минимальных путей, поэтому возникает вопрос о том чтобы не получить путь содержащий петлю, в случае поиска одного пути минимального веса, это условие выполняется по необходимости, в данном же случае мы используем алгоритм Йена, позволяющий находить K кратчайших простых цепей.

Работа алгоритма начинается с нахождения кратчайшего пути, для этого будем использовать уже описанный алгоритм Дейкстры. Второй путь ищем перебирая кратчайшие отклонения от первого, третий кратчайшие отклонения от второго и т.д. Более точное пошаговое описание:

  1. Найти минимальный путь P = (v 1, ..., v 1L[1] ). Положить k = 2. Включить P в результирующий список.
  2. Положить MinW равным бесконечности. Найти отклонение минимального веса, от (k–1)-го кратчайшего пути Pk-1  для всех i = 1, 2, ..., L[k-1], выполняя для каждого i шаги с 3-го по 6-й.
  3. Проверить, совпадает ли подпуть, образованный первыми i вершинами пути Pk-1 , с подпутем, образованным первыми i вершинами любого из путей j = 1, 2, ..., k–1. Если да, положить W[v k-1, v ji+1 ] равным бесконечности в противном случае ничего не изменять (чтобы в дальнейшем исключить получение в результат одних и тех же путей).
  4. Используя алгоритм нахождения кратчайшего пути, найти пути от v k-1 к u, исключая из рассмотрения корни (v k-1, ..., v k-1) (чтобы исключить петли), для этого достаточно положить равными бесконечности элементы столбцов и строк матрицы W, соответствующие вершинам входящим в корень.
  5. Построить путь, объединяя корень и найденное кратчайшее ответвление, если его вес меньше MinW, то запомнить его.
  6. Восстановить исходную матрицу весов W и возвратиться к шагу 3.
  7. Поместить путь минимального веса (MinW), найденый в результате выполнения шагов с 3 по 6, в результирующий список. Если k = K, то алгоритм заканчивает работу, иначе увеличить k на единицу и вернуться к шагу 2.

Алгоритм использует массив p для результирующего списка путей, и массив length для хранения соответствующих длин, при этом если начиная с некоторого i элементы length[i] равны -1, значит существует только i-1 кратчайшех путей без петель.


Hosted by uCoz