Professional Documents
Culture Documents
Лабораторний практикум Транспортно-навігаційні ГІС
Лабораторний практикум Транспортно-навігаційні ГІС
Лабораторний практикум Транспортно-навігаційні ГІС
Крив’юк
ТРАНСПОРТНО-НАВІГАЦІЙНІ ГІС
ЛАБОРАТОРНИЙ ПРАКТИКУМ
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
І. В. Крив’юк
ТРАНСПОРТНО-НАВІГАЦІЙНІ ГІС
ЛАБОРАТОРНИЙ ПРАКТИКУМ
Івано-Франківськ
2014
УДК 629.072.1:910:004.65
ББК 39.18:32.973
К-82
Рецензент:
Давибіда Л. І. кандидат геологічних наук, доцент кафедри
геотехногенної безпеки та геоінформатики
Івано-Франківського національного технічного
університету нафти і газу
Крив'юк І. В.
МВ 02070855-8046-2014
УДК 629.072.1:910:004.65
ББК 39.18:32.973
МВ 02070855-8046-2014
© Крив'юк І. В.
© ІФНТУНГ, 2014
ЗМІСТ
3
ЗАГАЛЬНІ МЕТОДИЧНІ ВКАЗІВКИ
4
ЛАБОРАТОРНА РОБОТА № 1
Знаходження багатозначних відображень та транзитивних
замикань
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 ∞
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.
12
а б
Рисунок 1.5.
Варіант № 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.
14
ЛАБОРАТОРНА РОБОТА № 2
Знаходження досяжності та контрдосяжність на графах.
Матричний метод знаходження шляхів у графах
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
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.
19
а б
Рисунок 2.4.
а б
Рисунок 2.5.
Варіант № 2
1. Для графа, наведеного на рис. 2.4 а, побудувати
матрицю контрдосяжності Q.
2. Для графа, наведеного на рис. 2.4 б, побудувати
матрицю досяжності R.
3. Для графа, наведеного на рис. 2.5 б, матричним методом
знайти усі шляхи довжиною 3.
20
2.5 Контрольні запитання
1. Що таке матриця досяжності?
2. Який принцип побудови матриці досяжності?
3. Що таке матриця контрдосяжності?
4. Принцип побудови матриці контрдосяжності.
5. Принцип знаходження шляхів у графах матричним
методом.
21
ЛАБОРАТОРНА РОБОТА № 3
Реалізація алгоритму Дейкстри пошуку найкоротшого шляху
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. Наростаюче орієнтоване дерево найкоротших
шляхів
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.
26
Варіант № 2
1. Використовуючи алгоритм Дейкстри, знайти у графі,
наведеному на рис. 3.3 б, найкоротший шлях між вершинами a та
g. Побудувати наростаюче орієнтоване дерево найкоротших
шляхів.
27
ЛАБОРАТОРНА РОБОТА № 4
Реалізація алгоритму Белмана-Форда пошуку найкоротшого
шляху
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.
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. Побудувати наростаюче орієнтоване дерево
найкоротших шляхів.
33
4.5 Контрольні запитання
1. В чому принципова відмінність між алгоритмами
Дейкстри та Белмана-Форда?
2. Чи можна, використовуючи алгоритм Белмана-Форда,
виявити в графі контур від'ємної довжини?
3. В якому випадку закінчується робота алгоритму
Белмана-Форда?
34
ЛАБОРАТОРНА РОБОТА № 5
Реалізація алгоритму Флойда-Уоршола пошуку усіх
найкоротших шляхів
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)
36
𝑁
По закінченню даної процедури величина елемента 𝑑𝑖,𝑗
матриці 𝐷𝑁 визначає довжину найкоротшого шляху, що веде з
вершини i у вершину j.
𝑚
Слід відзначити, що для всіх i та m повинне бути 𝑑𝑖,𝑖 = 0.
Тому немає необхідності в обчисленні діагональних елементів
матриць 𝐷1 , 𝐷2 ,…, 𝐷𝑁 . Крім того, для всіх i=1, 2,..., N мають
місце співвідношення:
Рисунок 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 -
d 12,2 = 0 -
{ }
d 12,3 = min d 20,1 + d10,3 ; d 20,3 = min{2 + 2; 7} = 4 (2, 1, 3)
{ }
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,2 = min d 40,1 + d10,2 ; d 40,2 = min{1 + 1; ∞} = 2 (4, 1, 2)
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,3 = min d11,2 + d 12,3 ; d11,3 = min{1 + 4; 2} = 2 (1, 3)
d 22,2 = 0 -
{ }
d 32,1 = min d 31,2 + d 12,1 ; d 31,1 = min{5 + 2; 6} = 6 (3, 1)
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,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) −
40
5.3 Порядок виконання роботи
Варіант № 1
1. Використовуючи алгоритм Флойда-Уоршола, знайти у
графі, наведеному на рис. 5.2 а, найкоротші шлях між усіма
вершинами.
а б
Рисунок 5.2.
Варіант № 2
1. Використовуючи алгоритм Флойда-Уоршола, знайти у
графі, наведеному на рис. 5.2 б, найкоротші шлях між усіма
вершинами.
42
ЛАБОРАТОРНА РОБОТА № 6
Реалізація алгоритму Данцига пошуку усіх найкоротших
шляхів
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)
d im,i = 0 . (6.4)
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,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)
46
3
Відповідні
Елементи матриці D
шляхи
{ }
d13,2 = min d13,3 + d 33,2 ; d12,2 = min{2 + 5;1} = 1 (1, 2)
47
а б
Рисунок 6.1.
48
ЛАБОРАТОРНА РОБОТА № 7
Реалізація алгоритму подвійного пошуку k перших
найкоротших шляхів
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)
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.
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 наступним
чином:
Зворотній пошук:
Прямий пошук:
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
55
Після того як будуть знайдені довжини шляхів, виконується
процедура трасування, що дозволяє визначити відповідні шляхи.
Суть її полягає в наступному. Припустимо, що потрібно знайти
m-й найкоротший шлях із початкової вершини в вершину i.
Нехай 𝑑𝑚,𝑖 – довжина цього шляху і нехай вершина j з'єднана
дугою з вершиною i. Тоді
d m,i = d t , j + d ( j ,i ) (7.8)
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 = (∞, ∞, ∞) ,
58
Оскільки 𝑑11 ≠𝑑12 , то збільшуємо r на 1 і знову переходимо до
кроку 2.
Крок 2. r=1.
Зворотній пошук (використовуємо співвідношення (7.6)):
d13,4 = d12,4 = (−1, ∞, ∞) ,
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) .
60
табл. 7.1. За співвідношенням (7.8) знаходяться і відповідні k-ті
шляхи.
Таблиця 7.1 – Результати роботи алгоритму подвійного
пошуку
r Тип пошуку Вектор оцінок
Зворотній d11 = (0, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞) (∞, ∞, ∞)
r=0
Прямий d12 = (0, ∞, ∞) (1, ∞, ∞) (0, ∞, ∞) (−1, ∞, ∞)
а б
Рисунок 7.3.
61
Варіант № 2
1. Використовуючи алгоритм подвійного пошуку, знайти
перші два найкоротші шляхи, що ведуть з вершини 1 у всі інші
вершини графа, наведеного на рис. 7.3 б.
62
ПЕРЕЛІК РЕКОМЕНДОВАНИХ ДЖЕРЕЛ
63