![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Пусть G=(V, A) —ориентированный взвешенный граф. Задача о кратчайшем пути состоит в отыскании пути минимального веса, соединяющего заданные начальную и конечную вершины графа G при условии, что хотя бы один такой путь существует. Начальную и конечную вершины обозначим соответственно через s и t; (s, t)-путь минимального веса будем называть кратчайшим (s, t)-путем.
Вначале рассмотрим случай, когда веса всех дуг графа неотрицательны, т. е. w(e) ≥ 0 для каждой дуги е € А. В этом случае решение задачи о кратчайшем пути является существенно менее трудоемким, чем в общем случае. Первый эффективный алгоритм построения кратчайшего пути в графе с неотрицательными весами дуг предложил Е. Дийкстра в 1959 г.
На каждой итерации этого алгоритма всякая вершина и графа G имеет метку l(v), которая может быть постоянной либо временной. В первом случае l(v) — вес кратчайшего (s, v) -пути. Если же метка l(v) временная, то l(v) —вес кратчайшего (s, v) -пути, проходящего только через вершины с постоянными метками. Таким образом, временная метка l(v) является оценкой сверху для веса кратчайшего (s, v) -пути, и став на некоторой итерации постоянной, она остается такой до конца работы алгоритма. Кроме l(v), с каждой вершиной v графа G, за исключением s, связывается еще одна метка— θ(v). На каждой итерации θ(v) является номером вершины, предшествующей v в (s, v) -пути, имеющем минимальный вес среди всех (s, v) -путей, проходящих через вершины, получившие к данному моменту постоянные метки. После того как вершина t получила постоянную метку, с помощью меток θ(v) легко указать последовательность вершин, составляющих кратчайший (s, t) -путь.
Перед началом первой итерации алгоритма вершина s имеет постоянную метку l(s)=0, а метки l всех остальных вершин равны ∞ и эти метки временные. Общая итерация алгоритма состоит в следующем. Пусть р — вершина, получившая постоянную метку l(р) на предыдущей итерации. Просматриваем все вершины v € Г (р), имеющие временные метки, с целью уменьшения (если это возможно) этих меток. Метка l(v) вершины Г (p) заменяется на l(p)+w(p, v), если оказалось, что l(v)>l(p)+ w(p, v). В этом случае говорим, что вершина v получила свою метку l из вершины p, и полагаем θ(v) = p. Если же l(v) ≤ l(p)+ w(p, v), то метки θ и l вершины v не изменяются на данной итерации. Алгоритм заканчивает работу, когда метка l(t) становится постоянной. Как уже говорилось выше, l(t) —вес кратчайшего (s, t)-пути, который будем обозначать через Р*. Этот
![]() |
где для любой вершины v € VG.
Будем считать, что граф G задан матрицей весов либо списками смежности.
Алгоритм A5 Дийкстры поиска кратчайшего пути.
1. Положить l(s): = 0 и считать эту метку постоянной. Положить l(v):=∞ для всех v € VG,
v≠s, и считать эти метки временными. Положить р:= s.
2.
![]() |
3. Пусть V’ — множество вершин с временными метками l. Найти вершину v*, такую что
Считать метку l(v*) постоянной меткой вершины v*.
4. p:=v*. Если p = t, то перейти к п. 5 [ l(t) —вес кратчайшего пути]. Иначе перейти к п. 2.
5. P*:=(s,..., θ3(t), θ2(t), θ(t), t) [ P* - кратчайший путь]. Конец.
Прежде чем перейти к обоснованию алгоритма, сделаем три полезных замечания.
Замечание 1. Как легко видеть, алгоритм A5 применим к смешанным и, в частности, к неориентированным графам. Для этого достаточно каждое неориентированное ребро uv графа, имеющее вес w(u, v), рассматривать как пару дуг (и, v) и (v, и) того же веса.
Замечание 2. Если п. 4 модифицировать так, чтобы алгоритм заканчивал работу только после получения всеми вершинами постоянных меток, то он будет строить кратчайшие пути из s в каждую из остальных вершин. Если к тому же вместе с превращением метки вершины v * в постоянную (п. 3 алгоритма) заносить дугу (θ (v *), (v *) в множество А*, то после окончания работы алгоритма граф D=(VG, А*) будет корневым ориентированным остовным деревом. Это дерево называют деревом ратчайших путей из s графа G. Для любой вершины v € VG единственный (s, v) -путь в дереве D является кратчайшим (s, v) -путем в графе G.
Замечание 3. Алгоритм A5, модифицированный так, как указано в замечании 2, можно рассматривать как алгоритм построения дерева D кратчайших путей из вершины s графа G. С этой точки зрения алгоритм A5 аналогичен алгоритму A3 построения минимального остова. Действительно, построение дерева D состоит в последовательном увеличении уже построенного фрагмента путемдобавления некоторой дуги, «выходящей» из этого рагмента. При этом метки l и θ играют такую же роль, как и метки α и β в алгоритме A3.
Утверждение 76.1. Алгоритм A5 строит в графе кратчайший (s, t)-путь за время O(|G|2). Заметим вначале, что метка вершины v (l(v)≠∞) равна весу (s, v)-пути, который построен алгоритмом к тому моменту. Он определяется метками θ, имеющимися в заданный момент. Поэтому для доказательства оптимальности (s, t) -пути, соответствующего постоянной метке l(t), достаточно доказать, что постоянная метка l(v) каждой вершины v равна весу кратчайшего (s, v)-пути. Это утверждение будем доказывать по индукции. Пусть вершина v получила свою постоянную метку на k- й итерации, т. е. после k- говыполнения п. 3. При k = 1 справедливость утверждения очевидна. Предположим, что оно верно для вершин, получивших свои постоянные метки на итерациях 2, 3,..., k — 1. Обозначим через Р° (s, v)- путь, построенный алгоритмом в результате k итераций, а через Р* — кратчайший (s, v) -путь. По условию w(P°)= l(v). Пусть V1 и V2 — множества вершин, имеющих соответственно постоянные и временные метки перед началом k- йитерации. Рассмотрим две возможные ситуации:
![]() |
![]() |
т. е. Р° — кратчайший ( s, v) -путь.
![]() |
![]() |
Таким образом, и в случае б) верно неравенство w(P0) ≤ w(P*), т. е. Р° — кратчайший (s, v) -путь.
Оценим теперь трудоемкость алгоритма. Вычислительные затраты максимальны, когда вершина t получает постоянную метку последней и граф G является полным. В этом случае число итераций алгоритма равно |G| — 1, т. е. каждый из пп. 2—4 выполняется | G | - 1 раз. Очевидно, что п. 4 выполняется за время O(1), а для выполнения каждого из пп. 2, 3 достаточно времени O(|G|).
построение пути с помощью меток θ можно осуществить, потратив не более O(|G|) операций. Таким образом, вцелом время построения кратчайшего (s, t) -пути не превосходят O(|G|2).
П рим ер 1. На рис. 76.1 изображены пятькопий G k (k — 1, 5) графа G, каждая из которых отражает ситуацию, сложившуюся после очередной итерации алгоритма. Окол о каж дой дуги написан ее вес. Вершинам копии Gk (k = 1, 5) приписаны метки, полученные ими в результате выполнения первых k итераций. Некоторые дуги обведены жирными линиями, т. е. отмечены. Добавление такой дуги (а, b) при переходе от Gk к Gk+1 означает, что вершина b получила свою метку l(b) из а и эта метка стала постоянной на (k+1)- йитерации. Вершина t в нашем примере получает постоянную метку последней, и отмеченные дуги Gs образуют дерево кратчайших путей из s.
При решении многих задач возникает необходимость отыскания в невзвешенном графе (s, t) -пути с минимальным количеством дуг. Такой путь, очевидно, можно найти с помощью алгоритма Дийкстры. Для этого достаточно присвоить всем дугам графа G веса, равные 1, и применить алгоритм A5. Проследим работу алгоритма в этой ситуации, обращая особое внимание на последовательность, в которой вершины графа G получают постоянные метки. Очевидно, что вначале постоянные метки l=1 получат все вершины множества Г (s). Затем метка l = 2 будет присвоена концам дуг, выходящих из Г (s). Вообще, постоянную метку l=k получают еще не помеченные вершины, являющиеся концами дуг, исходящих из вершин с метками l= k - 1. Этот процесс обхода (и присвоения меток) вершин графа называют поиском в ширину в графе (на интуитивном уровне поиск в ширину описан в § 9). По окончании поиска в ширину метка l(х) вершины х равна минимальному числу дуг в (s, x)- пути. Как и ранее, сам этот путь определяется метками θ. Осуществление поиска в ширину с помощью алгоритма Дийкстры связано, как мы знаем, с вычислительными затратами O(|G|2).
Рассмотрим алгоритм A6, осуществляющий поиск в ширину за время O(|EG|). В этом алгоритме метки l и θ играют ту же роль, что и в предыдущем, с той, однако, разницей, что метки l не делятся на временные и постоянные. Как только вершина х получает метку l(х)≠∞, эта метка сразу становится постоянной (т. е. окончательной). За счет этого, в частности, достигается экономия времени вычислений по сравнению с алгоритмом Дийкстры.
Особую роль в алгоритме A6 играет список Q. Каждая вершина графа один раз заносится в этот список иодин раз из него вычеркивается. При этом вычеркивается все время первая (на данный момент) вершина этого списка, а только что добавленная вершина всегда является последней в списке, т. е. Q — очередь. Вначале в Q находится единственная вершина s, l(s)=0, а все остальные вершины меток не имеют. Общая итерация состоит в следующем. Выбирается первая вершина х в списке Q. Каждой непомеченной вершине у € Г (х) присваиваются метки l(у)= l(х)+ 1 и θ(y)=x, после чего вершина у становится последней в списке Q, а вершина х удаляется из Q. Алгоритм прекращает работу, как только в Q не останется ни одной вершины. При этом вершины, достижимые из s, будут иметь метки, а недостижимые — нет. Для быстрого выполнения операций вычеркивания и включения элементов в Q используются переменные указатели р и q — адреса первой ипоследней занятых ячеек списка Q соответственно.
Будем считать, что граф G задан списками смежности и Nv — список, содержащий концы всех дуг, исходящих из вершины v. Алгоритм A6 поиска в ширину.
1. Q (1):= s, p:=1, q:=1, l(s):=0.
2. х:= Q(p), m:= |Г (х)| I [выбрана первая вершина х очереди Q].
[Пп. 3—5 — присвоение меток непомеченным вершинам из Т(х)].
3. k:=1.
4. Если вершина у = Nx(k) имеет метку, то перейти к п. 5. Иначе l(y):= 1(х)+ 1, θ(y):=x, q:=q+1,Q(q):=y [вершина у помечена и включена в очередь Q ]и перейти к п. 5.
5. Если k= т, то перейти к п. 6, иначе k:= k + 1 и перейти к п. 4.
6. р:= р + 1 [вершина х исключена из Q ].
7. Если р> q, то конец [ Q = ¢, т. е. все вершины,достижимые из s, получили метки], иначе перейти к п. 2.
Утверждение 76.2. Алгоритм A6 присваивает метки l и θ всем вершинам графа, достижимым из вершины s за время O(|EG|). При этом (s,..., θ3(x), θ 2 (x), θ(x), х) — (s, х)-путь с минимальным числом дуг, а l(х) — число дуг в этом пути.
Основные вычислительные затраты связаны с выполнением п. 3 алгоритма. Суммарное время выполнения этого пункта составляет, поскольку каждый из списков Nv просматривается в точности один раз. Затраты на выполнение других пунктов, очевидно, не превосходят этой величины.
Выше отмечалось, что результаты алгоритма A6 (т. е. метки l и θ) те же, что и в алгоритме Дийкстры, если каждой дуге графа G приписать вес, равный 1. Поэтому справедливость второго утверждения следует из утверждения 76.1.
Замечание 4. Иногда требуется искать пути из вершин множества X € VG во все остальные вершины. Для решения этой задачи достаточно слегка модифицировать алгоритм A6 изменив в нем п. 1. Именно, в список Q следует поместить все вершины множества X и положить l(х)=0 для каждой вершины х € Х. На модифицированный таким образом алгоритм A6 будем ссылаться как на поиск в ширину из множества X.
Перейдем теперь к рассмотрению общей ситуации, Будем считать, что в графе G допускаются дуги отрицательного веса. Предлагаемый ниже алгоритм A7 строит в таком графе кратчайшие пути между всеми парами вершин графа при условии, что в графе нет отрицательных контуров (контуров отрицательного веса). Если же такой контур в графе имеется, то алгоритм сообщает об этом и прекращает работу, оставляя задачу отыскания кратчайшего пути нерешенной (см. ниже замечание 6). Будем считать, что граф G, |G|=n, задан матрицей весов W = |Wij |, т. е. Wij = w(i, j), если (i, j) € AG, и Wij=∞ в противном случае. Кроме того, полагаем Wu = 0 для всех i =l, 2,..., п. Алгоритм основан на следующих соображениях. Пусть i, j, k — три любые вершины графа G, и мы хотим получить (i,j) -путь, кратчайший среди (i,j) -путей, не содержащих внутренних вершин, отличных от k. Очевидно, что для этого достаточно выбрать меньшую из двух величин Wij и Wij + Wkj, которая и будет весом такого (i,j) -пути. Если зафиксировать k и проделать эту операцию (назовем ее t-операцией, примененной к индексу k) для всех пар (i, j), то получим матрицу W = || W’ij ||. У которой W’ij= min {Wij, Wik + Wkj}. Оказывается (это будет позднее доказано), имея матрицу Ws весов кратчайших путей, проходящих только через вершины множества S € VG, можно получить такую же матрицу для путей, проходящих через множество S U {m}, m¢ S. Для этого достаточно применить t -операцию к индексу т ивсем элементам матрицы Ws. Именно в этом и состоит итерация алгоритма A7, который, начиная с W° = W, строит такую последовательность матриц W°, W1,..., Wn, что Wm получается из Wm-1 применением t -операции к индексу т и матрице Wm-1. Если в графе G нет отрицательных контуров, то элемент Wijm матрицы Wm при каждом т равен весу кратчайшего (i, j) - пути, все внутренние вершины которого принадлежат множеству {1, 2,..., т }. Таким образом, последняя из этих матриц, Wn, содержит веса кратчайших путей между всеми парами вершин графа. Для того чтобы после окончания работы алгоритма иметь возможность быстро найти кратчайший путь между любой парой вершин, будем на k- йитерации вместе с матрицей Wk стр оить матрицу Рk = | | Pij| |. Вначале полагаем Pij0 = i(i,j= 1, п). Далее, на k- йитерации полагаем Pijk = Pijk-1 если Wijk = Wijk-1 и Pijk = Pkjk-1, если Wijk = Wikk-1 + Wkjk-1. Таким образом, Pijk — номер вершины, предшествующей вершине j в текущем (i, j) - пути, т. е. в кратчайшем (i, j) - пути, все внутренние вершины которого содержатся в множестве (1, 2,..., k). Матрица Рп = || Pijn | | играет ту же роль, что и метки θ в предыдущих алгоритмах A5 и A6. С помощью этой матрицы кратчайший (i, j) - путь L(i, j) определяется следующим образом: L(i, j) = (i,..., j3, j2, j1, j), где j1 = Pijn, j2 = Pij1n, j3 = Pij2n
Алгоритм A7 отыскания кратчайших путей между всеми парами вершин.
1. W0:=W, k:= 1, P°:= ||Pij0|| где Pij0=i если Wij ≠ ∞, и Pij0 = 0 в противном случае.
2. Выполнить для всех (i, j)=1,n если Wijk-1< Wikk-1 + Wkjk-1, то Wijk = Wijk-1, Pijk = Pijk-1. Иначе Wijk:= Wikk-1 + Wkjk-1, Pijk:= Pkjk-1.
3. Если для некоторого l, 1≤ l ≤ n, то конец [в графе имеется отрицательный контур]. Иначе перейти к п. 4.
4. k:=k+1. Если k = n +1, то конец [ Wn = || Wijn | | —матрица весов кратчайших путей, определяемых с по мощью матрицы Рп = || Pijn | |].
Замечание 5. Алгоритм будет применим к смешанным графам, если каждое неориентированное ребро заменить на две дуги того же веса (см. замечание 2).При этом следует учесть, что неориентированное ребро отрицательного веса сразу приводит к отрицательному контуру.
Замечание 6. Алгоритм «отказывается» строить кратчайшие пути, когда в графе G имеются отрицательные контуры. В этом случае задача отыскания кратчайшего пути между двумя вершинами (или между всеми парами вершин) остается корректной, но становится очень трудной. Можно показать, что она не менее трудна, чем, например, задача о коммивояжере.
Перейдем теперь к обоснованию алгоритма A7 и оценке его трудоемкости.
Утверждение 76.3. Пусть взвешенный ориентированный мулътиграф L имеет эйлерову цепь, соединяющую вершины а и b. Если в L нет отрицательных контуров, то в нем имеется такой (а, b)-путъ Р, что
w(L) ≥ w(P).
![]() |
Поэтому вершины а и b принадлежат одной его слабой компоненте L", и последняя содержит эйлерову (а, b)-цепь. Продолжая подобным образом, получим требуемый (а, b) -путь.
Утверждение 76.4. Если в графе нет отрицательных контуров, то при всех k, i, j = 1, п. Wijk — вес кратчайшего (i, j)-пути, все внутренние вершины которого содержатся в множестве {1, 2,..., k}.
Доказываем индукцией по k. При k = 1 справедливость утверждения очевидна. Предположим, что оно справедливо для 2, 3,..., k— 1, и рассмотрим Wijk. Пусть Р° — кратчайший (i,j)-путь, все внутренние вершины которого принадлежат множеству {1, 2,..., k }. Если Р° не включает вершину k, то Wijk = Wijk-1 и, согласно предположению индукции, w(P°) = Wijk-1 = Wijk. Допустим теперь, что Р° содержит вершину k. Обозначим через P10 и P20 части пути Р° от i до k и от k до j соответственно. Предположим, что один из этих путей, например P10, не является кратчайшим, и пусть Р' — кратчайший (i, k)- путь, все вершины которого содержатся в множестве {1, 2,..., к - 1}. Рассмотрим мультиграф L, получающийся из графа Р' U P20 заменой каждой дуги, входящей одновременно в Р' и P20, двумя экземплярами этой дуги. Очевидно, что L не содержит отрицательных контуров. Поэтому, согласно утверждению 76.3, L содержит такой (i, j)-путь Р, что w(L) ≥ w(P) и, следовательно, w(P°) = w(P10) + w(P20) > w(P') + w (P20) = w(L) ≥ w(P). Это неравенство противоречит минимальности Р°.
![]() |
Теорема 76.5. Время работы алгоритма A7 не превосходит O(|G|3). Если граф G не содержит отрицательных контуров, то Wijn — вес кратчайшего (i, j)-пути в графе G для всех i, j = 1, п, п=|G|. Если же такие контуры в графе имеются, то существуют такие числа т. иl,что Wllm <0.
Справедливость первого утверждения теоремы очевидна, поскольку каждая из не более чем | G | итераций выполняется за время O|G|2.
Второе утверждение теоремы непосредственно следует из утверждения 76.4.
Допустим теперь, что граф G содержит отрицательные контуры. Пусть m — такой наименьший индекс, что для некоторой вершины l в графе G имеется отрицательный контур S, содержащий только l и некоторые вершины множества (1, 2,..., m). Ясно, что контур S включает вершину т. Тогда при любых i,j = 1, п число Wijm-1 равно весу кратчайшего (i, j) -пути, все внутренние вершины которого принадлежат множеству {1, 2,..., m—1 }. Доказательство этого факта дословно повторяет доказательство утверждения 76.4. Контуру S соответствуют (l, m)-путь P1 и (т, 1)- путь P2, такие, что P1U P2 = S. Поскольку внутренние вершины путей P1 и P2 принадлежат множеству {1, 2,..., m-1 }, то w(P1)≥ Wmlm-1, w(P2) ≥Wlmm-1. Следовательно, Wmlm-1 + Wlmm-1≤ w (Р1) + w(P2) = w(S), т. е. Wllm = min { 0, Wmlm-1 + Wlmm-1 }< 0.
![]() |
Найдем, например, с помощью матрицы Р4 кратчайший (2 1)-путь: P214 = 4, P244 = 3, P234 = 2.Следовательно, (2, 3, 4, 1)—кратчайший (2, 1)-путь.
Дата публикования: 2015-01-23; Прочитано: 237 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!