Пояснювальна записка

You might also like

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

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ

ІМЕНІ ІГОРЯ СІКОРСЬКОГО»

Факультет прикладної математики

Кафедра прикладної математики

Пояснювальна записка

до курсового проєкту

з дисципліни «Алгоритми і системи комп’ютерної математики» на тему

«Задача про максимальний потік в транспортних мережах»

Виконав: Перевірила:

студент групи КМ-82 ас. кафедри ПМА

Курилко М.О. Ковальчук-Хімюк Л. О.

Київ — 2022
Зміст
1. ПЕРЕЛІК МЕТОДІВ РОЗВ’ЯЗАННЯ ЗАДАЧ .............................................. 3

2. ВИБІР МЕТОДУ ............................................................................................... 3

2.1. ПОРІВНЯННЯ АЛГОРИТМІВ ................................................................. 3

2.2. ПОВНИЙ ОПИС АЛГОРИТМУ ............................................................... 4

2.3. ФОРМАЛЬНИЙ ОПИС ............................................................................. 5

2.4. АЛГОРИТМ ДЕЙКСТРИ .......................................................................... 5

3. ПРОЕКТУВАННЯ АРХІТЕКТУРИ ПЗ .......................................................... 7

4. ВИЗНАЧЕННЯ ВХІДНИХ ДАНИХ ТА РЕЗУЛЬТАТІВ ............................. 8

4.1. ПРИКЛАД 1 ................................................................................................ 9

4.2. ПРИКЛАД 2 .............................................................................................. 10

5. РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ .......................................................... 13

5.1. КОНТРОЛЬНИЙ ПРИКЛАД 1 ............................................................... 13

5.2. КОНТРОЛЬНИЙ ПРИКЛАД 2 ............................................................... 14

6. ВИСНОВКИ .................................................................................................... 15
1. ПЕРЕЛІК МЕТОДІВ РОЗВ’ЯЗАННЯ ЗАДАЧ
Після вступу США до Другої світової війни у 1941 році математик
Джордж Бернард Данциг вступив на роботу до відділу статистичного
управління Військово-повітряних сил США у Вашингтоні. З 1941 по 1946 роки
він очолював підрозділ аналізу бойових дій (Combat Analysis Branch), де
працював над різноманітними математичними проблемами. Згодом із
використанням роботи Данцига завдання про максимальний потік було
вперше вирішено в ході підготовки повітряного мосту під час блокади
Західного Берліна, що відбувалася у 1948—1949 роках.

У 1951 року Джордж Данциг вперше сформулював завдання у


загальному виде.

У 1955 році, Лестер Форд і Делберт Фалкерсон (Debert Ray Fulkerson)


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

Надалі розв'язання задачі багато разів покращувалося.

У 2010 році дослідники Джонатан Келнер (Jonathan Kelner) та


Александер Мондри (Aleksander Mądry) з МТІ разом зі своїми колегами
Деніелем Спілманом (en:Daniel Spielman) з Єльського університету та Шень-
Хуа Тенем (en:Shang-Hua Teng) з Южно- Каліфорнійського університету
продемонстрували чергове покращення алгоритму, вперше за 10 років.

Основні алгоритми вирішення задачі:

2. ВИБІР МЕТОДУ
2.1. ПОРІВНЯННЯ АЛГОРИТМІВ
В якості алгоритму для вирішення задачі був обраний алгоритм
Едмондса-Карпа (далі Е-К), через невелику складність і простоту реалізації.

МЕТОД СКЛАДНІСТЬ
Лінійне програмування Експоненційна
Алгоритм Форда-Фелкерсона O(max| f |) пошуку

Алгоритм Едмондса-Карпа O(VE²)

Алгоритм Дініца O(V²E)

Алгоритм «підняти в початок» O(V²E)

Алгоритм двійкового блокового O(V³)


потоку
Таблиця 1 – порівняння методів [1]

Сутність методу полягає в покращенні алгоритму Форда-Фелкерсона


(далі Ф-Ф). Проблема Ф-Ф полягає в його невизначеній складності (див.
Таблиця 1) та неможливістю розв’зувати задачу для не цілих пропускних
здібностей кожного ребра[1]. Ця проблема і вирішується завдяки модифікації
методу Е-К: алгоритм пошуку замнюється алгоритмом найкоротшого пошуку.
В цьому випадку ми отримуємо два покращення:

• Можливість працювати для не цілих пропускних здібностей ребер


• Пришвидшення алгоритму.

В якості алгритму пошуку найкоротшого шляху в графі був обраний


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

2.2. ПОВНИЙ ОПИС АЛГОРИТМУ


1. Обнулюємо всі потоки. Залишкова мережа спочатку збігається з
вихідною мережею.
2. У залишковій мережі знаходимо найкоротший шлях із джерела в стік.
Якщо такого шляху немає, зупиняємось.
3. Пускаємо через знайдений шлях (він називається збільшуючим
шляхом або ланцюгом, що збільшує) максимально можливий потік
3.1. На знайденому шляху в залишковій мережі шукаємо ребро з
мінімальною пропускною здатністю c.
3.2. Для кожного ребра на знайденому шляху збільшуємо потік на с а
в протилежному йому зменшуємо на с.
3.3. Модифікуємо залишкову мережу. Для всіх ребер на знайденому
шляху, а також для протилежних їм ребер обчислюємо нову
пропускну здатність. Якщо вона стала ненульовою, додаємо ребро
до залишкової мережі, а якщо обнулилася, перемо його.
4. Повертаємось на п. 2. [4]

2.3. ФОРМАЛЬНИЙ ОПИС

Дано граф з пропускними здібностями і потоком

Нова мережа: - мережа з пропускною здібністю

і без потоку [4]

2.4. АЛГОРИТМ ДЕЙКСТРИ


Алгоритм Дейкстри — алгоритм на графах, відкритий Едсгером
Дейкстрою. Знаходить найкоротший шлях від однієї вершини графу до всіх
інших вершин. Класичний алгоритм Дейкстри працює тільки для графів без
ребер від'ємної довжини. [2][3]

Нехай u — вершина, від якої шукаються відстані, V — множина вершин


графу, di — відстань від вершини u до вершини i, , w(i, j) — вага «ребра» (i, j),
тоді алгоритм виглядає наступним чином:
1. Множина вершин U, до яких відстань відома, встановлюється рівною
{u}.
2. Якщо U=V, алгоритм завершено.
3. Потенційні відстані Di до вершин з V\U встановлюються
нескінченними.
4. Для всіх ребер (i, j), де i∈U та j∈V\U, якщо Dj>di+w(i, j), то Dj
присвоюється di+w(i, j).
5. Шукається i∈V\U, при якому Di мінімальне.
6. Якщо Di дорівнює нескінченності, алгоритм завершено. В іншому
випадку di присвоюється значення Di, U присвоюється U∪{i} і
виконується перехід до кроку 2. [3]

Для програмної реалізації алгоритму Дейкстри використовується функція


scipy.sparse.csgraph.shortest_path [5]
3. ПРОЕКТУВАННЯ АРХІТЕКТУРИ ПЗ

Програмний застосунок буде працювати наступним чином:

1. На початку ми маємо орієнтовний граф, що показує собою транспортну


мережу та має певні пропускні здібності
2. Оскільки ці дані необхідно перетворити на дані з якими програма може
працювати, то їх необхідно подати в наступному вигляді:
3. Граф подається у вигляді матриці, де 1 на перетині i-того рядка і j-того
стовпчика означає існування ребра, що виходить з i-тої вершини у j-ту
вершину
4. Пропускні здібності подаються у вигляді матриці, де на кожному
перетині i-того рядка і j-того стовпчика де в матриці графу стоїть 1 буде
стояти число, що відповідає пропускній здібності цього ребра
5. Отримані дві матриці позначимо graph і c відповідно і вони будуть
слугувати Вхідними Даними для програмного застосунку
6. Далі необхідно провести нормування цих двох матриць. Під
нормуванням мається на увазі перевірка їх відповідності один одній та
створення копії graph з перетворенням орієнтовного графу на
неорієнтовний з ребрами там, де були ребра у graph, незалежно від
напрямку (функція mirror_graph()). Ця операція буде необхідна для
використання алгоритму Дейкстри в подальшому. Нормований граф
будемо називати graph_norm
7. Далі відбувається пошук найкоротшого шляху в graph завдяки
алгоритму Дейкстри. Якщо шлях був знайдний, переходимо до пункту
9, інакше до наступного.
8. Якщо шлях знайти не вдалося, то пошук повторюється для graph_norm.
Ця операція необхідна тому, що алгоритм Дейкстри на першій спробі
шукає шлях в орієнтовному графі і тому ігнорує можливість руху проти
напрямів ребер, проте, така можливість розглядається методом. Таким
чином на першій спробі алгоритм розглядає лише оптимальні шляхи
(без руху проти ребер), а на цьому пункті розглядаються взагалі всі
шляхи. Якщо навіть в нормованому графі шляху не існує, робота методу
вважається завершеною.
9. Якщо шлях був знайдений, то для нього проводиться ітерація методу Е-
К, що був описаний у розділі 2.1.
10.Після роботи методу Е-К проводиться перерахунок шляхів в графі
(відповідно, необхідно обчислити і новий нормований граф) і програма
повертається до пункту 7.

4. ВИЗНАЧЕННЯ ВХІДНИХ ДАНИХ ТА


РЕЗУЛЬТАТІВ
В якості тестових даних для перевірки алгоритму будемо
використовувати два приклади, результати для яких заздалегідь відомі.
4.1. ПРИКЛАД 1
Вхідні дані:

Перетворивши цей граф на матриці отримаємо:

start = 0

finish = 3

graph = np.array([

[0, 1, 1, 0],

[0, 0, 1, 1],

[0, 0, 0, 1],

[0, 0, 0, 0]

])

c = np.array([
[0, 1000, 1000, 0 ],

[0, 0, 1, 1000],

[0, 0, 0, 1000],

[0, 0, 0, 0 ]

])

Вихідні дані:

4.2. ПРИКЛАД 2
Вхідні дані:
Перетворивши на матриці отримаємо:

start = 0

finish = 6

graph = np.array([

[0, 1, 0, 1, 0, 0, 0],

[0, 0, 1, 0, 0, 0, 0],

[1, 0, 0, 1, 1, 0, 0],

[0, 0, 0, 0, 1, 1, 0],

[0, 1, 0, 0, 0, 0, 1],

[0, 0, 0, 0, 0, 0, 1],

[0, 0, 0, 0, 0, 0, 0]

])

c = np.array([

[0, 3, 0, 3, 0, 0, 0],
[0, 0, 4, 0, 0, 0, 0],

[3, 0, 0, 1, 2, 0, 0],

[0, 0, 0, 0, 2, 6, 0],

[0, 1, 0, 0, 0, 0, 1],

[0, 0, 0, 0, 0, 0, 9],

[0, 0, 0, 0, 0, 0, 0]

])

Вихідні дані:
5. РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ
5.1. КОНТРОЛЬНИЙ ПРИКЛАД 1
5.2. КОНТРОЛЬНИЙ ПРИКЛАД 2
6. ВИСНОВКИ
Під час цієї розрахунково графічної роботи було розроблено алгоритм
для вирішення задачі максимізації транспортного потоку за заданих умов
пропускних здібностей мережі. В основу алгоритму покладено вирішення
задачі методом Едмондса-Карпа, в якості пошуку найкоротшого шляху був
обраний метод Дейкстри. Результат був перевірений на 2 прикладах.

Перший приклад був вирішений за 2 ітерації алгоритму. Отриманий


результат відповідає теоретичному.

Другий приклад був вирішений за 4 ітерації алгоритму. Отриманий


результат відповідає теоретичному.

Таким чином можна стверджувати, що алгоритм працює коректно і


може бути використаний на практиці. Серед можливих покращень алгоритму
можна виділити такі:

• Додання можливості працювати з початково неорієнтованими


графами
• Додання можливості алгоритму працювати з мережами з більше ніж
1 витоком
• Тестування алгоритму на основі інших методів пошуку
найкоротшого шляху

7. ЛІТЕРАТУРА
• [1] - Томас Кормен и др. Алгоритмы: построение и анализ =
INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс»,
2006. — С. 1296. — ISBN 0-07-013151-1.
• [2] - C. Анисимов. Как построить кратчайший маршрут между двумя
точками.
• [3] - http://e-maxx.ru/algo/dijkstra
• [4] -
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1
%80%D0%B8%D1%82%D0%BC_%D0%AD%D0%B4%D0%BC%D0%B
E%D0%BD%D0%B4%D1%81%D0%B0_%E2%80%94_%D0%9A%D0%
B0%D1%80%D0%BF%D0%B0
• [5] -
https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csgraph.sh
ortest_path.html

You might also like