Professional Documents
Culture Documents
курсова робота
курсова робота
КУРСОВА РОБОТА
з дисципліни «Алгоритмізація та програмування»
(назва дисципліни)
_______Національна шкала______
________ __________________
(підпис) (прізвище та ініціали)
1
Міністерство освіти і науки України
Вінницький національний технічний університет
Факультет інтелектуальних інформаційних технологій та автоматизації
Кафедра комп’ютерних наук
ЗАТВЕРДЖУЮ
Зав.каф. КН, д.т.н., проф.
_________А.А. Яровий
«__» ________ 2023 р.
ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
до курсової роботи з дисципліни «Алгоритмізація та програмування»
2
АНОТАЦІЯ
Якубишин Я. О. Візуалізація алгоритму Беллмана-Форда. Курсова робота з
дисципліни «Алгоритмізація та програмування». Вінниця: ВНТУ, 2023. … с.
Українською мовою.
Рисунків 12 , таблиць 1.
3
ЗМІСТ
ВСТУП………………….………………………………………….…...
1.АНАЛІЗ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА ...............................
2.ДОСЛІДЖЕННЯ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА………….
3.ПРОГРАМНА РЕАЛІЗАЦІЯ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА.
4. ТЕСТУВАННЯ ТА АНАЛІЗ РОЗРОБЛЕНОЇ ПРОГРАМИ………..
ВИСНОВКИ…………………………………………………………….
ПЕРЕЛІК ДЖЕРЕЛ ПОСИЛАНЬ……………………………..………
Додаток А. Блок-схема алгоритму…………………………………….
Додаток Б. Лістинг програми………………………………………….
4
ВСТУП
5
Важливою властивістю алгоритмів є масовість, або можливість
застосування до різних вхідних даних. Тобто, кожен алгоритм
покликаний розв'язувати клас однотипних задач.
6
1.АНАЛІЗ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА
, (1.1)
9
2. ДОСЛІДЖЕННЯ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА
11
Можемо використовувати ці значення для подальшого аналізу,
виконання потрібних дій або відновлення найкоротших шляхів за
допомогою масиву prev, який зберігає попередники кожної вершини
на найкоротшому шляху.
12
Малюнок 1.2 – Зважений граф
У якості ваг ребер (вартості каналів) було обрано час середньої затримки пакетів при проходженні
відповідного каналу. Їх значеня наведено у графах табл. 1.1.
13
Таблиця 1.1 - Відстань між вершинами
0-2 1
0-3 0,362
0-4 0,381
0-5 0,2
0-6 0,19
0-7 0,571
7-6 0,4
7-8 0,362
8-6 0,314
8-5 0,438
8-9 0,248
9-5 0,257
9-11 0,571
11-10 0,762
5-4 0,381
2-10 0,457
3-10 0,79
4-3 0,286
1-2 0,448
14
На даному графі знайдемо за допомогою алгоритмів, найкоротший
шлях між вершинами.
Приклад роботи алгоритму:
i
(
DK
) (K
min
D
i
1
) (
,DK
j
1
)
l
ji,
, (1.3)
K=0:
D1 min
(0)
D(0)
1 ,D
0 l0,2 min
(0)
,0,676
0,676
;
D(0)
2 D ,D
min(0)
2
(0)
0 min
l0,2 ,11;
D(0)
3 D ,D
min(0)
3
(0)
0 min
l0,3 ,0,3620,362;
D (0)
4 D ,D
min(0)
4
(0)
0 min
l0,4 ,0,3810,381;
D(0)
5 D ,D
min(0)
5
(0)
0 min
l0,5 ,0,20,2;
D(0)
6 D ,D
min(0)
6
(0)
0 min
l0,6 ,0,190,19;
D(0)
7 D ,D
min(0)
7
(0)
0 min
l0,7 ,0,5710,571.
K=1:
(
1
)
D
7
(
7
0
)(
0
min
D,D
6
)
l6
,
7
min
0
,
571
,
0
,
19
0
,
4
0
,
571
;
D
D(
1
)
min
,
D
8
l
min
,0
,
190
,
314
0
,(
0
)(
504
. 0
)
86 6,
7
K=2:
15
(
2
)
D
9(
1
9
)(
,
D1
)
min
D 8l
8
,
9
min
,0
,
504
0
,
248
0
,
752
.
K=3:
(
3
)
D
11
(
2
)(
min
D ,
D
11
2
)
9
l9
,
11
min
,0
,
752
0
,
571
1
,
323
.
K=4:
(
4
)
D
10
(
3
)(
min
D ,
D
10
3
)
l
1111
,
10
min
,
1,
323
0
,
762
2
,
085
.
16
Дослідження часової та асимптотичної складності алгоритму
Беллмана-Форда дають нам уявлення про його продуктивність та
швидкодію в різних сценаріях. Ось що можна сказати про ці
дослідження:
1.Часова складність: Часова складність алгоритму Беллмана-
Форда становить O(V*E), де V - кількість вершин, а E - кількість ребер
у графі. Це означає, що час виконання алгоритму залежить від кількості
вершин та ребер у графі. Якщо граф має багато вершин або ребер,
алгоритм може бути досить повільним.
2.Асимптотична складність: Асимптотична складність алгоритму
Беллмана-Форда також складає O(V*E). Це означає, що часова
складність алгоритму зростає пропорційно кількості вершин та ребер у
графі. Якщо граф має великий розмір, асимптотична складність може
бути значною, що може вплинути на продуктивність алгоритму.
3.Ефективність: Алгоритм Беллмана-Форда є ефективним у
випадку графів з невеликою кількістю вершин та ребер. Він добре
працює на графах з вагованими ребрами та може знаходити найкоротші
шляхи навіть у графах з негативними вагами (за умовки, що немає
негативних циклів).
4.Оптимізації: Існують різні оптимізації алгоритму Беллмана-
Форда, які можуть покращити його продуктивність. Наприклад, можна
використовувати чергу з вершинами для визначення порядку обходу, що
дозволяє пропустити вершини, для яких немає необхідності оновлювати
відстані.
5.Пам'ять: Алгоритм Беллмана-Форда також вимагає пам'яті для
зберігання відстаней між вершинами. У даному прикладі
використовується масив distance розміром V для зберігання відстаней від
17
початкової вершини до кожної вершини. Тому пам'ять, потрібна для
виконання алгоритму, становить O(V).
18
3. ПРОГРАМНА РЕАЛІЗАЦІЯ АЛГОРИТМУ БЕЛЛМАНА-ФОРДА
Для цього пункту я обрав дві мови програмування – це Python та
C#. Python і C# є двома різними мовами програмування зі своїми
унікальними особливостями. Ось порівняння між цими двома мовами:
Синтаксис:
Python має простий та зрозумілий синтаксис, що робить його
легким для вивчення та читання. Він використовує відступи
(пробіли або табуляцію) для визначення блоків коду.
C# має більш формальний синтаксис, який вимагає
використання фігурних дужок для визначення блоків коду.
Типи даних:
Python є динамічно типізованою мовою, що означає, що
типи даних змінних можуть змінюватись під час виконання
програми.
C# є статично типізованою мовою, що означає, що типи
даних змінних визначаються на етапі компіляції і не можуть
змінюватись під час виконання.
Екосистема та бібліотеки:
Python має велику та активну спільноту розробників, що
сприяє широкому вибору сторонніх бібліотек та
фреймворків. Він широко використовується у наукових
обчисленнях, аналізі даних, штучному інтелекті та веб-
розробці.
C# є частиною .NET-екосистеми, яка надає широкий спектр
інструментів та бібліотек для розробки різноманітних
програмних застосунків. Він популярний для розробки
додатків під Windows, ігор, веб-серверів та мобільних
додатків.
19
Продуктивність:
Python є інтерпретованою мовою, що може призводити до
меншої продуктивності порівняно з компільованими
мовами, такими як C#.
C# компілюється в машинний код, що дозволяє досягти
високої продуктивності та швидкодії.
Вибір між Python та C# залежить від конкретних потреб проекту,
ваших особистих вподобань та досвіду. Python підходить для швидкої
прототипізації, обробки даних та наукових обчислень, тоді як C# є
хорошим вибором для розробки великих проектів, додатків для Windows
та мобільних платформ, а також для розробки ігор.
1.Python:
Ми маємо код, який використовує клас “Graph” для виконання
алгоритму Беллмана-Форда. Розглянемо кожну частину коду окремо:
У цьому коді створюється клас “Graph”, який має один атрибут “V” для
зберігання кількості вершин у графі та атрибут “graph”, що представляє граф.
Метод “__innit__” ініціалізує об'єкт класу “Graph”, приймаючи кількість
вершин “vertices” та встановлюючи “self.V” на це значення. Він також
створює порожній список “self.graph”, який буде використовуватись для
зберігання ребер графа.
20
2. Метод “add_edge”:
Цей метод додає ребро до графа. Він приймає початкову вершину “U”,
кінцеву вершину “V” та вагу ребра “W”. Ребро представляється у
вигляді списку “[U, V, W]”, який додається до списку “self.graph”.
3.Метод “bellman_ford”:
21
Малюнок 1.7 – Псведокод до методу Беллмана-Форда.
4.Метод “print_solution”:
22
2. C#:
23
Знову використовуються вкладені цикли для перебору
кожного ребра графа та перевірки умови наявності від'ємного
циклу.
9. Виведення результатів:
Виконується виведення найкоротших відстаней від
початкової вершини source до всіх інших вершин графа.
Використовується Console.WriteLine для виведення
результатів.
10. Оголошення та виклик головної функції Main:
Оголошується головна функція Main, яка буде виконуватись
при запуску програми.
Оголошується та ініціалізується двовимірний масив graph,
який представляє граф.
Визначається початкова вершина source.
Викликається функція BellmanFord для пошуку найкоротших
шляхів у графі.
24
4. ТЕСТУВАННЯ ПРОГРАМНОЇ РЕАЛІЗАЦІЇ
25
Малюнок 1.11 – Задаємо значення графу.
26
чергу завдяки зручному набору інструментів, призначених для роботи в сфері
інтелектуальних систем та штучного інтелекту.
27
ВИСНОВКИ
28
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
29
Додаток А. Лістинг програми мовою С#.
using System;
class Program
{
static int V; // Кількість вершин у графі
// Виведення результатів
Console.WriteLine("Відстані від вершини {0} до всіх інших вершин:", source);
for (int i = 0; i < V; i++)
Console.WriteLine("Вершина {0} -> Відстань: {1}", i, distance[i]);
}
int[,] graph = {
{ 0, -1, 4, 0, 0 },
{ 0, 0, 3, 2, 2 },
{ 0, 0, 0, 0, 0 },
{ 0, 1, 5, 0, 0 },
31
{ 0, 0, 0, -3, 0 }
};
BellmanFord(graph, source);
}
}
32
Додаток Б. Лістинг програми мовою Python.
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
# Приклад використання
g = Graph(5)
g.add_edge(0, 1, -1)
g.add_edge(0, 2, 4)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 2)
g.add_edge(1, 4, 2)
g.add_edge(3, 2, 5)
g.add_edge(3, 1, 1)
g.add_edge(4, 3, -3)
g.bellman_ford(0)
34