Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Борсуковский_ДМ.doc
Скачиваний:
132
Добавлен:
20.03.2015
Размер:
24.17 Mб
Скачать

3. Контрольные вопросы

  1. Ориентированное и неориентированное дерево.

  2. Части дерева и их свойства.

  3. Примеры ситуаций, в которых необходимо построить минимальное остовное дерево.

  4. Алгоритм Краскала.

4. Задания для самостоятельного решения

1. Написать программу, реализующую алгоритм Краскала.

2. Используя алгоритм Краскала, построить минмальное остовное дерево:

Лабораторная работа №6

Тема лабораторной работы: Нахождение кратчайшего пути. Алгоритм Дейкстры, алгоритм Форда - Беллмана.

Цели лабораторной работы:

  • изучить задачу нахождения кратчайшего пути на практических примерах;

  • изучить алгоритм Дейкстры и алгоритм Форда – Беллмана;

  • написать программу, используя изученные алгоритмы;

  • закрепить практические навыки программирования.

1. Теоретический раздел

Задача о нахождении кратчайшего пути состоит в нахождении кратчайшего пути от заданной начальной вершины до заданной конечной вершины, при условии, что такой путь существует.

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

Мы рассмотрим головоломку о трех бидонах.

Восьмилитровый бидон заполнен некой жидкостью, а два бидона емкостью 5 и 3 литра пусты. Необходимо разделить 8 литров жидкости на две равные части, используя только три имеющихся бидона. Какое минимальное количество переливаний из бидона в бидон надо сделать, чтобы достичь желаемого результата?

В этой сетевой модели каждый узел будет соответствовать объемам жидкости в 8-, 5- и 3-литровом бидонах. Начальным узлом будет (8, 0, 0), а конечным - (4, 4, 0). Новый узел получается из текущего при однократном переливании жидкости из одного бидона в другой.

На рис. 7 показаны различные маршруты, ведущие от начального узла (8, 0, 0) к конечному (4, 4, 0). Таким образом, наша головоломка сведена к задаче определения кратчайшего пути между узлами (8, 0, 0) и (4, 4, 0).

Рис. 7. Головоломка о трех бидонах как задача вычисления кратчайшего пути.

Оптимальное решение, показанное в нижней части рис. 7, требует семи переливаний из бидона в бидон.

2. Описание алгоритмов нахождения кратчайшего пути

2.1. Алгоритм Дейкстры нахождения минимального пути

Для нахождения минимального пути между двумя произвольными вершинами для случая, когда все сij > О можно воспользоваться простым алгоритмом Дейкстры

Алгоритм Дейкстры.

Шаг 1. Установка начальных условий.

Ввести число вершин графа n и матрицу весов С = (сij). Ввести номер начальной вер­шины s и номер конечной вершины f.

Для начальной вершины s положить M(s) = О и считать эту пометку постоянной. По­ложить M(xi) для всех остальных вершин хi≠ s равными достаточно большому числу (на­пример, 99999999) и считать эти пометки временными. Положить номер текущей вершины р = s. Сформировать множество П вершин с постоянной пометкой, вначале П= {р}, и множе­ство В вершин с временной пометкой, В ={Х\П}.

Шаг 2. Обновление пометок.

Заполнить множество вершин G(p), являющихся образом вершины р. Для всех вершин xi G(p), имеющих временные пометки, т.е. для , изменить пометки сле­дующим образом:

М(хi) - min (М(хi), М(р)+с(р,хi)).

Шаг 3. Превращение временных пометок в постоянные.

Из всех вершин, имеющих временные пометки, найти такую, для которой M(x*) = min(M(xi)).

Считать пометку вершины х* постоянной. Положить р = х*.

Шаг 4. Проверка, является ли найденный путь минимальным.

Если р =f, то М(р) является длиной минимального пути; перейти к шагу 6. Иначе пе­рейти к шагу 5.

Шаг 5. Изменение множеств П и В.

Удалить номер вершины р из множества В и добавить номер вершины р в множество П. Перейти к шагу 2.

Шаг 6. Восстановление минимального пути.

Для любой вершины хi, предшествующая ей вершина xj определяется из соотношения:

M(xj)+c(xj,xi)=M(xi), хj G-1(xi) ∩ П,

где G-1(xi) - прообраз вершины xi.

Последовательно применяя это соотношение, начиная от последней вершины f, найдем минимальный путь.

Пример нахождения кратчайшего пути с помощью алгоритма Дейкстры.

Определим минимальный путь из вершины х1 а вершину х6 в нагруженном графе, изо­браженном на рис. 8.

Рис. 8

Рассмотрим подробно работу алгоритма Дейкстры для этого примера.

Шаг 1. Установка начальных условий.

Матрица весов имеет вид:

s=x1; M(s)=0; p= x1; П={ x1}; В={ x2, x3, x4, x5, x6}.

1-ая итерация.

Шаг 2. G(x1)={x2}; G(x1)∩B={x2}; M(x2)=min{∞,0+1}=1.

Шаг 3. x*= x2 ; p= x2.

Шаг 4. x2≠ x6

Шаг 5. П={x1,x2};B={x3,x4,x5,x6}.

2-ая итерация.

Шаг 2. G(x2)={x3,x4,x6};G(x2)∩B={x3,x4,x6};M(x3)=min{∞,1+5}=6;

M(x4)=min{∞,1+2}=3; M(x6)=min{∞,1+7}=8.

Шаг 3. x*= x4; p=x4.

Шаг 4. x2≠ x6

Шаг 5. П={x1,x2,x4};B={x3,x5,x6}.

3-ая итерация.

Шаг 2. G(x4)={x1,x3,x5};G(x4)∩B={x3,x5};

M(x3)=min{6,3+1}=4; M(x5)=min{∞,3+4}=7.

Шаг 3. x*= x3; p= x3.

Шаг 4. x3≠ x6

Шаг 5. П={x1,x2,x4,x3};B={x5, x6}. 4-ая итерация.

Шаг 2. G(x3)={x6}; G(x3)∩B={x6}; M(x6)=min{8,4+1}=5.

Шаг 3. x*= x6; p= x6.

Шаг 4. x6 = x6.

Переходим к шагу 6.

Прежде, чем перейти к восстановлению минимального пути, представим полученные результаты в виде таблицы, которой удобно пользоваться для расчетов (табл.1.)

Таблица 1.Восстановление минимального пути.

№ итерации

p

П

М(П)

В

М(В) старые

М(В) обновленные

0

1

1

0

2

1

3

4

5

6

1

2

1

0

3

6

2

1

4

3

5

6

8

2

4

1

0

3

6

4

2

1

5

7

4

3

6

8

8

3

3

1

9

5

7

7

2

1

6

8

5

4

3

3

4

4

6

Шаг 6. Определим вершину, предшествующую вершине х6

G-1(x6) ={x2,x3};

G-1(x6) ∩ П={x2,x3};

M(x2) + c(x2,x6) =1+7≠M(x6),

M(x3) + c(x3,x6) = 4+1=5=M(x6),

т.е. вершина x3 предшествует вершине x6.

Определим вершину, предшествующую вершине х3

G-1(x3) ={x2,x4};

G-1(x3) ∩ П={x2,x4};

M(x2) + c(x2,x3) =1+5≠M(x3),

M(x4) + c(x4,x3) = 3+1=4=M(x3),

т.е. вершина x4 предшествует вершине x3.

Определим вершину, предшествующую вершине х6

G-1(x4) ={x2};

G-1(x4) ∩ П={x2};

M(x2) + c(x2,x4) =1+2=3=M(x4),

т.е. вершина x3 предшествует вершине x3.

Определим вершину, предшествующую вершине х2

G-1(x2) ={x1};

G-1(x2) ∩ П={x1};

M(x1) + c(x1,x2) =0+1=1=M(x2),

т.е. вершина x1 предшествует вершине x2.

Итак, x1 x2 x4 х3 x6 есть минимальный путь из вершины х1 в вершину х6. Его длина равна 5.