Лабораторний практикум Транспортно-навігаційні ГІС

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 64

І. В.

Крив’юк

ТРАНСПОРТНО-НАВІГАЦІЙНІ ГІС

ЛАБОРАТОРНИЙ ПРАКТИКУМ
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Івано-Франківський національний технічний університет


нафти і газу

Кафедра геотехногенної безпеки та геоінформатики

І. В. Крив’юк

ТРАНСПОРТНО-НАВІГАЦІЙНІ ГІС

ЛАБОРАТОРНИЙ ПРАКТИКУМ

Івано-Франківськ
2014
УДК 629.072.1:910:004.65
ББК 39.18:32.973
К-82

Рецензент:
Давибіда Л. І. кандидат геологічних наук, доцент кафедри
геотехногенної безпеки та геоінформатики
Івано-Франківського національного технічного
університету нафти і газу

Рекомендовано методичною радою університету


(протокол № 4 від 20.02. 2014 р.)

Крив'юк І. В.

К-82 Транспортно-навігаційні ГІС: лабораторний практикум. –


Івано-Франківськ: ІФНТУНГ, 2014. – 63 с.

МВ 02070855-8046-2014

Лабораторний практикум призначений для вироблення у


студентів практичних навичок для розв’язку прикладних задач,
пов’язаних з маршрутизацією транспортних засобів.
Відповідає чинній навчальній програмі дисципліни та
призначений для підготовки спеціалістів і магістрів денної та
заочної форми навчання за спеціальністю 7.08010105, 8.08010105
“Геоінформаційні системи і технології”.

УДК 629.072.1:910:004.65
ББК 39.18:32.973
МВ 02070855-8046-2014
© Крив'юк І. В.
© ІФНТУНГ, 2014
ЗМІСТ

ЗАГАЛЬНІ МЕТОДИЧНІ ВКАЗІВКИ..................................... 4

ЛАБОРАТОРНА РОБОТА № 1 Знаходження


багатозначних відображень та транзитивних замикань ................. 5

ЛАБОРАТОРНА РОБОТА № 2 Знаходження


досяжності та контрдосяжність на графах. Матричний метод
знаходження шляхів у графах ......................................................... 15

ЛАБОРАТОРНА РОБОТА № 3 Реалізація алгоритму


Дейкстри пошуку найкоротшого шляху ........................................ 22

ЛАБОРАТОРНА РОБОТА № 4 Реалізація алгоритму


Белмана-Форда пошуку найкоротшого шляху .............................. 28

ЛАБОРАТОРНА РОБОТА № 5 Реалізація алгоритму


Флойда-Уоршола пошуку усіх найкоротших шляхів ................... 35

ЛАБОРАТОРНА РОБОТА № 6 Реалізація алгоритму


Данцига пошуку усіх найкоротших шляхів ................................... 43

ЛАБОРАТОРНА РОБОТА № 7 Реалізація алгоритму


подвійного пошуку k перших найкоротших шляхів ..................... 49

ПЕРЕЛІК РЕКОМЕНДОВАНИХ ДЖЕРЕЛ.......................... 63

3
ЗАГАЛЬНІ МЕТОДИЧНІ ВКАЗІВКИ

Метою навчальної дисципліни "Транспортно-навігаційні


ГІС" є ознайомлення студентів з основними алгоритмами пошуку
оптимальних шляхів, науковими положеннями з розробки та
побудови транспортно-навігаційних ГІС, стратегіями планування
їх використання, з геоінформаційним забезпеченням навігацій
наземного транспорту.
Робочою програмою дисципліни передбачено виконання
семи лабораторних робіт. Система оцінювання лабораторних
робіт є такою.

Номер Номер Максимальна Максимальна


лабораторної завдання кількість балів кількість
роботи за завдання балів за роботу
1 3
1 2 3 10
3 4
1 4
2 2 4 10
3 2
3 1 10 10
4 1 10 10
5 1 10 10
6 1 10 10
7 1 10 10
Разом 70

Усі лабораторні роботи виконуються в окремому зошиті для


лабораторних робіт. У звіті наводиться тема та мета роботи,
розв’язок поставлених завдань, а також висновок. Якщо завдань є
декілька, то наводиться один загальний висновок.

4
ЛАБОРАТОРНА РОБОТА № 1
Знаходження багатозначних відображень та транзитивних
замикань

1.1 Мета і завдання роботи роботи


Мета роботи – засвоїти поняття багатозначного
відображення та транзитивного замикання.
Завдання роботи – знайти багатозначні відображення та
транзитивні замикання для заданих діаграм графів. Знайти
транзитивні замикання для заданої вершини за матрицею
суміжності графа.
Тривалість лабораторної роботи – 4 год. (2 пари).

1.2 Основні теоретичні положення


Прямим відображенням 1-го порядку вершини vi (Г+1(vi)) є
множина таких вершин графа vj, для яких існує дуга (vi, vj), що
належить множині дуг графа, тобто
Г+1(vi)={vj: ∃ дуга (vi, vj)∈E}. (1.1)
Пряме відображення 2-го порядку вершини vi – це пряме
відображення від прямого відображення 1-го порядку, тобто
Г+2(vi)=Г+(Г+1(vi)).
Аналогічно можна записати для прямого відображення 3-го
і т.д. n-го порядку:
Г+3(vi)=Г+(Г+2(vi))=Г+(Г+(Г+1(vi)));

Г+n(vi)=Г+(Г+(n-1)(vi)).

5
Якщо відображення діє не на одну вершину, а на множину
вершин Vk={v1, v2, …, vk}, то під Г+(Vk) розуміють об'єднання
Г+(v1) ∪Г+(v2) ∪... ∪Г+(vk).
Прямі багатозначні відображення знаходяться до тих пір,
поки в них або добавляються нові вершини, або не будуть
перелічені усі вершини графа.
Приклад 1.1. Знайти прямі відображення для вершини v1
графа, зображеного на рис. 1.1.
Розв'язок.
Г+1(v1)={v2, v3};
Г+2(v1)=Г+(Г+1(v1))=
=Г+(v2, v3)={v3}∪{v5}={v3, v5};
Г+3(v1)=Г+(Г+2(v1))=
=Г+(v3, v5)={v5}∪{v1, v2}={v1, v2, v5}.
Оскільки у відображення Г+3(v1)
не добавилось нових вершин Рисунок 1.1.
(вершини v1, v2 та v5 уже розглядались
на попередніх кроках), то пошук прямих відображень для
вершини v1 припиняється.
Зворотним відображенням 1-го порядку для вершини vi є
множина таких вершин графа vj, для яких існує дуга (vj, vi), що
належить множині дуг графа, тобто
Г-1(vi)={vj: ∃ дуга (vj, vi)∈E}. (1.2)
Зворотні відображення 2-го, 3-го та n-го порядку
визначаються наступним чином:
Г-2(vi)=Г-(Г-1(vi));
Г-3(vi)=Г-(Г-2(vi))=Г-(Г-(Г-1(vi)));

6
Г-n(vi)=Г-(Г-(n-1)(vi)).
Якщо відображення діє не на одну вершину, а на множину
вершин Vk={v1, v2, …, vk}, то під Г-(Vk) розуміють об'єднання
Г-(v1) ∪Г-(v2) ∪... ∪Г-(vk).
Зворотні багатозначні відображення знаходяться до тих пір,
поки в них або добавляються нові вершини, або не будуть
перелічені усі вершини графа.
Приклад 1.2. Знайти зворотні відображення для вершини v1
графа, зображеного на рис. 1.1.
Розв'язок.
Г-1(v1)={v5}; Г-2(v1)=Г-(Г-1(v1))=Г-(v5)={v3, v4};
Г-3(v1)=Г-(Г-2(v1))=Г-(v3, v4)={v1, v2, v4}∪{∅}={v1, v2, v4}.
Оскільки у відображення Г+1(v1) – Г+3(v1) увійшли усі
вершини графа, то пошук зворотних відображень для вершини v1
припиняється.
Прямим транзитивним замиканням деякої вершини vi Т+(vi)
є об'єднання самої вершини vi з прямим відображенням 1-го
порядку, 2-го порядку і т.д., тобто
Т+(vi)={vi}∪Г+1(vi) ∪Г+2(vi) ∪… . (1.3)
Таким чином, пряме транзитивне замикання деякої вершини
vi Т+(vi) – це множина вершин, в які існують шляхи з вершини vi,
тобто
Т+(vi)={vj: ∃ шлях з vi в vj}. (1.4)
Так, пряме транзитивне замикання для вершини v1 графа,
зображеного на рис. 1.1, буде таким:
Т+(v1)={v1}∪{v2, v3}∪{v3, v5}∪{v1, v2, v5}={v1, v2, v3, v5}.

7
Зворотним транзитивним замиканням деякої вершини vi
Т-(vi) є об'єднання самої вершини vi із зворотним відображенням
1-го порядку, 2-го порядку і т.д., тобто
Т-(vi)={vi} ∪Г-1(vi) ∪Г-2(vi) ∪… . (1.5)
Іншими словами, зворотне транзитивне замикання для
деякої вершини vi Т-(vi) це множина вершин, з яких існують
шляхи у вершину vi, тобто
Т-(vi)={vj: ∃ шлях з vj, в vi}. (1.6)
Так, зворотне транзитивне замикання для вершини v1 графа,
зображеного на рис. 1.1, буде таким:
Т-(v1)={v1}∪{v5}∪{v3, v4}∪{v1, v2, v4}={v1, v2, v3, v4, v5}.
Алгоритм знаходження прямого транзитивного замикання
по матриці суміжності для вершини vi полягає в наступному.
Крок 1. Формується вектор Т+(vi) з n елементів, де n –
кількість вершин графа. Даний вектор визначає довжини шляхів
від i-ї вершини графа до усіх інших вершин. Приймається d=0. В
i-й елемент вектора Т+(vi)i заноситься значення d.
Крок 2. Переглядається i-й рядок матриці суміжності A і
визначаються елементи ai,j (j=1, 2, …, n) рівні 1.
Крок 3. Якщо жодний з елементів ai,j≠1, то алгоритм
завершується. Усім незаповненим елементам вектора Т+(vi)
присвоюється значення ∞ – це означає що від вершини vi нема
шляхів до даних вершин графа. В іншому випадку здійснюється
перехід до кроку 4.
Крок 4. Якщо є один або більше елементів ai,j=1, то d=d+1,
i=j (крім тих значень j, яким відповідають уже заповнені
елементи вектора Т+(vi)) та відповідним i-м елементам вектора
Т+(vi)i (крім уже заповнених елементів) присвоюється значення d.

8
Це означає що від вершини vi існують шляхи довжиною d до
відповідних j-х вершин графа. Якщо усі елементи вектора Т+(vi)
заповнені, то алгоритм завершує свою роботу. В іншому випадку
здійснюється перехід до кроку 5.
Крок 5. Переглядаються відповідні i-ті рядки матриці
суміжності A і визначаються елементи ai,j (j=1, 2, …, n) рівні 1.
Здійснюється перехід до кроку 3.
Приклад 1.3. Знайти пряме транзитивне замикання по
матриці суміжності, наведеної на рис. 1.2 а, для вершини v2
графа, наведеного на рис. 1.2 б.
Матриця суміжності
v1 v2 v3 v4 v5 v6
v1 0 1 1 0 0 0
v2 0 0 0 0 1 0
v3 0 0 0 0 0 0
A=
v4 0 0 1 0 0 0
v5 1 0 0 1 0 0
v6 1 0 0 0 1 0
а б

Рисунок 1.2.

Розв'язок.
Крок 1. Формується вектор Т+(v2) з шести елементів (рис.
1.3). d=0, i=2, Т+(v2)2→d.
Крок 2. Переглядаємо і-й рядок матриці А (2-й рядок): a2,5=1.
Крок 3. Оскільки існують елементи ai,j=1, то переходимо до
кроку 4.
Крок 4. d=d+1=1, j=5, i=j=5, Т+(v2)5→d.

9
Крок 5. Переглядаємо 5-й рядок матриці А:
a5,1=1, a5,4=1. Переходимо до кроку 3.
Т+(v2)
Крок 3. Оскільки існують елементи ai,j=1, то
v1 2
переходимо до кроку 4. v2 0
Крок 4. d=d+1=2, j={1, 4}, i=j={1, 4}, v3 3
Т+(v2)1→d, Т+(v2)4→d. v4 2
Крок 5. Переглядаємо 1-й та 4-й рядки v5 1
матриці А: a1,2=1, a1,3=1, a4,3=1. Переходимо до v6 ∞

кроку 3. Рисунок 1.3.


Крок 3. Оскільки існують елементи ai,j=1, то переходимо до
кроку 4.
Крок 4. d=d+1=3. Оскільки 2-й елемент вектора Т+(v2)2 уже
заповнений, то j=3, i=j=3, Т+(v2)3→d.
Крок 5. Переглядаємо 3-й рядок матриці А: жодний із
елементів ai,j≠1. Переходимо до кроку 3.
Крок 3. Оскільки жодний із елементів ai,j≠1, то процес
формування прямого транзитивного замикання завершується.
Усім незаповненим елементам вектора Т+(v2) присвоюється
значення ∞.
Таким чином, у векторі Т+(v2) стоять числа рівні довжинам
шляхів від вершини v2 до відповідних вершин графа. Отже, дані
вершини входять у пряме транзитивне замикання вершини v2 –
Т+(v2)={v1, v2, v3, v4, v5}.
Алгоритм знаходження зворотного транзитивного
замикання по матриці суміжності A для вершини vi полягає в
наступному.
Крок 1. Формується вектор Т-(vi) з n елементів, де n –
кількість вершин графа. Даний вектор визначає довжини шляхів

10
від усіх вершин графа до i-ї вершини. Приймається d=0. В i-й
елемент вектора Т-(vi)i заноситься значення d. j=i.
Крок 2. Переглядається j-й стовпчик матриці суміжності A і
визначаються елементи ai,j (i=1, 2, …, n) рівні 1.
Крок 3. Якщо жодний з елементів ai,j≠1, то алгоритм
завершується. Усім незаповненим елементам вектора Т-(vi)
присвоюється значення ∞ – це означає що від даних вершин
графа немає шляхів до вершини vi. В іншому випадку
здійснюється перехід до кроку 4.
Крок 4. Якщо є один або більше елементів ai,j=1, то d=d+1,
j=i (крім тих значень i, яким відповідають уже заповнені
елементи вектора Т-(vi)) та відповідним i-м елементам вектора
Т-(vi)i (крім уже заповнених елементів) присвоюється значення d.
Це означає що від даних вершин існують шляхи довжиною d до
вершини vi. Якщо усі елементи вектора Т-(vi) заповнені, то
алгоритм завершує свою роботу. В іншому випадку здійснюється
перехід до кроку 5.
Крок 5. Переглядаються відповідні j-ті стовпчики матриці
суміжності A і визначаються елементи ai,j (i=1, 2, …, n) рівні 1.
Здійснюється перехід до кроку 3.
Приклад 1.4. Знайти зворотне транзитивне замикання по
матриці суміжності, наведеної на рис. 1.2 а, для вершини v3
графа, наведеного на рис. 1.2 б.
Розв'язок.
Крок 1. Формується вектор Т-(v3) з шести елементів (рис.
1.4). d=0, Т-(v3)3→d, j=3.
Крок 2. Переглядаємо j-й стовпчик матриці А (3-й
стовпчик): a1,3=1, a4,3=1.

11
Крок 3. Оскільки існують елементи ai,j=1, то
переходимо до кроку 4. Т-(v3)
Крок 4. d=d+1=1, i={1, 4}, j=i={1, 4}, v1 1
Т-(v3)1→d, Т-(v3)4→d. v2 3
Крок 5. Переглядаємо 1-й та 4-й стовпчики v3 0
v4 1
матриці А: a5,1=1, a6,1=1, a5,4=1. Переходимо до
v5 2
кроку 3.
v6 2
Крок 3. Оскільки існують елементи ai,j=1, то
переходимо до кроку 4. Рисунок 1.4.

Крок 4. d=d+1=2. i={5, 6}, j=i={5, 6}, Т-(v3)5→d, Т-(v3)6→d.


Крок 5. Переглядаємо 5-й та 6 стовпчики матриці А: a2,5=1,
a6,5=1. Переходимо до кроку 3.
Крок 3. Оскільки існують елементи ai,j=1, то переходимо до
кроку 4.
Крок 4. d=d+1=3. Елемент вектора Т-(v3)6 уже заповнений,
тому i=2, j=i=2, Т-(v3)2→d. Оскільки усі елементи вектора Т-(v3)
заповнені, то процес формування зворотного транзитивного
замикання завершується.
Таким чином, у векторі Т-(v3) стоять числа рівні довжинам
шляхів від відповідних вершин до вершини v3. Отже, дані
вершини входять у зворотне транзитивне замикання вершини v3 –
Т-(v3)={v1, v2, v3, v4, v5, v6}.

1.3 Порядок виконання роботи


Варіант № 1
1. Знайти прямі багатозначні відображення для усіх
вершин графа, зображеного на рис. 1.5 а.

12
а б
Рисунок 1.5.

2. Знайти зворотні транзитивні замикання для усіх вершин


графа, зображеного на рис. 1.5 б.
3. За матрицею суміжності графа, зображеною на рис. 1.6,
знайти пряме транзитивне замикання для вершини v1 та зворотне
транзитивне замикання для вершини v7.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 0 0 0 0 0
v2 1 0 1 0 0 0 0
v3 0 0 0 1 1 0 0
v4 0 1 0 0 1 0 0
v5 0 0 0 0 0 0 1
v6 0 0 0 1 1 0 1
v7 0 0 0 0 0 0 0
Рисунок 1.6.

Варіант № 2
1. Знайти зворотні багатозначні відображення для усіх
вершин графа, зображеного на рис. 1.5 а.
2. Знайти прямі транзитивні замикання для усіх вершин
графа, зображеного на рис. 1.5 б.

13
3. За матрицею суміжності графа, зображеною нарис. 1.7,
знайти пряме транзитивне замикання для вершини v7 та зворотне
транзитивне замикання для вершини v1.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 0 0 0 0 0
v2 1 0 1 0 0 0 0
v3 0 0 0 1 1 0 0
v4 0 1 0 0 1 0 0
v5 0 0 0 0 0 0 1
v6 0 0 0 1 1 0 1
v7 0 1 0 0 0 0 0
Рисунок 1.7.

1.4 Аналіз результатів роботи. Висновки


Проаналізувати результати роботи та зробити висновки
щодо множин вершин, які входять у пряме та зворотне
транзитивні замикання.

1.5 Контрольні запитання


1. Що таке пряме та зворотне відображення?
2. Принцип знаходження прямого та зворотного
відображень.
3. Що таке пряме та зворотне транзитивне замикання?
4. Принцип знаходження прямого та зворотного
транзитивних замикань по діаграмі графа.
5. Принцип знаходження зворотного транзитивного
замикання по діаграмі графа.
6. Принцип знаходження зворотного транзитивного
замикання по матриці суміжності графа.

14
ЛАБОРАТОРНА РОБОТА № 2
Знаходження досяжності та контрдосяжність на графах.
Матричний метод знаходження шляхів у графах

2.1 Мета і завдання роботи роботи


Мета роботи – засвоїти поняття досяжності та
контрдосяжності на графах.
Завдання роботи – побудувати матриці досяжності та
контрдосяжності для заданих діаграм графів. Знайти усі шляхи
заданої довжини матричним методом.
Тривалість лабораторної роботи – 4 год. (2 пари).

2.2 Основні теоретичні положення


Досяжність у графі описується матрицею досяжності
R=[ri,j], i, j=1, 2, ..., n, де n – кількість вершин графа, а кожний
елемент визначається наступним чином:
1) ri,j=1, якщо вершина vj досяжна з vi;
2) ri,j=0 у іншому випадку.
Множина вершин R(vi) графа G, досяжних із заданої
вершини vi, складається з таких елементів vj, для яких елемент ri,j
в матриці досяжності дорівнює 1. Очевидно, що всі діагональні
елементи в матриці R дорівнюють 1, оскільки кожна вершина
досяжна з себе самої шляхом довжини 0. Оскільки пряме
відображення 1-го порядку Г+1(vi) є множиною таких вершин vj,
які досяжні з вершини vi з використанням шляхів довжини 1, то
множина Г+(Г+1(vi))=Г+2(vi) складається з вершин, досяжних з
вершини vi з використанням шляхів довжини 2. Аналогічно Г+k(vi)

15
є множиною вершин, які досяжні з вершини vi за допомогою
шляхів довжини k.
Оскільки будь-яка вершина графа, яка досяжна з vi, повинна
бути досяжна з використанням шляху (або шляхів) довжини 0 або
1, або 2, ... , або k, то множина вершин, досяжних з вершини vi,
можна подати у вигляді
R(vi)={vi}∪Г+1(vi)∪Г+2(vi)∪... ∪Г+k(vi). (2.1)
Як бачимо, множина досяжних вершин R(vi) представляє
пряме транзитивне замикання вершини vi, тобто R(vi)=Т+(vi).
Отже, для побудови матриці досяжності необхідно знайти
досяжні множини R(vi) для всіх вершин vi∈V, вважаючи, ri,j=1,
якщо vj∈R(vi) та ri,j=0 у іншому випадку.
Приклад 2.1. Для графа, наведеного на рис. 2.1 а, знайти
матрицю досяжності R.

Матриця досяжності
v1 v2 v3 v4 v5 v6 v7
v1 1 1 0 1 1 0 0
v2 0 1 0 1 1 0 0
v3 0 0 1 1 1 0 0
R= v4 0 0 0 1 1 0 0
v5 0 0 0 0 1 0 0
v6 0 0 1 1 1 1 1
v7 0 0 1 1 1 1 1
а б
Рисунок 2.1.
Розв'язок.
Множини досяжностей знаходимо наступним чином:
R(v1)={v1}∪{v2, v5}∪{v4}∪{v5}={v1, v2, v4, v5};
R(v2)={v2}∪{v4}∪{v5}={v2, v4, v5};

16
R(v3)={v3}∪{v4}∪{v5}={v3, v4, v5};
R(v4)={v4}∪{v5}={v4, v5};
R(v5)={v5}∪{v5}={v5};
R(v6)={v6}∪{v3, v7}∪{v4, v6}∪{v3, v5, v7}={v3, v4, v5, v6, v7};
R(v7)={v7}∪{v4, v6}∪{v3, v5, v7}∪{v4, v6}={v3, v4, v5, v6, v7}.
Матриця досяжності R має вигляд, як показано на рис. 2.1 б.
Матриця контрдосяжності Q=[qi,j], i, j=1, 2, ..., n, де n –
кількість вершин графа, а кожний елемент визначається
наступним чином:
1) qi,j=1, якщо з вершина vj можна досягти вершину vi;
2) qi,j=0 у іншому випадку.
Контрдосяжною множиною Q(vi) є множина таких вершин,
що з будь-якої вершини цієї множини можна досягти вершину vi.
Аналогічно побудові досяжної множини R(vi) можна записати
вираз для Q(vi):
Q(vi)={vi}∪Г-1(vi) ∪Г-2(vi) ∪... ∪Г-k(vi). (2.2)
Таким чином, Q(vi) – це є не що інше, як зворотне
транзитивне замикання вершини vi, тобто Q(vi)=Т-(vi). З визначень
очевидно, що стовпець vi матриці Q(vi) (в якому qi,j=1, якщо
vj∈Q(vi), і qi,j=0 в іншому випадку) співпадає з рядком vi матриці
R(vi), тобто Q(vi)=R(vi)T, де R(vi)T – матриця, транспонована до
матриці досяжності R(vi).
Матриця контрдосяжності для графа, наведеного на рис. 2.1
а, показана на рис. 2.2.
Матриця суміжності повністю визначає структуру графа.
Зведемо матрицю суміжності в квадрат за правилами математики.
Кожен елемент матриці А2 визначається за формулою:

17
Матриця контрдосяжності
v1 v2 v3 v4 v5 v6 v7
v1 1 0 0 0 0 0 0
v2 1 1 0 0 0 0 0
v3 0 0 1 0 0 1 1
Q= v4 1 1 1 1 0 1 1
v5 1 1 1 1 1 1 1
v6 0 0 0 0 0 1 1
v7 0 0 0 0 0 1 1
Рисунок 2.2.

n
A = ∑ (ai ,k ⋅ ak , j ) .
2
i, j (2.3)
k =1

Права частина формули рівна 1 тоді і тільки тоді, коли


обидва числа ai,k та ak,j рівні 1, інакше він рівний 0. Оскільки з
рівності ai,k=ak,j=1 слідує існування шляху довжини 2 з вершини vi
2
у вершину vj, що проходить через вершину vk, то елементи 𝑎𝑖,𝑗
матриці А2 рівні числу шляхів довжини 2, що ведуть з вершини vi
в v j.
На рис. 2.3 б представлена матриця суміжності графа,
зображеного на рис. 2.3 а. Результат зведення матриці суміжності
в квадрат А2 показаний на рис. 2.3 в.
Для прикладу, запишемо формулу для знаходження елемент
2
𝑎3,6 матриці А2:
2
𝑎3,6 =a3,1·a1,6+a3,2·a2,6+a3,3·a3,6+a3,4·a4,6+a3,5·a5,6+a3,6·a6,6=0·1+
+1·1+0·1+0·0+1·1+1·0=2.
Проаналізуємо детальніше матрицю А2.
Так 1, що стоїть на перетині другого рядка і четвертого
2
стовпця матриці А2 (елемент 𝑎2,4 ), вказує на існування одного
шляху завдовжки 2 з вершини v2 до вершини v4. Дійсно, як

18
бачимо в графі на рис. 2.3 а, існує такий шлях: v2v5v4. Наявність
2
значення 2 в матриці А2 (елемент 𝑎3,6 ) свідчить про існування
двох шляхів завдовжки 2 від вершини v3 до вершини v6: v3v2v6 та
v3v5v6.

а
v1 v2 v3 v4 v5 v6 v1 v2 v3 v4 v5 v6
v1 0 1 0 0 0 1 v1 0 0 0 0 1 1
v2 0 0 0 0 1 1 v2 0 0 0 1 0 1
v3 0 1 0 0 1 1 v3 0 0 0 1 1 2
A= A2 =
v4 0 0 1 0 0 0 v4 0 1 0 0 1 1
v5 0 0 0 1 0 1 v5 0 0 1 0 0 0
v6 0 0 0 0 0 0 v6 0 0 0 0 0 0
б в
Рисунок 2.3.

2.3 Порядок виконання роботи


Варіант № 1
1. Для графа, наведеного на рис. 2.4 а, побудувати
матрицю досяжності R.
2. Для графа, наведеного на рис. 2.4 б, побудувати
матрицю контрдосяжності Q.
3. Для графа, наведеного на рис. 2.5 а, матричним методом
знайти усі шляхи довжиною 3.

19
а б
Рисунок 2.4.

а б
Рисунок 2.5.

Варіант № 2
1. Для графа, наведеного на рис. 2.4 а, побудувати
матрицю контрдосяжності Q.
2. Для графа, наведеного на рис. 2.4 б, побудувати
матрицю досяжності R.
3. Для графа, наведеного на рис. 2.5 б, матричним методом
знайти усі шляхи довжиною 3.

2.4 Аналіз результатів роботи. Висновки


Проаналізувати результати роботи та зробити відповідні
висновки, у яких: 1) надати характеристику одержаним матрицям
досяжності та контрдосяжності; 2) вказати усі шляхи заданої
довжини, знайдені матричним методом.

20
2.5 Контрольні запитання
1. Що таке матриця досяжності?
2. Який принцип побудови матриці досяжності?
3. Що таке матриця контрдосяжності?
4. Принцип побудови матриці контрдосяжності.
5. Принцип знаходження шляхів у графах матричним
методом.

21
ЛАБОРАТОРНА РОБОТА № 3
Реалізація алгоритму Дейкстри пошуку найкоротшого шляху

3.1 Мета і завдання роботи роботи


Мета роботи – засвоїти принцип пошуку найкоротшого
шляху між двома заданими вершинами графа за допомогою
алгоритму Дейкстри.
Завдання роботи – знайти за допомогою алгоритму
Дейкстри найкоротший шлях між двома заданими вершинами
графа.
Тривалість лабораторної роботи – 4 год. (2 пари).

3.2 Основні теоретичні положення


Алгоритм Дейкстри дозволяє знаходити в графі
найкоротший шлях між двома виділеними вершинами v і w при
позитивних довжинах дуг. Він вважається одним з найбільш
ефективних алгоритмів розв'язку задачі.
Принцип дії алгоритму Дейкстри такий.
Крок 1. Перед початком виконання алгоритму всі вершини
та дуги непозначені. Кожній вершині в ході виконання алгоритму
присвоюється число d(x), рівне довжині найкоротшого шляху з v
у х, що включає тільки позначені вершини.
Присвоїти d(v)=0 та d(x)=∞ для всіх х, відмінних від v.
Позначити вершину v та присвоїти у=v (у – остання з позначених
вершин).
Крок 2. Для кожної непозначеної вершини х наступним
чином перерахувати величину d(x):
d ( x) = min{d ( x); d ( y ) + c( y, x)} . (3.1)

22
Якщо d(x)=∞ для усіх непозначених вершин х, то закінчити
процедуру алгоритму, – у вихідному графі відсутні шляхи з
вершини v у непозначені вершини. В іншому випадку позначити
ту з вершин х, для якої величина d(x) є найменшою. Крім того,
позначити дугу, що веде в обрану на даному кроці вершину х (для
цієї дуги досягався мінімум відповідно до формули (3.1).
Присвоїти у=х.
Крок 3. Якщо у=w, то закінчити процедуру, – найкоротший
шлях з вершини v у вершину w знайдений (це єдиний шлях з v у
w, складений з позначених дуг). Якщо у≠w, то перейти до кроку
2.
Приклад 3.1. Застосувати алгоритм Дейкстри до графа,
зображеного на рис. 3.1, для знаходження в ньому найкоротшого
шляху між вершинами v та w.

Рисунок 3.1.

Розв'язок.
Крок 1. Позначаємо вершину v. Вважаємо, що d(v)=0, d(x)=∞
для всіх вершин х, які не збігаються з v. Присвоюємо у=v.
Крок 2. (у=v). Розраховуємо величину d(x) для кожної з
непозначених вершини за формулою (3.1):
d (a ) = min{d (a ); d (v) + c(v, a )} = min{∞; 0 + 4} = 4 ;
d (b) = min{d (b); d (v) + c(v, b)} = min{∞; 0 + 7} = 7 ;
d (c) = min{d (c); d (v) + c(v, c)} = min{∞; 0 + 3} = 3 ;
d (d ) = min{d (d ); d (v) + c(v, d )} = min{∞; 0 + ∞} = ∞ ;

23
d ( w) = min{d ( w); d (v) + c(v, w)} = min{∞; 0 + ∞} = ∞ .
Оскільки величина d(c)=3 є мінімальною з величин d(x), то
позначаємо вершину c. Так само позначаємо і дугу (v, c), яка і
визначає величину d(с). Присвоюємо у=с. Поточне дерево
найкоротших шляхів складайся з дуги (v, c) (рис. 3.2 а).

а б в

г д
Рисунок 3.2. Наростаюче орієнтоване дерево найкоротших
шляхів

Крок 3. Оскільки вершина w залишається непозначеною,


переходимо до кроку 2.
Крок 2. (у=с). Розраховуємо величину d(x) для кожної з
непозначених вершини за формулою (3.1):
d (a ) = min{d (a ); d (c) + c(c, a )} = min{4; 3 + ∞} = 4 ;
d (b) = min{d (b); d (c) + c(c, b)} = min{7; 3 + ∞} = 7 ;
d (d ) = min{d (d ); d (c) + c(c, d )} = min{∞; 3 + 3} = 6 ;
d ( w) = min{d ( w); d (c) + c(c, w)} = min{∞; 3 + ∞} = ∞ .
Оскільки величина d(a)=4 є мінімальною з величин d(x), то
позначаємо вершину а. Так само позначаємо і дугу (v, а), яка
визначає величину d(a). Присвоюємо у=а. Поточне дерево
найкоротших шляхів складається з дуг (v, c) та (v, а) (рис. 3.2 б).

24
Крок 3. Оскільки вершина w залишається непозначеною,
переходимо до кроку 2.
Крок 2. (у=a). Розраховуємо величину d(x) для кожної з
непозначених вершини за формулою (3.1):
d (b) = min{d (b); d (a ) + c(a, b)} = min{7; 4 + 3} = 7 ;
d (d ) = min{d (d ); d (a ) + c(a, d )} = min{6; 4 + 2} = 6 ;
d ( w) = min{d ( w); d (a ) + c(a, w)} = min{∞; 4 + ∞} = ∞ .
Оскільки величина d(b)=6 є мінімальною з величин d(x), то
позначаємо вершину d. Можна вважати, що величину d(b)
визначають як дуга (с, d), так і дуга (a, d). Тому можна позначити
довільну із цих дуг. Позначимо, наприклад, дугу (с, d).
Присвоюємо у=d. Поточне дерево найкоротших шляхів
складається з дуг (v, c), (v, а) та (с, d) (рис. 3.2 в).
Крок 3. Оскільки вершина w залишається непозначеною,
переходимо до кроку 2.
Крок 2. (у=d). Розраховуємо величину d(x) для кожної з
непозначених вершини за формулою (3.1):
d (b) = min{d (b); d (d ) + c(d , b)} = min{7; 6 + ∞} = 7 ;
d ( w) = min{d ( w); d (d ) + c(d , w)} = min{∞; 6 + 2} = 8 .
Оскільки величина d(b)=7 менша за величину d(w), то
позначаємо вершину b. Так само позначаємо і дугу (v, b), яка
визначає величину d(b). Присвоюємо у=b. Поточне дерево
найкоротших шляхів складається з дуг (v, c), (v, а), (с, d) та (v, b)
(рис. 3.2 г).
Крок 3. Оскільки вершина w залишається непозначеною,
переходимо до кроку 2.
Крок 2. (у=b). Розраховуємо величину d(x) для кожної з
непозначених вершини за формулою (3.1):

25
d ( w) = min{d ( w); d (b) + c(b, w)} = min{8; 7 + 2} = 8 .
Отже, позначаємо вершину w. Разом з нею позначаємо і
дугу (d, w), що визначає величину d(w). Остаточно побудоване
дерево найкоротші шляхів складається з дуг (v, c), (v, а), (с, d),
(v, b) та (d, w) (рис. 3.2 д).
Найкоротший шлях, що з'єднує вершину v з вершиною w,
складається з дуг (v, c), (с, d) та (d, w) і має довжину 3+3+2=8. Це
не єдиний найкоротший шлях між вершинами v та w. Шлях, що
складається з дуг (v, а), (а, d) та (d, w), має довжину 4+2+2=8 і
також є найкоротшим шляхом між вершинами v та w.
Найкоротший шлях буде єдиним тільки у тому випадку, якщо в
процедурі алгоритму жодного разу не виникає неоднозначність у
виборі дуги, що позначається.

3.3 Порядок виконання роботи


Варіант № 1
1. Використовуючи алгоритм Дейкстри, знайти у графі,
наведеному на рис. 3.3 а, найкоротший шлях між вершинами a та
g. Побудувати наростаюче орієнтоване дерево найкоротших
шляхів.

а б
Рисунок 3.3.
26
Варіант № 2
1. Використовуючи алгоритм Дейкстри, знайти у графі,
наведеному на рис. 3.3 б, найкоротший шлях між вершинами a та
g. Побудувати наростаюче орієнтоване дерево найкоротших
шляхів.

3.4 Аналіз результатів роботи. Висновки


Проаналізувавши одержані результати роботи, зробити
висновки, у яких вказати знайдений за допомогою алгоритму
Дейкстри найкоротший шлях та його довжину.

3.5 Контрольні запитання


1. Що таке вага дуги?
2. Як визначається вага шляху?
3. Яким чином здійснюється розрахунок довжини
найкоротшого шляху між двома вершинами?
4. Чи можна алгоритм Дейкстри розглядати як процедуру
нарощування орієнтованого дерева з коренем у заданій
початковій вершині? Якщо так, то пояснити чому?
5. Чи може застосовуватись алгоритм Дейкстри до графа, у
якому дуги мають від’ємну вагу?

27
ЛАБОРАТОРНА РОБОТА № 4
Реалізація алгоритму Белмана-Форда пошуку найкоротшого
шляху

4.1 Мета і завдання роботи роботи


Мета роботи – засвоїти принцип пошуку найкоротшого
шляху між двома заданими вершинами графа за допомогою
алгоритму Белмана-Форда.
Завдання роботи – знайти за допомогою алгоритму
Белмана-Форда найкоротший шлях між двома заданими
вершинами графа.
Тривалість лабораторної роботи – 4 год. (2 пари).

4.2 Основні теоретичні положення


Вхідне припущення в алгоритмі Дейкстри полягало у
відсутності від’ємних довжин дуг графа. Тому, немає ніякої
гарантії, що алгоритм Дейкстри буде знаходити найкоротший
шлях у випадках, коли довжини дуг можуть бути від’ємними.
Алгоритм Дейкстри може бути узагальнений на випадок,
коли деякі з дуг мають від’ємні довжини. Ідею відповідного
узагальнення запропонували незалежно американські математики
Лестер Форд у 1956 р. та Річард Белман у 1958 р. Необхідна
модифікація алгоритму Дейкстри полягає в такому.
1. На кроці 2 алгоритму перерахування величин d(x) за
допомогою співвідношення (3.1) проводиться для усіх вершин
(крім позначеної на попередньому етапі), а не тільки для
непозначених. Отже, числа d(x) можуть зменшуватися як для
непозначених, так і для позначених вершин.

28
2. Якщо для деякої позначеної вершини х відбувається
зменшення величини d(x), то із цієї вершини та інцидентної їй
позначеної дуги позначення знімається.
3. Процедура алгоритму закінчується тільки тоді, коли усі
вершини позначені та коли після виконання кроку 2 жодне із
чисел d(x) не змінюється.
Приклад 4.1. Використовуючи алгоритм Белмана-Форда,
знайти у графі, зображеному на рис. 4.1, найкоротший шлях між
вершинами a та е.

Рисунок 4.1.

Розв'язок.
Крок 1. Позначаємо вершину a. Вважаємо, що d(a)=0,
d(x)=∞, для всіх вершин х, які не збігаються з a. Присвоюємо у=a.
Крок 2. (y=a). Розраховуємо величину d(x) для кожної з
вершини (крім вершини а) за формулою (3.1):
d (b) = min{d (b); d (a ) + c(a, b)} = min{∞; 0 + 3} = 3 ;
d (c) = min{d (c); d (a ) + c(a, c)} = min{∞; 0 + 4} = 4 ;
d (d ) = min{d (d ); d (a ) + c(a, d )} = min{∞; 0 + ∞} = ∞ ;
d (e) = min{d (e); d (a ) + c(a, e)} = min{∞; 0 + ∞} = ∞ .
Оскільки величина d(b)=3 є мінімальною з величин d(x), то
позначаємо вершину b. Так само позначаємо і дугу (a, b), яка і
визначає величину d(b). Присвоюємо у=b. Поточне дерево
найкоротших шляхів складайся з дуги (a, b) (рис. 4.2 а).
29
а б в

г д
Рисунок 4.2.

Крок 3. Оскільки позначені не всі вершини, то переходимо


до кроку 2.
Крок 2. (y=b). Розраховуємо величину d(x) для кожної з
вершини (крім вершини b) за формулою (3.1):
d (a ) = min{d (a ); d (b) + c(b, a )} = min{0; 3 + ∞} = 0 ;
d (c) = min{d (c); d (b) + c(b, c)} = min{4; 3 + ∞} = 4 ;
d (d ) = min{d (d ); d (b) + c(b, d )} = min{∞; 3 + 1} = 4 ;
d (e) = min{d (e); d (b) + c(b, e)} = min{∞; 3 + 1} = 4 .
Для раніше позначеної вершини a значення d(a) не
змінилось, тому позначка з неї не знімається. Для всіх інших
вершин c, d та e значення d(x) рівні між собою, тому позначаємо
довільну з даних вершин, наприклад вершину c і відповідну дугу
(a, c). Присвоюємо у=c. Поточне дерево найкоротших шляхів
складайся з дуг (a, b) і (a, c) (рис. 4.2 б).
Крок 3. Оскільки позначені не всі вершини, то переходимо
до кроку 2.
Крок 2. (y=c). Розраховуємо величину d(x) для кожної з
вершини (крім вершини c) за формулою (3.1):

30
d ( a ) = min{d ( a ); d (c) + c(c, a )} = min{0; 4 + ∞} = 0 ;
d (b) = min{d (b); d (c) + c(c, b)} = min{3; 4 + (−8)} = −4 ;
d (d ) = min{d (d ); d (c) + c(c, d )} = min{4; 4 + 5} = 4 ;
d (e) = min{d (e); d (c) + c(c, e)} = min{4; 4 + ∞} = 4 .
Для раніше позначеної вершин a значення d(a) не змінилось,
тому позначка з неї не знімається. Для раніше позначеної вершин
b значення d(b) зменшилось, тому позначка з цієї вершини, а
також з дуги (a, b) знімається. Серед непозначених вершин
найменше значення d(x) має вершина b, тому позначаємо її
заново, а також дугу (c, b). Присвоюємо у=b. Поточне дерево
найкоротших шляхів складайся з дуг (a, c) і (c, b) (рис. 4.2, в).
Крок 3. Оскільки позначені не всі вершини, то переходимо
до кроку 2.
Крок 2. (y=b). Розраховуємо величину d(x) для кожної з
вершини (крім вершини b) за формулою (3.1):
d (a ) = min{d (a ); d (b) + c(b, a )} = min{0; − 4 + ∞} = 0 ;
d (c) = min{d (c); d (b) + c(b, c)} = min{4; − 4 + ∞} = 4 ;
d (d ) = min{d (d ); d (b) + c(b, d )} = min{4; − 4 + 1} = −3 ;
d (e) = min{d (e); d (b) + c(b, e)} = min{4; − 4 + 1} = −3 .
Для раніше позначених вершин значення d(x) не змінилось,
тому позначки з них не знімаємо. Для непозначених вершин d та
e значення d(x) рівні між собою, тому позначаємо довільну з
даних вершин, наприклад вершину d і відповідну дугу (b, d).
Присвоюємо у=d. Поточне дерево найкоротших шляхів складайся
з дуг (a, c), (c, b) та (b, d) (рис. 4.2 г).
Крок 3. Оскільки позначені не всі вершини, то переходимо
до кроку 2.

31
Крок 2. (y=d). Розраховуємо величину d(x) для кожної з
вершини (крім вершини d) за формулою (3.1):
d (a ) = min{d (a ); d (d ) + c(d , a )} = min{0; − 3 + ∞} = 0 ;
d (b) = min{d (b); d ( d ) + c(d , b)} = min{−4; − 3 + ∞} = −4 ;
d (c) = min{d (c); d (d ) + c(d , c)} = min{4; − 3 + 8} = 4 ;
d (e) = min{d (e); d (d ) + c(d , e)} = min{−3; − 3 + (−2)} = −5 .
Для раніше позначених вершин значення d(x) не змінилось,
тому позначки з них не знімаємо. Залишилась тільки одна
непозначена вершина e, яку позначаємо на даному кроці, а також
позначаємо дугу (d, e). Присвоюємо у=e. Поточне дерево
найкоротших шляхів складайся з дуг (a, c), (c, b), (b, d), (d, e)
(рис. 4.2 д).
Крок 3. Оскільки позначені усі вершини, то здійснюємо
перехід до кроку 2 для того, щоб спробувати зменшити значення
d(x) для позначених вершин.
Крок 2. (y=e). Розраховуємо величину d(x) для кожної з
вершини (крім вершини e) за формулою (3.1):
d (a ) = min{d (a ); d (e) + c(e, a )} = min{0; − 5 + ∞} = 0 ;
d (b) = min{d (b); d (e) + c(e, b)} = min{−4; − 5 + 3} = −4 ;
d (c) = min{d (c); d (e) + c(e, c)} = min{4; − 5 + ∞} = 4 ;
d ( d ) = min{d ( d ); d (e) + c(e, d )} = min{−3; − 5 + ∞} = −3 .
Для всіх позначених вершин значення d(x) не змінилось.
Крок 3. Оскільки позначені усі вершини графа і на
попередньому кроці алгоритму для жодної з позначених вершин
не вдалось зменшити значення d(x), то процедура алгоритму
завершується. Найкоротший шлях з вершини a у вершину e
складається з дуг (a, c), (c, b), (b, d), (d, e) (рис. 4.2 д) і має
довжину d(e)=-5.

32
4.3 Порядок виконання роботи
Варіант № 1
1. Використовуючи алгоритм Белмана-Форда, знайти у
графі, наведеному на рис. 4.3 а, найкоротший шлях між
вершинами a та g. Побудувати наростаюче орієнтоване дерево
найкоротших шляхів.

а б
Рисунок 4.3.

Варіант № 2
1. Використовуючи алгоритм Белмана-Форда, знайти у
графі, наведеному на рис. 4.3 б, найкоротший шлях між
вершинами a та g. Побудувати наростаюче орієнтоване дерево
найкоротших шляхів.

4.4 Аналіз результатів роботи. Висновки


Проаналізувавши одержані результати роботи, зробити
висновки, у яких вказати знайдений за допомогою алгоритму
Белмана-Форда найкоротший шлях та його довжину.

33
4.5 Контрольні запитання
1. В чому принципова відмінність між алгоритмами
Дейкстри та Белмана-Форда?
2. Чи можна, використовуючи алгоритм Белмана-Форда,
виявити в графі контур від'ємної довжини?
3. В якому випадку закінчується робота алгоритму
Белмана-Форда?

34
ЛАБОРАТОРНА РОБОТА № 5
Реалізація алгоритму Флойда-Уоршола пошуку усіх
найкоротших шляхів

5.1 Мета і завдання роботи роботи


Мета роботи – засвоїти принцип пошуку найкоротших
шляхів між усіма вершинами графа за допомогою алгоритму
Флойда-Уоршола.
Завдання роботи – знайти за допомогою алгоритму
Флойда-Уоршола найкоротші шляхи між усіма вершинами
заданого графа.
Тривалість лабораторної роботи – 6 год. (3 пари).

5.2 Основні теоретичні положення


Алгоритм Флойда-Уоршола дозволяє знаходити
найкоротшого шляху між кожною парою вершин для заданого
графа. В даному алгоритмі для довжин дуг допускаються від'ємні
значення, однак не допускається наявність контурів від'ємні
довжини.
Занумеруємо вершини вхідного графа цілими числами від 1
𝑚
до N. Позначимо через 𝑑𝑖,𝑗 довжину найкоротшого шляху з
вершини i у вершину j, який у якості проміжних може містити
тільки перші m вершин графа. Якщо між вершинами i та j не
існує жодного шляху зазначеного типу, то умовно будемо
𝑚 𝑚
вважати, що 𝑑𝑖,𝑗 = ∞. З даного визначення величин 𝑑𝑖,𝑗 випливає,
0
що величина 𝑑𝑖,𝑗 представляє довжину найкоротшого шляху з
вершини i у вершину j, що не має проміжних вершин, тобто
довжину найкоротшої дуги, що з'єднує i з j (якщо така дуга

35
0
присутня в графі). Для будь-якої вершини i присвоїмо 𝑑𝑖,𝑖 = 0.
𝑚
Відзначимо далі, що величина 𝑑𝑖,𝑗 представляє довжину
найкоротшого шляху між вершинами i та j.
Позначимо через 𝐷𝑚 матрицю розмірністю N×N,
𝑚
елементами якої є величини 𝑑𝑖,𝑗 . Якщо у вхідному графі відома
довжина кожної дуги, то можна сформувати матрицю 𝐷0 .
В алгоритмі Флойда-Уоршола в якості вхідної виступає
матриця 𝐷0 . Спочатку за даною матрицею обчислюється матриця
𝐷1 . Потім, за матрицею 𝐷1 обчислюється матриця 𝐷2 і т.д.
Процес повторюється доти, поки за матрицею 𝐷𝑁−1 не буде
обчислена матриця 𝐷𝑁 .
Алгоритм Флойда-Уоршола для знаходження на графі
найкоротших шляхів між усіма парами вершин є таким.
Крок 1. Занумерувати вершини вхідного графа цілими
числами від 1 до N. Визначити матрицю 𝐷0 , задавши величину
0
кожного її елемента 𝑑𝑖,𝑗 рівну довжині найкоротшої дуги, що
з'єднує вершину i з вершиною j. Якщо у вихідному графі
0
зазначені вершини не з'єднуються дугами, то 𝑑𝑖,𝑗 = ∞. Крім того,
0
для всіх i=j – 𝑑𝑖,𝑗 = 0.
Крок 2. Для цілого m, що послідовно набуває значень 1, 2,...,
N, визначити за величинами елементів матриці 𝐷𝑚−1 величини
елементів матриці 𝐷𝑚 , використовуючи таке рекурсивне
співвідношення:

{
dim, j = min dim, m−1 + d m
m −1 m −1
}
, j ; di, j . (5.1)

При визначенні величини кожного елемента матриці D𝑚


фіксувати відповідний найкоротший шлях.

36
𝑁
По закінченню даної процедури величина елемента 𝑑𝑖,𝑗
матриці 𝐷𝑁 визначає довжину найкоротшого шляху, що веде з
вершини i у вершину j.
𝑚
Слід відзначити, що для всіх i та m повинне бути 𝑑𝑖,𝑖 = 0.
Тому немає необхідності в обчисленні діагональних елементів
матриць 𝐷1 , 𝐷2 ,…, 𝐷𝑁 . Крім того, для всіх i=1, 2,..., N мають
місце співвідношення:

dim, m−1 = dim, m , (5.2)


m −1 m
dm , i = d m, i . (5.3)

Приклад 5.1. Використовуючи алгоритм Флойда-Уоршола,


знайти у графі, зображеному на рис. 5.1, найкоротші шляхи між
усіма вершинами.

Рисунок 5.1.

Розв'язок.
Крок 1. Матриця 𝐷0 є наступною:
0 1 2 1
2 0 7 ∞
D0 = .
6 5 0 2
1 ∞ 4 0
Крок 2. m=1.

37
{
Елементи матриці D1 , di1, j = min di0,1 + d10, j ; di0, j } Відповідні
шляхи
d11,1 = d10,1 = 0 -

d11,2 = d10,2 = 1 (1, 2)

d11,3 = d10,3 = 2 (1, 3)

d11,4 = d10,4 = 1 (1, 4)

d 12,1 = d 20,1 = 2 (2, 1)

d 12,2 = 0 -

{ }
d 12,3 = min d 20,1 + d10,3 ; d 20,3 = min{2 + 2; 7} = 4 (2, 1, 3)

d 12,4 = min{d 20,1 + d10,4 ; d 20,4 }= min{2 + 1; ∞} = 3 (2, 1, 4)

d31,1 = d30,1 = 6 (3, 1)

{ }
d31,2 = min d30,1 + d10,2 ; d30,2 = min{6 + 1; 5} = 5 (3, 2)

d31,3 = 0 -

{ }
d31,4 = min d30,1 + d10,4 ; d30,4 = min{6 + 1; 2} = 2 (3, 4)

d 14,1 = d 40,1 = 1 (4, 1)

{ }
d 14,2 = min d 40,1 + d10,2 ; d 40,2 = min{1 + 1; ∞} = 2 (4, 1, 2)

d 14,3 = min{d 40,1 + d10,3 ; d 40,3 }= min{1 + 2; 4} = 3 (4, 3)

d 14,4 = 0 -

38

Матриця 𝐷1 та матриця найкоротших шляхів 𝐷1 для
елементів матриці 𝐷1 є наступними:
0 1 2 1 − (1, 2) (1, 3) (1, 4)
2 0 4 3 ′ (2,1) − (2,1, 3) (2,1, 4)
D1 = , D1 = .
6 5 0 2 (3,1) (3, 2) − (3, 4)
1 2 3 0 (4,1) (4,1, 2) (4,1, 3) −
Крок 2. m=2.

{
Елементи матриці D 2 , di2, j = min di1,2 + d 12, j ; di1, j } Відповідні
шляхи
d12,1 = 0 -

d12,2 = d11,2 = 1 (1, 2)

{ }
d12,3 = min d11,2 + d 12,3 ; d11,3 = min{1 + 4; 2} = 2 (1, 3)

d12,4 = min{d11,2 + d 12,4 ; d11,4 }= min{1 + 3;1} = 1 (1, 4)

d 22,1 = d 12,1 = 2 (2, 1)

d 22,2 = 0 -

d 22,3 = d 12,3 = 4 (2, 1, 3)

d 22,4 = d 12,4 = 3 (2, 1, 4)

{ }
d 32,1 = min d 31,2 + d 12,1 ; d 31,1 = min{5 + 2; 6} = 6 (3, 1)

d 32,2 = d 31,2 = 5 (3, 2)

d 32,3 = 0 -

{ }
d 32,4 = min d 31,2 + d 12,4 ; d 31,4 = min{5 + 3; 2} = 2 (3, 4)

39
{
Елементи матриці D 2 , di2, j = min di1,2 + d 12, j ; di1, j } Відповідні
шляхи
{ }
d 42,1 = min d 14,2 + d 12,1 ; d 14,1 = min{2 + 2; 1} = 1 (4, 1)

d 42,2 = d 14,2 = 2 (4, 1, 2)

{ }
d 42,3 = min d 14,2 + d 12,3 ; d 14,3 = min{2 + 4; 3} = 3 (4, 3)

d 42,4 = 0 -

Матриця 𝐷2 та матриця найкоротших шляхів 𝐷 2 для
елементів матриці 𝐷2 є наступними:
0 1 2 1 − (1, 2) (1, 3) (1, 4)
2 0 4 3 ′ (2,1) − (2,1, 3) (2,1, 4)
D2 = , D2 = .
6 5 0 2 (3,1) (3, 2) − (3, 4)
1 2 3 0 (4,1) (4,1, 2) (4,1, 3) −
Аналогічним чином визначаються елементи матриць 𝐷3 та
𝐷4 і відповідні їм матриці найкоротших шляхів. Одержані
результати наведені нижче.
0 1 2 1 − (1, 2) (1, 3) (1, 4)
2 0 4 3 (2, 1) − (2, 1, 3) (2, 1, 4)
D3 = , D3′ = .
6 5 0 2 (3, 1) (3, 2) − (3, 4)
1 2 3 0 (4, 1) (4, 1, 2) (4, 1, 3) −

0 1 2 1 − (1, 2) (1, 3) (1, 4)


2 0 4 3 4′ (2, 1) − (2, 1, 3) (2, 1, 4)
D4 = ,D =
3 4 0 2 (3, 4,1) (3, 4,1, 2) − (3, 4)
1 2 3 0 (4, 1) (4, 1, 2) (4, 1, 3) −

40
5.3 Порядок виконання роботи
Варіант № 1
1. Використовуючи алгоритм Флойда-Уоршола, знайти у
графі, наведеному на рис. 5.2 а, найкоротші шлях між усіма
вершинами.

а б
Рисунок 5.2.

Варіант № 2
1. Використовуючи алгоритм Флойда-Уоршола, знайти у
графі, наведеному на рис. 5.2 б, найкоротші шлях між усіма
вершинами.

5.4 Аналіз результатів роботи. Висновки


Проаналізувавши одержані результати роботи, зробити
висновки, у яких вказати знайдені за допомогою алгоритму
Флойда-Уоршола найкоротші шляхи між вершинами та їхню
довжину.

5.5 Контрольні запитання


𝑚
1. Що визначає величина 𝑑𝑖,𝑗 ?
2. З яких елементів складається матриця 𝐷0 ?
41
3. В якому випадку елемент матриці 𝐷0 рівний ∞?
4. Поясніть зміст рекурсивного співвідношення (5.1).
5. Поясніть зміст співвідношень (5.2) - (5.3).

42
ЛАБОРАТОРНА РОБОТА № 6
Реалізація алгоритму Данцига пошуку усіх найкоротших
шляхів

6.1 Мета і завдання роботи роботи


Мета роботи – засвоїти принцип пошуку найкоротших
шляхів між усіма вершинами графа за допомогою алгоритму
Данцига.
Завдання роботи – знайти за допомогою алгоритму
Данцига найкоротші шляхи між усіма вершинами заданого графа.
Тривалість лабораторної роботи – 6 год. (3 пари).

6.2 Основні теоретичні положення


Ще один алгоритм пошуку на графі найкоротших шляхів
між усіма парами вершин запропонований американським
математиком Джорджем Данцигом. Алгоритм Данцига досить
близький до алгоритму Флойда-Уоршола та відрізняється від
останнього лише іншим порядком виконання тих самих операцій.
Ідея алгоритму Данцига полягає в наступному. Кожна нова
матриця D𝑚 , що обчислюється, містить на один рядок і на один
стовпець більше, чим її попередниця, матриця D𝑚−1 . Елементи
матриці D𝑚 , що не входять в останній рядок і стовпець (число
таких елементів рівне (m-1)2), визначаються аналогічно, як і в
алгоритмі Флойда-Уоршола. Що ж стосується інших елементів
𝑚
𝑑𝑖,𝑗 , де i=m або j=m, то вони визначаються виходячи з наведених
нижче міркувань. Найкоротший шлях з вершини i у вершину j
(або навпаки), у якому допускається використання в якості
проміжних тільки перших m вершин графа, не може мати серед

43
проміжних вершину m, оскільки будь-який контур у вихідному
графі не має від'ємної довжини. Отже, такий найкоротший шлях з
вершини i у вершину m повинен мати своєю першою частиною
найкоротший шлях з вершини i у деяку вершину j (j<m), який
допускає використання в якості проміжних тільки m-1 перших
вершин графа, а другою частиною – найкоротшу дугу, що веде з
вершини j у вершину m (звичайно, слід розглядати тільки такі
вершини j, для яких існує хоча б одна дуга, що веде з j у m).
Аналогічно, найкоротший шлях з вершини m у вершину i, у
якому допускається використання в якості проміжних тільки m
перших вершин графа, повинен мати своєю першою частиною
найкоротшу дугу, що веде з вершини m у деяку вершину j (j<m), а
другою частиною – найкоротший шлях з вершини j в вершину i,
який допускає використання в якості проміжних тільки (m-1)
перших вершин (звичайно, слід розглядати тільки такі вершини j,
для яких існує хоча б одна дуга, що веде з m у j). Нарешті,
𝑚
відзначимо, що величини 𝑑𝑚,𝑚 повинні бути рівними нулю.
З урахуванням наведених міркувань, опишемо алгоритм
Данцига.
Крок 1. Занумерувати вершини вихідного графа цілими
числами від 1 до N. Сформувати матрицю 𝐷0 , (розмірністю N×N),
0
кожний елемент 𝑑𝑖,𝑗 якої визначає довжину найкоротшої дуги, що
веде з вершини i у вершину j. При відсутності такої дуги
0
присвоїти 𝑑𝑖,𝑗 = ∞.
Крок 2. Через 𝐷𝑚 позначається матриця розмірністю m×m з
𝑚
елементами 𝑑𝑖,𝑗 , m=1, 2, ..., N. Послідовно визначити елементи
матриці 𝐷𝑚 за елементами матриці 𝐷𝑚−1 для m, що приймає
значення 1, 2, ..., N:

44
m
dm ,j = min
i =1,2,..., m −1
{dm 0
, i + d i, j } ( j = 1,2,..., m − 1) ,
m −1 (6.1)

d im, m = min
j =1,2,..., m −1
{d im, j−1 + d 0j , m } (i = 1,2,..., m − 1) , (6.2)

{
d im, j = min d im, m + d m
m m −1
, j ; d i, j }
(i, j = 1,2,..., m − 1) . (6.3)

Крім того, для всіх i та m:

d im,i = 0 . (6.4)

Найкоротші шляхи, довжини яких визначаються


𝑁
величинами 𝑑𝑖,𝑗 елементів матриці 𝐷𝑁 , можуть бути визначені
аналогічно тому, як це робилося в алгоритмі Флойда-Уоршола.
Згідно з формулами (6.1)-(6.4), на кожному кроці 2
алгоритму спочатку необхідно обчислювати значення елементів
𝑚
𝑑𝑖,𝑗 матриці 𝐷𝑚 , що знаходяться в m-му стовпчику та m-му рядку
матриці (формули (6.1), (6.2)), а потім усі інші елементи за
формулою (6.3) (крім елементів основної діагоналі матриці, що
завжди рівні 0).
Приклад 6.1. Застосувати алгоритм Данцига до графа,
наведеного в прикладі 5.1 (рис. 5.1).
Розв'язок.
Крок 1. Матриця 𝐷0 є наступною:
0 1 2 1
2 0 7 ∞
D0 = .
6 5 0 2
1 ∞ 4 0
Крок 2. m=1. Очевидно, що матриця 𝐷1 буде наступною:

D1 = d11,1 = 0 .

45
Крок 2. m=2.
Елементи матриці D 2 Відповідні шляхи

d12,1 = 0 -

{ }
d12,2 = min d11,1 + d10,2 = min{0 + 1} = 1 (1, 2)

d 22,1 = min{d 20,1 + d11,1}= min{2 + 0} = 2 (2, 1)

d 22,2 = 0 -

Матриця 𝐷2 та матриця найкоротших шляхів 𝐷 2 для
елементів матриці 𝐷2 є наступними:
0 1 ′ − (1, 2)
D2 = , D2 = .
2 0 (2, 1) −
Слід відзначити, що наведені результати ідентичні даним,
розташованим у лівій верхній підматриці розмірністю 2×2
матриці 𝐷2 , що одержана в прикладі 5.1 за допомогою алгоритму
Флойда-Уоршола.
Крок 2. m=3.
3
Відповідні
Елементи матриці D
шляхи
d13,1 = d 23,2 = d33,3 = 0 -

{ }
d13,3 = min d12,1 + d10,3 ; d12,2 + d 20,3 = min{0 + 2;1 + 7} = 2 (1, 3)

d 23,3 = min{d 22,1 + d10,3 ; d 22,2 + d 20,3 }= min{2 + 2; 0 + 7} = 4 (2, 1), (1, 3)

d 33,1 = min{d 30,1 + d12,1; d 30,2 + d 22,1}= min{6 + 0; 5 + 2} = 6 (3, 1)

d 33,2 = min{d 30,1 + d12,2 ; d 30,2 + d 22,2 }= min{6 + 1; 5 + 0} = 5 (3, 2)

46
3
Відповідні
Елементи матриці D
шляхи
{ }
d13,2 = min d13,3 + d 33,2 ; d12,2 = min{2 + 5;1} = 1 (1, 2)

d 23,1 = min{d 23,3 + d 33,1; d 22,1}= min{4 + 6; 2} = 2 (2, 1)



Матриця 𝐷3 та матриця найкоротших шляхів 𝐷 3 для
елементів матриці 𝐷3 є наступними:
0 1 2 − (1, 2) (1, 3)

D3 = 2 0 4 , D3 = (2,1) − (2,1, 3) .
6 5 0 (3,1) (3, 2) −
Слід відзначити, що обчислена вище матриця 𝐷3 збігається з
лівою верхньою підматрицею розмірністю 3×3 матриці 𝐷3 , що
одержана в прикладі 5.1 за допомогою алгоритму Флойда-
Уоршола. Аналогічним чином обчислюється матриця 𝐷4 , яка
повністю співпадає з матрицею 𝐷4 з прикладу 5.1.

6.3 Порядок виконання роботи


Варіант № 1
1. Використовуючи алгоритм Данцига, знайти у графі,
наведеному на рис. 6.1 а, найкоротші шлях між усіма вершинами.
Варіант № 2
1. Використовуючи алгоритм Данцига, знайти у графі,
наведеному на рис. 6.1 б, найкоротші шлях між усіма вершинами.

47
а б
Рисунок 6.1.

6.1 Аналіз результатів роботи. Висновки


Проаналізувавши одержані результати роботи, зробити
висновки, у яких вказати знайдені за допомогою алгоритму
Данцига найкоротші шляхи між вершинами та їхню довжину.

6.2 Контрольні запитання


1. В чому принципова різниця між алгоритмами Флойда-
Уоршола та Данцига?
2. В чому полягає ідея алгоритму Данцига?
3. В якому порядку необхідно визначати елементи матриці
D𝑚 ?
4. Поясніть зміст співвідношень (6.1) - (6.3).
5. Яка існує залежність між матрицями 𝐷𝑚 , що
визначаються за алгоритмами Флойда-Уоршола та Данцига?

48
ЛАБОРАТОРНА РОБОТА № 7
Реалізація алгоритму подвійного пошуку k перших
найкоротших шляхів

7.1 Мета і завдання роботи роботи


Мета роботи – засвоїти принцип пошуку k перших
найкоротших шляхів з деякої фіксованої вершини до усіх інших
вершин графа.
Завдання роботи – знайти за допомогою алгоритму
подвійного пошуку k перших найкоротших шляхів між заданою
вершиною та усіма іншими вершинами графа.
Тривалість лабораторної роботи – 12 год. (6 пари).

7.2 Основні теоретичні положення


Алгоритм подвійного пошуку дозволяє знаходити k перших
найкоротших шляхів з деякої фіксованої вершини до усіх інших
вершин вхідного графа.
В алгоритмі подвійного пошуку використовуються дві
спеціальні алгебраїчні операції. Вони називаються узагальненими
операціями, оскільки виконуються не над числами, а над
векторами. Перейдемо до розгляду даних операцій. Перша з них
називається узагальненою операцією мінімізації, друга –
узагальненою операцією додавання. Дані операції є двомісними,
тобто вони можуть виконуватися тільки над двома векторами.
Нехай А=(а1, а2, ..., аk) та B=(b1, b2, ..., bk) – два вектори із
множини Rk (множини векторів (d1, d2, ..., dk), що задовольняють
умову d1<d2<...<dk). Узагальнена операція мінімізації (порівняння)

49
для А та В, що позначається знаком ⊕, визначається в такий
спосіб:
A ⊕ B = min k (ai , bi : i = 1, 2, ..., k ) . (7.1)
Іншими словами, при виконанні узагальненої операції
мінімізації спочатку визначається множина усіх елементи двох
заданих векторів розмірності k, а потім будується третій вектор
такої ж розмірності, складений з k різних найменших по величині
елементів цієї множини, розташованих у строго зростаючому
порядку. Якщо в новому векторі число скінченних елементів
менше його розмірності, то інші елементи приймаються рівними
∞.
Узагальнена операція додавання для векторів А та В, що
позначається знаком ⊗, визначається в такий спосіб:
A ⊗ B = min k (ai + b j : i, j = 1, 2, ..., k ) . (7.2)

Іншими словами, при виконанні узагальненої операції


додавання спочатку визначається множина усіх можливих
попарних сум елементів двох заданих векторів однакової
розмірності, а потім будується третій вектор такої ж розмірності,
першим елементом якого є мінімальний елемент побудованої
множини. Інші елементи вектора вибираються так само, як було
показано при описі узагальненої операції мінімізації.
0 0 0 0
Визначимо на множині Rk вектор 𝑑𝑖,𝑗 =( 𝑑𝑖,𝑗,1 , 𝑑𝑖,𝑗,2 , …, 𝑑𝑖,𝑗,𝑘 ).
Елементи даного вектора задають довжини k найкоротших дуг,
що ведуть із вершини i у вершину j. Якщо будь-які дві дуги, що
ведуть із i у j, мають однакові довжини, то відповідне число
0
визначає лише один з елементів вектора 𝑑𝑖,𝑗 . Якщо серед
розглянутих дуг не можна знайти k дуг, що мають різні довжини,

50
0
то невизначені елементи вектора 𝑑𝑖,𝑗 умовно приймаються
рівними ∞. Наприклад, якщо вершина i з'єднана з вершиною j
трьома дугами, що мають довжини відповідно 9, 13 і 9, то для k=4
0
𝑑𝑖,𝑗 =(9, 13, ∞, ∞). При i=j вважаємо, що існує деяка дуга нульової
довжини, що є петлею у вершині i. Позначимо через D0 матрицю,
0
елемент якої збігається з вектором 𝑑𝑖,𝑗 .
Занумеруємо вершини вихідного графа цілими числами від
𝑚 𝑚 𝑚 𝑚
1 до N. Введемо вектор 𝑑𝑖,𝑗 =( 𝑑𝑖,𝑗,1 , 𝑑𝑖,𝑗,2 , …, 𝑑𝑖,𝑗,𝑘 )∈Rk, елементи
якого задають довжини k найкоротших шляхів, що ведуть із
вершини i у вершину j та використовують у якості проміжних
вершини 1, 2, .., m. Позначимо через 𝐷𝑚 матрицю, кожний
𝑚
елемент якої збігається із 𝑑𝑖,𝑗 .
∗ ∗ ∗ ∗
Позначимо через 𝑑𝑖,𝑗 =( 𝑑𝑖,𝑗,1 , 𝑑𝑖,𝑗,2 , …, 𝑑𝑖,𝑗,𝑘 )∈Rk вектор,
елементи якого збігаються з довжинами k найкоротших шляхів,
що ведуть із вершини i у вершину j. Ці довжини будемо називати
оптимальними довжинами відповідних шляхів. Позначимо через

D∗ матрицю, кожний елемент якої збігається із 𝑑𝑖,𝑗 .
Виберемо із множини Rk вектори F=(0, ∞, ∞, …, ∞) та
V=(∞, ∞, ∞, …, ∞). Тоді, для будь-якого вектора A∈Rk
справедливі наступні співвідношення:
A ⊕V = A , (7.3)
A ⊗V = V , (7.4)
A⊗ F = A (7.5)
Нехай матриця L утворена з матриці 𝐷0 шляхом заміни всіх
0
елементів кожного вектора 𝑑𝑖,𝑗 (при i≤j) величиною ∞. Нехай
матриця U утворена з матриці 𝐷0 шляхом заміни всіх елементів
0
кожного вектора 𝑑𝑖,𝑗 (при i≥j) величиною ∞. Матриці L і U

51
називаються відповідно верхньою трикутною та нижньою
трикутною підматрицями матриці 𝐷0 (рис. 7.1).
d10,1 d10,2 d10,3 V V V Vd10,2 d10,3
D 0 = d 20,1 d 20,2 d 20,3 , L = d 20,1 V V, U =V V d 20,3 .
d30,1 d30,2 d30,3 d30,1 d30,2 V V V V

Рисунок 7.1.

Якщо необхідно визначити довжини k найкоротших шляхів,


що ведуть із деякої фіксованої вершини (наприклад, вершини 1) у
кожну вершину вхідного графа, то слід визначити тільки перший
∗ ∗ ∗
рядок ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ) матриці 𝐷 ∗ . Зазначимо, що цей рядок
складається з N векторів, що належать Rk. Отже, необхідно
визначити Nk величин і Nk шляхів, що мають відповідні довжини.
Алгоритм подвійного пошуку дозволяє ефективно
знаходити зазначені Nk шляхів. При цьому, вимагається, щоб у
вхідному графі були відсутні контури від'ємної довжини.
Робота алгоритму подвійного пошуку починається з
0 0 0
формування деякого рядка ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ), що поелементно
∗ ∗ ∗
оцінює зверху оптимальний рядок ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ). Це
означає, що кожний елемент будь-якого вектора не менший

відповідного елемента вектора 𝑑1,𝑖 . При цьому, в початковій
0
точці повинно бути 𝑑1,1,1 = 0. Зокрема, всі елементи оцінюючого
0
рядка (за винятком елемента 𝑑1,1,1 , рівного нулю) могли б бути
прийняті рівними ∞. Потім в алгоритмі обчислюються нові

(менші) оцінки для кожного вектора 𝑑1,𝑖 . Це здійснюється
шляхом багаторазового коректування вхідного оцінюючого
0
вектора 𝑑1,𝑖 . Коректування полягає в переході до нового вектора,

52
що одержується в результаті виконання узагальненої операції
0 0 0
порівняння над “старим” вектором 𝑑1,𝑖 та вектором 𝑑1,𝑗 ⊗𝑑𝑗,𝑖 .
Коректування проводиться для всіх цілих j від 1 до N. По
закінченню процесу коректування одержується нова оцінка
∗ 1
вектора 𝑑1,𝑖 – вектор 𝑑1,𝑖 . Таким чином, може бути одержаний
1 1 1
увесь новий оцінюючий рядок ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ). Далі процес
триває аналогічним чином. Робота алгоритму закінчується при
𝑖
співпаданні двох послідовно держаних оцінюючих рядків – ( 𝑑1,1 ,
𝑖 𝑖 𝑖+1 𝑖+1 𝑖+1
𝑑1,2 , …, 𝑑1,𝑁 ) та ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ) для i≥1. При цьому, можна
довести, що останній з отриманих оцінюючих рядків збігається з
∗ ∗ ∗
оптимальним рядком ( 𝑑1,1 , 𝑑1,2 , …, 𝑑1,𝑁 ).
З врахуванням вищенаведеного, алгоритм подвійного
пошуку є наступним.
Крок 1. Сформувати початковий оцінюючий рядок 𝑑10 =( 𝑑1,1
0
,
0 0
𝑑1,2 , …, 𝑑1,𝑁 ), для оптимального рядка 𝑑1∗ з елементів, не менших
по величині за відповідні елементи рядка 𝑑1∗ . При цьому,
0
присвоїти 𝑑1,1,1 = 0 (по припущенню у вершині 1 є петля
нульової довжини).
Крок 2. За умови, що для рядка 𝑑1∗ визначений оцінюючий
рядок 𝑑12𝑟 , визначити оцінюючі рядки 𝑑12𝑟+1 та 𝑑12𝑟+2 наступним
чином:
Зворотній пошук:

d1( 2r +1) = d1( 2r +1) ⊗ L ⊕ d1( 2r ) (7.6)

Прямий пошук:

d1( 2r + 2) = d1( 2r + 2) ⊗ U ⊕ d1( 2r +1) (7.7)

53
Крок 2, що є основним кроком алгоритму, проводиться
послідовно для r=0, 1, 2, ... і т.д. Якщо на деякому кроці, в
результаті послідовного виконання операцій (7.6) та (7.7), будуть
отримані однакові вектори оцінок, то знайдений розв'язок є
оптимальним. Операції, що визначаються співвідношеннями (7.6)
та (7.7), називаються операціями зворотного та прямого пошуку
відповідно. У кожному із цих співвідношень у першу чергу
виконується узагальнена операція додавання.
Пояснимо детальніше, як відбувається процедура
зворотного та прямого пошуку. Що стосується співвідношення
(7.6), то спочатку в рядку 𝑑12𝑟+1 визначається вектор 𝑑1,𝑁
2𝑟+1
(це
можливо тому, що N-й стовпець матриці L складається з векторів,
усі елементи яких збігаються з ∞, а отже, враховуючи
співвідношення (7.4), права частина рівняння (7.6) фактично від
d2r+11 не залежить). Потім, за співвідношенням (7.6) визначається
другий від кінця у рядку 𝑑12𝑟+1 вектор 𝑑1,𝑁−1
2𝑟+1
(це можливо тому,
що N-1-й стовпець матриці L складається з векторів, серед яких
тільки у вектора останнього рядка матриці L деякі з елементів
можуть бути не рівні ∞, а отже, права частина співвідношення
2𝑟+1
(7.6) фактично залежить лише від вектора 𝑑1,𝑁 , який уже був
обчислений на попередньому кроці). Далі, за співвідношенням
2𝑟+1 2𝑟+1
(7.6) визначаються вектори 𝑑1,𝑁−2 , 𝑑1,𝑁−3 і т.д. до визначення усіх
векторів рядка 𝑑12𝑟+1 (див. приклад 7.1). Таким чином, за
допомогою співвідношення (7.6) можна визначити всі вектори
рядка 𝑑12𝑟+1 , якщо починати з останнього та закінчувати першим
елементом. Це дозволяє назвати обчислення за допомогою
співвідношення (7.6) процедурою зворотного пошуку. Аналогічно
за допомогою співвідношення (7.7) можна визначити всі вектори

54
рядка 𝑑12𝑟+2 , якщо починати з першого та закінчувати останнім
елементом. Відповідно проведення обчислень по співвідношенню
(7.7) можна назвати процедурою прямого пошуку.
Приклад 7.1. Нехай r=0, N=3, 𝑑10 =( 𝑑1,1
0 0
, 𝑑1,2 0
, 𝑑1,3 ) – відомий
оцінюючий рядок. Знайдемо оцінюючий рядок 𝑑11 =( 𝑑1,1
1 1
, 𝑑1,2 ,
1
𝑑1,3 ).
Розв'язок.

V V V
d11 = (d11,1, d11,2 , d11,3 ) ⊗ d 20,1 V V ⊕ (d10,1, d10,2 , d10,3 ) .
d 30,1 d 30,2 V

Враховуючи правило добутку вектора і матриці, одержимо:


d11,1 = ((d11,1 ⊗ V ) ⊕ (d11,2 ⊗ d 20,1 ) ⊕ (d11,3 ⊗ d 30,1 )) ⊕ d10,1 ,

d11,2 = ((d11,1 ⊗ V ) ⊕ (d11,2 ⊗ V ) ⊕ (d11,3 ⊗ d 30,2 )) ⊕ d10,2 ,

d11,3 = ((d11,1 ⊗ V ) ⊕ (d11,2 ⊗ V ) ⊕ (d11,3 ⊗ V )) ⊕ d10,3 .


Враховуючи співвідношення (7.3) та (7.4):
d11,1 = (V ⊕ (d11,2 ⊗ d 20,1 ) ⊕ (d11,3 ⊗ d 30,1 )) ⊕ d10,1 = ((d11,2 ⊗ d 20,1 ) ⊕

⊕ (d11,3 ⊗ d30,1 )) ⊕ d10,1 ,

d11,2 = (V ⊕ V ⊕ (d11,3 ⊗ d 30,2 )) ⊕ d10,2 = (d11,3 ⊗ d 30,2 ) ⊕ d10,2 ,

d11,3 = (V ⊕ V ⊕ V ) ⊕ d10,2 = V ⊕ d10,2 = d10,3 .


Таким чином, для знаходження усіх векторів оцінюючого
рядка 𝑑11 , необхідно починати пошук з останнього елемента
1
вектора – 𝑑1,3 .

55
Після того як будуть знайдені довжини шляхів, виконується
процедура трасування, що дозволяє визначити відповідні шляхи.
Суть її полягає в наступному. Припустимо, що потрібно знайти
m-й найкоротший шлях із початкової вершини в вершину i.
Нехай 𝑑𝑚,𝑖 – довжина цього шляху і нехай вершина j з'єднана
дугою з вершиною i. Тоді
d m,i = d t , j + d ( j ,i ) (7.8)

де 𝑑𝑗,𝑖 – довжина дуги (j, i), 𝑑𝑡,𝑗 – довжина t-гo найкоротшого


шляху з початкової вершини у вершину j (t≤m). Для кожної
вершини i процедура трасування полягає в пошуку вершини j,
для якої виконується співвідношення (7.8). Як тільки вузол j буде
знайдений, необхідно знову повернутись до даної процедури і
виконувати її доти, поки не буде досягнуто початкової вершини.
Якщо потрібно знайти найкоротші шляхи, що не містять циклів,
то описану вище процедуру слід модифікувати. Модифікація
полягає в наступному: якщо деяка вершина є “кандидатом” у
вершини, що належать розглянутому шляху, то слід перевірити,
чи не була дана вершина раніше одержана за допомогою
співвідношення (7.8).
Приклад 7.2. Використовуючи алгоритм подвійного пошуку,
знайти перші три найкоротші шляхи, що ведуть з вершини 1 у всі
інші вершини графа наведеного на рис. 7.2.
Розв'язок.
Крок 1. Матриця 𝐷0 , що складена з дуг даного графа, а
також матриці L та U будуть наступними:

56
Рисунок 7.2.

(0, ∞, ∞) (1, ∞, ∞) ( ∞, ∞, ∞ ) ( ∞, ∞, ∞ )
(2, 4, ∞) (0, ∞, ∞) (−1, ∞, ∞) ( ∞, ∞, ∞ )
D0 = ,
(2, ∞, ∞) ( ∞, ∞, ∞ ) (0, ∞, ∞) (−1, ∞, ∞)
( ∞, ∞, ∞ ) (3, ∞, ∞) (2, ∞, ∞) (0, ∞, ∞)

(∞, ∞, ∞) (∞, ∞, ∞) ( ∞, ∞, ∞) ( ∞, ∞, ∞)
(2, 4, ∞) (∞, ∞, ∞) (∞, ∞, ∞) ( ∞, ∞, ∞)
L= ,
(2, ∞, ∞) ( ∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞)
( ∞, ∞ , ∞ ) (3, ∞, ∞) (2, ∞, ∞) ( ∞, ∞, ∞ )

(∞, ∞, ∞) (1, ∞, ∞) ( ∞, ∞, ∞) ( ∞, ∞, ∞)
(∞, ∞, ∞) (∞, ∞, ∞) ( −1, ∞, ∞) ( ∞, ∞, ∞)
U= .
(∞, ∞, ∞) ( ∞, ∞, ∞) (∞, ∞, ∞) ( −1, ∞, ∞)
(∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞)
Початковий оцінюючий рядок 𝑑10 буде наступним:
d10 = (0, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) .
Крок 2. r=0.
Зворотній пошук (використовуємо співвідношення (7.6)):
d11,4 = d10,4 = (∞, ∞, ∞) ,

d11,3 = (d11,4 ⊗ L4,3 ) ⊕ d10,3 = ((∞, ∞, ∞) ⊗ (2, ∞, ∞)) ⊕ (∞, ∞, ∞) =


= ( ∞, ∞, ∞ ) ⊕ ( ∞, ∞, ∞ ) = ( ∞, ∞, ∞ ) ,
57
d11,2 = ((d11,3 ⊗ L3,2 ) ⊕ (d11,4 ⊗ L4,2 )) ⊕ d10,2 = (((∞, ∞, ∞) ⊗
⊗ (∞, ∞, ∞)) ⊕ ((∞, ∞, ∞) ⊗ (3, ∞, ∞))) ⊕ (∞, ∞, ∞) = ((∞, ∞, ∞) ⊕ (∞, ∞, ∞)) ⊕
⊕ ( ∞ , ∞ , ∞ ) = ( ∞, ∞, ∞ ) ⊕ ( ∞, ∞, ∞ ) = ( ∞, ∞, ∞ ) ,
d11,1 = ((d11,2 ⊗ L2,1 ) ⊕ (d11,3 ⊗ L3,1 ) ⊕ (d11,4 ⊗ L4,1 )) ⊕ d10,1 =
= (((∞, ∞, ∞) ⊗ (2, 4, ∞)) ⊕ ((∞, ∞, ∞) ⊗ (2, ∞, ∞)) ⊕ ((∞, ∞, ∞) ⊗
⊗ (∞, ∞, ∞))) ⊕ (0, ∞, ∞) = (((∞, ∞, ∞) ⊕ (∞, ∞, ∞)) ⊕ (∞, ∞, ∞)) ⊕
⊕ (0, ∞, ∞) = ((∞, ∞, ∞) ⊕ (∞, ∞, ∞)) ⊕ (0, ∞, ∞) = (∞, ∞, ∞) ⊕ (0, ∞, ∞) =
= (0, ∞, ∞) .
Отже, оцінюючий рядок 𝑑11 буде наступним:
d11 = (0, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) .
Прямий пошук (використовуємо співвідношення(7.7)):
d12,1 = d11,1 = (0, ∞, ∞) ,

d12,2 = (d12,1 ⊗ U1,2 ) ⊕ d11,2 = ((0, ∞, ∞) ⊗ (1, ∞, ∞)) ⊕ (∞, ∞, ∞) =


= (1, ∞, ∞) ⊕ (∞, ∞, ∞) = (1, ∞, ∞) ,

d12,3 = ((d12,1 ⊗ U1,3 ) ⊕ (d12,2 ⊗ U 2,3 )) ⊕ d11,3 = (((0, ∞, ∞) ⊗


⊗ (∞, ∞, ∞)) ⊕ ((1, ∞, ∞) ⊗ (−1, ∞, ∞))) ⊕ (∞, ∞, ∞) = ((∞, ∞, ∞) ⊕
⊕ (0, ∞, ∞)) ⊕ (∞, ∞, ∞) = (0, ∞, ∞) ⊕ (∞, ∞, ∞) = (0, ∞, ∞) ,

d12,4 = ((d12,1 ⊗ U1,4 ) ⊕ (d12,2 ⊗ U 2,4 ) ⊕ (d12,3 ⊗ U 3,4 )) ⊕ d11,4 =


= (((0, ∞, ∞) ⊗ (∞, ∞, ∞)) ⊕ ((1, ∞, ∞) ⊗ (∞, ∞, ∞)) ⊕ ((0, ∞, ∞) ⊗
⊗ (−1, ∞, ∞))) ⊕ (∞, ∞, ∞) = (((∞, ∞, ∞) ⊕ (∞, ∞, ∞)) ⊕ (−1, ∞, ∞)) ⊕
⊕ (∞, ∞, ∞) = ((∞, ∞, ∞) ⊕ (−1, ∞, ∞)) ⊕ (∞, ∞, ∞) = (−1, ∞, ∞) ⊕
⊕ (∞, ∞, ∞) = (−1, ∞, ∞) .
Отже, оцінюючий рядок 𝑑12 буде наступним:
d12 = (0, ∞, ∞) (1, ∞, ∞) (0, ∞, ∞) (−1, ∞, ∞) .

58
Оскільки 𝑑11 ≠𝑑12 , то збільшуємо r на 1 і знову переходимо до
кроку 2.
Крок 2. r=1.
Зворотній пошук (використовуємо співвідношення (7.6)):
d13,4 = d12,4 = (−1, ∞, ∞) ,

d13,3 = (d13,4 ⊗ L4,3 ) ⊕ d12,3 = ((−1, ∞, ∞) ⊗ (2, ∞, ∞)) ⊕ (0, ∞, ∞) =


= (1, ∞, ∞) ⊕ (0, ∞, ∞) = (0,1, ∞) ,
d13,2 = ((d13,3 ⊗ L3,2 ) ⊕ (d13,4 ⊗ L4,2 )) ⊕ d12,2 = (((0,1, ∞) ⊗
⊗ (∞, ∞, ∞)) ⊕ ((−1, ∞, ∞) ⊗ (3, ∞, ∞))) ⊕ (1, ∞, ∞) = ((∞, ∞, ∞) ⊕
⊕ (2, ∞, ∞)) ⊕ (1, ∞, ∞) = (2, ∞, ∞) ⊕ (1, ∞, ∞) = (1, 2, ∞) ,
d13,1 = ((d13,2 ⊗ L2,1 ) ⊕ (d13,3 ⊗ L3,1 ) ⊕ (d13,4 ⊗ L4,1 )) ⊕ d12,1 =
= (((1, 2, ∞) ⊗ (2, 4, ∞)) ⊕ ((0,1, ∞) ⊗ (2, ∞, ∞)) ⊕ ((−1, ∞, ∞) ⊗
⊗ (∞, ∞, ∞))) ⊕ (0, ∞, ∞) = (((3, 4, 5) ⊕ (2, 3, ∞)) ⊕ (∞, ∞, ∞)) ⊕ (0, ∞, ∞) =
= ((2, 3, 4) ⊕ (∞, ∞, ∞)) ⊕ (0, ∞, ∞) = (2, 3, 4) ⊕ (0, ∞, ∞) = (0, 2, 3) .
Отже, оцінюючий рядок 𝑑13 буде наступним:
d13 = (0, 2, 3) (1, 2, ∞) (0,1, ∞) (−1, ∞, ∞) .
Оскільки 𝑑12 ≠𝑑13 , то продовжуємо процедуру алгоритму.
Прямий пошук (використовуємо співвідношення(7.7)):
d14,1 = d13,1 = (0, 2, 3) ,

d14,2 = (d14,1 ⊗ U1,2 ) ⊕ d13,2 = ((0, 2, 3) ⊗ (1, ∞, ∞)) ⊕ (1, 2, ∞) =


= (1, 3, 4) ⊕ (1, 2, ∞) = (1, 2, 3) ,
d14,3 = ((d14,1 ⊗ U1,3 ) ⊕ (d14,2 ⊗ U 2,3 )) ⊕ d13,3 = (((0, 2, 3) ⊗
⊗ (∞, ∞, ∞)) ⊕ ((1, 2, 3) ⊗ (−1, ∞, ∞))) ⊕ (0,1, ∞) = ((∞, ∞, ∞) ⊕ (0,1, 2)) ⊕
⊕ (0,1, ∞) = (0,1, 2) ⊕ (0,1, ∞) = (0,1, 2) ,

59
d14,4 = ((d14,1 ⊗ U1,4 ) ⊕ (d14,2 ⊗ U 2,4 ) ⊕ (d14,3 ⊗ U 3,4 )) ⊕ d13,4 =
= (((0, 2, 3) ⊗ (∞, ∞, ∞)) ⊕ ((1, 2, 3) ⊗ (∞, ∞, ∞)) ⊕ ((0,1, 2) ⊗
⊗ (−1, ∞, ∞))) ⊕ (−1, ∞, ∞) = (((∞, ∞, ∞) ⊕ (∞, ∞, ∞)) ⊕ (−1, 0,1)) ⊕ (−1, ∞, ∞) =
= ((∞, ∞, ∞) ⊕ (−1, 0,1)) ⊕ (−1, ∞, ∞) = (−1, 0,1) ⊕ (−1, ∞, ∞) = (−1, 0,1) .
Отже, оцінюючий рядок 𝑑14 буде наступним:
d14 = (0, 2, 3) (1, 2, 3) (0,1, 2) (−1, 0,1) .
Оскільки 𝑑13 ≠𝑑14 , то збільшуємо r на 1 і знову переходимо до
кроку 2.
Крок 2. r=2.
Зворотній пошук (використовуємо співвідношення (7.6)):
d15,4 = d14,4 = (−1, 0,1) .

d15,3 = (d15,4 ⊗ L4,3 ) ⊕ d14,3 = ((−1, 0,1) ⊗ (2, ∞, ∞)) ⊕ (0,1, 2) =


= (1, 2, 3) ⊕ (0,1, 2) = (0,1, 2) ,
d15,2 = ((d15,3 ⊗ L3,2 ) ⊕ (d15,4 ⊗ L4,2 )) ⊕ d14,2 = (((0,1, 2) ⊗
⊗ (∞, ∞, ∞)) ⊕ ((−1, 0,1) ⊗ (3, ∞, ∞))) ⊕ (1, 2, 3) = ((∞, ∞, ∞) ⊕ (2, 3, 4)) ⊕
⊕ (1, 2, 3) = (2, 3, 4) ⊕ (1, 2, 3) = (1, 2, 3) ,
d15,1 = ((d15,2 ⊗ L2,1 ) ⊕ (d15,3 ⊗ L3,1 ) ⊕ (d15,4 ⊗ L4,1 )) ⊕ d14,1 =
= (((1, 2, 3) ⊗ (2, 4, ∞)) ⊕ ((0,1, 2) ⊗ (2, ∞, ∞)) ⊕ ((−1, 0,1) ⊗ (∞, ∞, ∞))) ⊕
⊕ (0, 2, 3) = (((3, 4, 5) ⊕ (2, 3, 4)) ⊕ (∞, ∞, ∞)) ⊕ (0, 2, 3) = ((2, 3, 4) ⊕
⊕ (∞, ∞, ∞)) ⊕ (0, 2, 3) = (2, 3, 4) ⊕ (0, 2, 3) = (0, 2, 3) .
Отже, оцінюючий рядок 𝑑15 буде наступним:
d15 = (0, 2, 3) (1, 2, 3) (0,1, 2) (−1, 0,1) .
Оскільки 𝑑14 =𝑑15 , то робота алгоритму подвійного пошуку
завершується. Узагальнені результати дії алгоритму наведені в

60
табл. 7.1. За співвідношенням (7.8) знаходяться і відповідні k-ті
шляхи.
Таблиця 7.1 – Результати роботи алгоритму подвійного
пошуку
r Тип пошуку Вектор оцінок
Зворотній d11 = (0, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞)
r=0
Прямий d12 = (0, ∞, ∞) (1, ∞, ∞) (0, ∞, ∞) (−1, ∞, ∞)

Зворотній d13 = (0, 2, 3) (1, 2, ∞) (0,1, ∞) (−1, ∞, ∞)


r=1
Прямий d14 = (0, 2, 3) (1, 2, 3) (0,1, 2) (−1, 0,1)

r=2 Зворотній d15 = (0, 2, 3) (1, 2, 3) (0,1, 2) (−1, 0,1)

7.3 Порядок виконання роботи


Варіант № 1
1. Використовуючи алгоритм подвійного пошуку, знайти
перші два найкоротші шляхи, що ведуть з вершини 1 у всі інші
вершини графа, наведеного на рис. 7.3 а.

а б
Рисунок 7.3.

61
Варіант № 2
1. Використовуючи алгоритм подвійного пошуку, знайти
перші два найкоротші шляхи, що ведуть з вершини 1 у всі інші
вершини графа, наведеного на рис. 7.3 б.

7.4 Аналіз результатів роботи. Висновки


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

7.5 Контрольні запитання


1. Що являє собою множина Rk?
2. Що таке узагальнена операція мінімізації?
3. Що таке узагальнена операція додавання?
4. Який принцип утворення матриць L та U?
5. Як відбувається процедура зворотного та прямого
пошуку.
6. В якому випадку закінчується робота алгоритму
подвійного пошуку?

62
ПЕРЕЛІК РЕКОМЕНДОВАНИХ ДЖЕРЕЛ

1. Крив'юк І. В. Транспортно-навігаційні ГІС: конспект


лекцій / І. В. Крив'юк. – Івано-Франківськ: ІФНТУНГ, 2014. –
144 с.
2. Карнаух Т. О. Теорія графів у задачах: Навчальний
посібник / Т. О. Карнаух, А.Б. Ставровський – К.: ВПЦ
“Київський університет”, 2004. – 76 с.
3. Майника Э. Алгоритмы оптимизации на сетях и графах /
Э. Майника. – М.: Мир, 1981. – 323 с.
4. Волченская Т. В., Князьков В. С. Компьютерная
математика. Теория графов / Т. В. Волченская, В. С. Князьков. –
Пенза: Изд-во Пенз. ун-та, 2002. – 101 с.

63

You might also like