Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 8.doc
Скачиваний:
20
Добавлен:
10.02.2016
Размер:
170 Кб
Скачать
☆

Нахождение кратчайшего пути в связывающей сети

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

О п р е д е л е н и е. Путем называется последовательность вершин ir = (i, j, …, r) или последовательность дуг (ребер) ir = {(i, j ), …, (к, r)}, соединяющих пару вершин i и r графа G.

Сумма приписанных дугам (ребрам) весов в пути ir определяет длину пути.

Путь из вершины i в вершину r, имеющий минимально возможную длину, называется кратчайшим путем.

Сеть называется связывающей, если в ней для каждой пары вершин имеется по крайней мере один соединяющий их путь.

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

Пусть дана связывающая сеть G, в которой каждой дуге (ребру) приписан положительный вес, пропорциональный ее (его) длине. Требуется найти путь st между заданными вершинами s и t, имеющий минимально возможную длину, т. е.

L = lij® min (на М),

где М – множество всех возможных путей из s в t.

Одним из наиболее эффективных алгоритмов, решающих поставленную задачу, является алгоритм Дейкстры, носящий имя автора.

Особенностью этого алгоритма является тот факт, что в процессе его выполнения одновременно строятся кратчайшие пути из заданной вершины s во все остальные вершины сети. Это объясняется тем, что любая вершина i Î N может оказаться промежуточной в кратчайшем пути из s в t. По окончании работы алгоритма вершина s оказывается связанной со всеми остальными вершинами связывающей сети G, в том числе и с вершиной t, кратчайшими путями, а дуги (ребра), вошедшие в них, образуют некоторую подсеть без циклов, т. е. дерево с корнем в вершине s.

Работа алгоритма реализуется с помощью расстановки у вершин пометок вида (Lsj, i), где Lsj – длина кратчайшего пути из исходной вершины s в некоторую вершину j, а i предшествующая j вершина в этом пути.

Пометки делятся на временные и постоянные. Временные пометки могут изменяться в результате работы алгоритма, а постоянные – не изменяются.

Ниже приводится алгоритм Дейкстры в пошаговой форме.

Шаг 0. Для вершины s полагается Lss= 0, а для остальных вершин Lsj = ¥ . Все вершины имеют временные пометки вида (Lsj, s).

Шаг 1. Среди вершин с временными пометками выбираем вершину r, для которой Lsr= min(Lsj ). Пометка вершины r становится постоянной.

Шаг 2. Если все вершины сети получили постоянные пометки – конец работы алгоритма. В противном случае переход к шагу 3.

Шаг 3. Пересчитываем временные пометки для вершин, смежных вершине r, получившей постоянную пометку на шаге 1, в соответствии с выражением Lsj = min(Lsj,Lsr + Lrj ).

Переход к шагу 1.

Трассировка пути st составляется в обратном направлении, следуя из вершины t в s, руководствуясь вершинами i в постоянных пометках.

Найдем кратчайший путь из вершины s в вершину t в сети, изображенной на рис. 5.10. Веса, проставленные возле ребер, определяют их длины.

Рисунок 1. Иллюстрация работы алгоритма Дейкстры

Шаг 0. Пометка P для вершины s имеет вид: Рs = (0,0). Для остальных вершин Рi = (¥,s). Все пометки временные.

Шаг 1. Среди временных пометок наименьший параметр длины имеет вершина s, так как Lss= 0. Ее пометка становится постоянной (отметим ее двойными скобками)

Шаг 2. Пересчитываем временные пометки для вершин, смежных вершине s. Для вершины 1 параметр длины

Ls1 = Lss + ls1 = 0 + 15 = 15

Полученное значение меньше имеющегося (Lsi = ¥), и поэтому новое значение временной пометки будет P1 = (15, s).

Для вершины 2 новая пометка имеет значение P2=(17, s). Для вершины 3 – P3 = (10, s).

Перейдя к шагу 1, выбираем вершину 3, так как она имеет наименьший параметр длины Ls3 = 10, среди всех вершин с временными пометками. Ее пометка становится постоянной. Поскольку еще не все вершины получили постоянные пометки, переходим к шагу 2 и осуществляем пересчет пометок для вершин, смежных вершине 3:

P2 = (17, s) можно оставить без изменения, так как новый параметр длины равен прежнему значению.

P5 = (22, 3).

Pt = (30, 3).

Вершина 1 на шаге 1 получает постоянную пометку, так как ее параметр длины минимален.

Новое значение пометки на шаге 2 получает вершина 4, а именно P4 = (24, 1).

Возвращаясь к шагу 1, устанавливаем постоянную пометку для вершины 5. Изменить значение пометок на шаге 3 не удается. Фиксируем следующую вершину с постоянной пометкой – это вершина 4.

Изменить временную пометку для вершины t не удается - и она автоматически становится постоянной.

На этом работа алгоритма заканчивается.

Трассировку пути st определяем, двигаясь в обратном направлении от t к s через вершины, указанные в пометках: t 3 s.