Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Strukturi_danikh_ta_algoritmi_-_konspekt_lektsi...doc
Скачиваний:
33
Добавлен:
23.11.2019
Размер:
870.4 Кб
Скачать

5.3.1.3.Штрафи за повороти

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

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

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

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

  • Для кожного зв’язку між вузлами А і B в початковій мережі в новій мережі створюється вузол AB;

  • Якщо в початковій мережі відповідні зв’язки були сполучені, то отримані вузли також з’єднуються між собою. Наприклад, нехай в початковій мережі один зв’язок сполучав вузли А і B, а інший – вузли B і С. Тоді в новій мережі потрібно створити зв’язок, який сполучає вузол AB з вузлом BC;

  • Ціна нового зв’язку складається з ціни зв’язку в початковій мережі і штрафу за поворот.

5.3.2.Застосування методу пошуку найкоротшого маршруту

Обчислення найкоротшого маршруту використовуються в багатьох програмах. Очевидним прикладом є пошук найкоротшого маршруту між двома точками у вуличній мережі. Багато інших програм використовують метод пошуку найкоротшого маршруту менш очевидними способами.

5.3.2.1.Розбиття на райони

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]