Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Решение задачи поиска кратчайших путей (маршрутов)




Из одной вершины в другую.

Пусть G – некий ориентированный нагруженный граф. Пусть y и z – какие-то вершины графа G. Требуется найти путь наименьшей длины из y в z.

Замечание. Алгоритм решения данной задачи называется алгоритмом в честь математика Е. Дийкстра, опубликовавший этот алгоритм в 1959 году.

 

Суть алгоритма заключается в следующем: на каждом шаге алгоритма каждая вершина x графа G имеет метку s(x), которая может быть либо временной меткой, либо постоянной (. Значение постоянной метки (на каждом шаге алгоритма) равно длин кратчайшего пути из начальной вершины в конечную. Значение временной метки s(x) (на каждом шаге алгоритма) есть длина кратчайшего (y,x)-пути, проходящего только через вершины, имеющие к данному моменты постоянные метки . Кроме временной метки каждой вершине графа (кроме начальной вершины y) присваивается также метка g(x). Ее значение на каждом шаге равно номеру вершины графа, предшествующей вершине x в (y,x)-пути, имеющем наименьшую длину среду всех (y,x)-путей, проходящих через вершины, получившие к данному моменту постоянные метки. В конце алгоритма метки g(x) позволяет выписать кратчайший (y,z)-путь в виде следующей последовательности: (y,…,q(q(z)),q(z),z).

 

Алгоритм поиска кратчайшего (y,z)-пути

В нагруженном графе.

Шаг 1. Положим :=0 и будем считать данную метку постоянной. Всем остальным вершинам графа присваиваем временные метки, равные бесконечности, и индексу p:=y (присваиваем имя начальной вершины).

Шаг 2. Сформируем множество L(p) ={ a ϵ XG: (p, a) ϵ PG }. Для каждой вершины из множества L(p) проверяем выполнение неравенства s(a) > + l (p,a).

Если данное неравенство выполняется, то вершине a присваиваем метку s(a), равную следующему выражению s(a):= + l (p,a), и одновременно метке q(a):=p. Если же неравенство не выполняется, то значение меток s(a) и q(a) не меняются.

Шаг 3. Сформируем множество X´, элементами которого являются все вершины графа G, имеющие к данному моменту временные метки s(x). Среди элементов множества X´ выбираем такой элемент x*, у которого временная метка s(x*) имеет наименьшее значение среди меток s(x), где x ϵ X´. Метку s(x*) считаем постоянной.

Шаг 4. Индексу p:=x*. Если p=z, то переходим к шагу 5. В противном случае переходим в шагу 2 алгоритма.

Шаг 5. По известным меткам q(x) выписываем кратчайший (y,z))-путь:

μ*(y,z) = (y,…,q(q(z)),q(z),z).

 

Решение:

Сформируем матрицу достижимости T(G).

 

                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     

 

T(G) =

 

Будем считать вершину 1 стартовой в алгоритме поиска кратчайших путей в графе G.

Изобразим ориентированный граф G с величинами нагрузок дуг:

Шаг 1. Метки s вершины 1 присваиваем значение 0 и считаем эту метку постоянной. Остальным вершинам присваиваем временные метки s, равные ∞. p:=1 (номер начальной вершины).

Шаг 2. Формируем множество L(1)={3,6,9}. Для каждой вершины L(1) проверяем выполнение неравенства s(x)> (1)+l(1,x):

s(3)> (1)+l(1,3)- верно,

s(6)> (1)+l(1,6)- верно,

s(9)> (1)+l(1,9)- верно.

Таким образом, каждой вершине множества L(1) присваиваем новые метки s(x):= (1)+l(1,x); q(x)=1, получаем

s(3):=6, q(3)=1;

s(6):=17, q(6)=1;

s(9):=21, q(9)=1.

Шаг 3. Формируем множество x'={2,3,4,5,6,7,8,9,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (3)=6, x*=3, считаем ее постоянной, p:=3.

Шаг 4. Формируем множество L(3)=Ø. Следовательно, на данном этапе метки не меняются.

Шаг 5. Формируем множество x'={2,4,5,6,7,8,9,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (6)=17, x*=6, считаем ее постоянной, p:=6.

Шаг 6. Формируем множество L(6)={7,9}. Для каждой вершины L(6) проверяем выполнение неравенства s(x)> (6)+l(6,x):

s(7)> (6)+l(6,7)- верно,

s(9)> (6)+l(6,9)- неверно.

Таким образом, вершине 7 множества L(6) присваиваем новую метку s(x):= (6)+l(6,x); q(x)=6, получаем

s(7):=34, q(7)=6;

a вершине 9 на данном этапе алгоритма метки не меняем.

Шаг 7. Формируем множество x'={2,4,5,7,8,9,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (9)=21, x*=9, считаем ее постоянной, p:=9.

Шаг 8. Формируем множество L(9)=Ø. Следовательно, на данном этапе метки не меняются.

Шаг 9. Формируем множество x'={2,4,5,7,8, 10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (7)=34, x*=7, считаем ее постоянной, p:=7.

Шаг 10. Формируем множество L(7)={4,8}. Для каждой вершины L(7) проверяем выполнение неравенства s(x)> (7)+l(7,x):

s(4)> (7)+l(7,4)- верно,

s(8)> (7)+l(7,8)- верно.

Таким образом, каждой вершине множества L(7) присваиваем новые метки s(x):= (7)+l(7,x); q(x)=7, получаем

s(4):=46, q(3)=7;

s(8):=41, q(6)=7.

Шаг 11. Формируем множество x'={2,4,5, 8, 10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (8)=41, x*=8, считаем ее постоянной, p:=8.

Шаг 12. Формируем множество L(8)={2}. Для каждой вершины L(8) проверяем выполнение неравенства s(x)> (8)+l(8,x):

s(2)> (8)+l(8,2)- верно.

Таким образом, каждой вершине множества L(8) присваиваем новые метки s(x):= (8)+l(8,x); q(x)=8, получаем

s(2):=46, q(2)=8.

Шаг 13. Формируем множество x'={2,4,5,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (2)=46, x*=2, считаем ее постоянной, p:=2.

Шаг 14. Формируем множество L(2)={4}. Для каждой вершины L(2) проверяем выполнение неравенства s(x)> (2)+l(2,x):

s(4)> (2)+l(2,4)- неверно.

Таким образом, на данной этапе алгоритма вершине 2 метки не меняем.

Шаг 15. Формируем множество x'={4,5,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (4)=46, x*=4, считаем ее постоянной, p:=4.

Шаг 16. Формируем множество L(4)={10}. Для каждой вершины L(4) проверяем выполнение неравенства s(x)> (4)+l(4,x):

s(10)> (4)+l(4,10)- верно.

Таким образом, каждой вершине множества L(4) присваиваем новые метки s(x):= (4)+l(4,x); q(x)=4, получаем

s(10):=61, q(2)=4.

Шаг 17. Формируем множество x'={5,10}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (10)=61, x*=10, считаем ее постоянной, p:=10.

Шаг 18. Формируем множество L(10)=Ø. Следовательно, на данном этапе метки не меняются.

Шаг 19. Формируем множество x'={5}. Выбираем вершину x* из множества x' с наименьшей меткой s, получаем (5)=∞, x*=5, считаем ее постоянной, p:=5.

Так как все вершины получили постоянные метки, алгоритм закончен.

Выпишем кратчайшие пути от вершины 1 до всех вершин ориентированного графа G, достижимых из вершины 1, и найдем их длины (величина, равная сумме нагрузок всех дуг пути μ*):

μ*(1,2)=(1,6,7,8,2);

l*(1,2))=46;

μ*(1,3)=(1,3);

l*(1,3))=6;

μ*(1,4)=(1,6,7,4);

l*(1,4))=46;

μ*(1,6)=(1,6);

l*(1,6))=17;

μ*(1,7)=(1,6,7);

l*(1,7))=34;

μ*(1,8)=(1,6,7,8);

l*(1,8))=41;

μ*(1,9)=(1,9);

l*(1,9))=21;

μ*(1,10)=(1,6,7,4,10);

l*(1,10))=61.

 

 





Поделиться с друзьями:


Дата добавления: 2016-09-03; Мы поможем в написании ваших работ!; просмотров: 811 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Настоящая ответственность бывает только личной. © Фазиль Искандер
==> читать все изречения...

2340 - | 2065 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.