Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Посібник_Дослідження_операцій.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.51 Mб
Скачать

2.4 Алгоритм побудови остовного дерева зв’язного графа

При виконанні алгоритму деякі ребра і вершини будемо зафарбовувати.

Крок І Беремо будь-яке не зафарбоване ребро, фарбуємо його і інцидентні з ним вершини. Ця конструкція називається букетом.

Крок ІІ Беремо будь-яке не зафарбоване ребро. При цьому можуть трапитися такі випадки.

  1. Дві інцидентні вершини зафарбовані і належать до одного букету. Тоді це ребро не фарбується.

  2. Одна вершина зафарбована, інша ні. Фарбуємо ребро і вершину та приєднуємо їх до букету.

  3. Обидві вершини зафарбовані, але належать до різних букетів. Ребро фарбується і обидва букети об’єднуються в один.

  4. Обидві вершини не зафарбовані. Фарбуємо ребро і вершини, формуємо новий букет.

Якщо кожному ребру відповідає вага cij > 0, то можна будувати остовне дерево мінімальної (максимальної) довжини. Для цього ребра упорядковуємо відповідно зростанню (спаданню) їх ваги, а далі алгоритм працює так , як сказано вище.

Наприклад, система міст з’єднується шляхами (тобто маємо граф), і потрібно проїхати з одного міста в інше так, щоб витрати на проїзд були мінімальними. Ця задача зводиться до побудови остовного дерева мінімальної довжини.

Приклад.

В даному графі 5 вершин, тобто дерево повинно мати 4 ребра. Сумарна вага остовного дерева мінімальної ваги (довжини) 2+3+7+5=17.

2.5 Знаходження найкоротшого шляху в орієнтованому графі

Задано орієнтований граф. Кожній дузі, що з’єднує вершину ui з вершиною uj (uiuj), відповідає невід’ємне число cij > 0. Це число називаємо вагою дуги.

Питання, що тут виникають:

  1. Яка довжина найкоротшого шляху між будь-якими двома вершинами графа?

  2. Які довжини найкоротших шляхів між виділеною вершиною та іншими вершинами?

  3. Які довжини шляхів між усіма парами вершин, що це за шляхи?

Один із методів розв’язання таких задач – це алгоритм Дейкстри (розв’язок одержано у 1960р., автор – Дейкстра).

При роботі цього алгоритма будемо користуватись такими правилами:

  1. позначаємо вершини значеннями їх відстаней від виділеної вершини;

  2. до остаточної позначки вершині присвоюється тимчасова позначка; ця тимчасова позначка дає відстань від виділеної вершини, коли множина шляхів складається не з усіх можливих;

  3. алгоритм припиняє роботу тоді, коли позначка кінцевої вершини не змінюється;

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

Крок І Початковій вершині присвоюється остаточна позначка «0», а іншим вершинам – тимчасова позначка «∞».

Крок ІІ Кожній вершині х, яка не має остаточної позначки, присвоюється нова тимчасова позначка за правилом :

min(dx, dy+cyx),

де dx – стара тимчасова позначка вершини х;

у – вершина, яка одержала остаточну позначку на попередньому кроці;

cyx – вага дуги (у,х).

Крок ІІІ Знаходимо найменшу з усіх тимчасових позначок і оголошуємо її остаточною позначкою відповідної вершини. Ця вершина грає роль вершини у для наступного кроку.

Приклад. Маємо орієнтований граф, де задані ваги дуг.

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

1 d1=0, di=∞, де i = 2,3,4,5,6.

2 = => dy = 0,

d2 = min(∞,0+4) = 4,

d3 = min(∞,0+2) = Frame1 ,

d4 = min(∞,0+7) = 7,

d5 = min(∞,0+∞) = ∞,

d6 = min(∞,0+∞) = ∞.

Зауважимо, що cyx=0, якщо немає шляху (дуги) y→x. Вибираємо мінімальну позначку, це d3 = 2.

3 = => dy = 2,

d2 = min(4,2+∞) = Frame2 ,

d4 = min(7,2+∞) = 7,

d5 = min(∞,2+3) = 5,

d6 = min(∞,2+∞) = ∞.

4 = => dy = 4,

d4 = min(7,4+3) = 7,

d5 = min(5,4+2) = Frame3 ,

d6 = min(∞,4+∞) = ∞.

5 = => dy = 5,

d4 = Frame4 ,

d6 = min(∞,5+2) = 7.

6 = => dy = 7,

d6 = min(7,7+2) = 7.

Всі вершини мають остаточні позначки.

При розв’язанні слід відразу на графі позначати остаточні позначки вершин.

Таким чином найкоротший шлях з початкової вершини до кінцевої вершини дорівнює 7.

Також ми маємо найкоротший шлях з початкової вершини до будь-якої вершини графа.

На графі слід також позначити цей найкоротший шлях.

Існує ще один спосіб для знаходження екстремального шляху в графі – спосіб позначок.

Розглядаємо орієнтований граф, який називається мережевим. В такому графі існує одна вершина, з якої дуги лише виходять (витік, джерело), і одна вершина, в яку дуги лише входять (стік). Крім того, вершини такого графа можуть бути пронумеровані таким чином, що наступні по напрямку руху вершини (послідовники) мають більші номери, ніж попередні (попередники). Тоді всі вершини графа можна розбити на шари таким чином, що вершини кожного шару з номером m (m > 1) будуть послідовниками вершин із шарів з меншими ніж m номерами і попередниками вершин із шарів з більшими ніж m номерами.

Приклад. Розглянемо приклад мережевого графа.

Знайдемо для цієї мережі найкоротший шлях методом позначок, для якого використаємо формулу

де dj – позначка j-ї вершини, cij – вага дуги (i,j).

Вершини, що остаточно позначені, об’єднаємо в множину I*.

Вершини, сусідні з позначеними, об’єднаємо в множину ω(I*).

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

I d1 = 0 (за формулою). Тобто вершина остаточно позначена і має позначку Frame5 .

На цьому етапі

I* = {1},

ω(I*) = {2,3,4} – множина вершин, сусідніх з позначеними.

Знайдемо тимчасові позначки вершин множини ω(I*) за формулою .

d2 = 0+2 = 2,

d3 = 0+1 = 1,

d4 = 0+4 = 4.

З усіх тимчасових позначок вибираємо найменшу: Frame6 . Таким чином, вершина одержує остаточну позначку Frame7 .

II I* = {1,3}, ω(I*) = {2,4,5,6}.

d2 = 0+2 = 2,

d4 = min(0+4,1+2) = 3,

d5 = 1+5 = 6,

d6 = 1+6 = 7.

Frame8 – вершина одержує остаточну позначку Frame9 .

III I* = {1,2,3}, ω(I*) = {4,5,6,7}.

d4 = min(2+3,0+4,1+2) = 3,

d5 = min(2+4,1+5) = 6,

d6 = 1+6 = 7,

d7 = 2+6 = 8.

Frame10 – остаточно позначається вершина позначкою Frame11 .

IV I* = {1,2,3,4}, ω(I*) = {5,6,7}.

d5 = min(1+5,3+1,2+4) = 4,

d6 = 1+6 = 7,

d7 = 2+6 = 8.

Frame12 – остаточно позначається вершина позначкою Frame13 .

V I* = {1,2,3,4,5}, ω(I*) = {6,7,8}.

d6 = min(1+6,4+1) = 5,

d7 = min(2+6,4+3) = 7,

d8 = 4+5 = 9.

Frame14 – остаточно позначається вершина позначкою Frame15 .

VI I* = {1,2,3,4,5,6}, ω(I*) = {7,8}.

d7 = min(2+6,4+3) = 7,

d8 = min(5+2,4+5) = 7.

Frame16 – остаточно позначається вершина позначкою Frame17 .

Тут ми одержали дві однакові позначки. В цьому випадку остаточно позначаємо вершину з меншим номером.

VII I* = {1,2,3,4,5,6,7}, ω(I*) = {8}.

d8 = min(7+4,5+2,4+5) = 7.

Остаточно позначаємо вершину позначкою Frame18 .

Таким чином, довжина найкоротшого шляху в графі дорівнює 7. Зобразимо граф з позначками і покажемо найкоротший шлях з вершини до вершину .

Найкоротший шлях в графі:

.

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

Формула, за якою треба діяти в цьому випадку, має вигляд

На кожному кроці роботи алгоритма в якості остаточно позначеної вершини беремо вершину з максимальною позначкою.

Приклад. Знайти найдовший шлях у графі

d1 = 0 – остаточно позначена вершина позначкою Frame19 .

  1. I* = {1}, ω(I*) = {2,3}.

d2 = 0+2 = 2,

d3 = 0+1 = 1.

Frame20 – остаточно позначається вершина позначкою Frame21 .

  1. I* = {1,2}, ω(I*) = {3}.

d3 = 0+1 = 1.

Остаточно позначається вершина позначкою Frame22 .

  1. I* = {1,2,3}, ω(I*) = {4}.

d4 = max(0+4,2+3,1+2) = 5.

Остаточно позначається вершина позначкою Frame23 .

  1. I* = {1,2,3,4}, ω(I*) = {5}.

d5 = max(2+4,5+1,1+5) = 6.

Остаточно позначається вершина позначкою Frame24 .

  1. I* = {1,2,3,4,5}, ω(I*) = {6,7}.

d6 = max(1+6,6+1) = 7,

d7 = max(2+6,6+3) = 9.

Остаточно позначається вершина позначкою Frame25 .

  1. I* = {1,2,3,4,5,7}, ω(I*) = {6}.

d6 = max(1+6,6+1) = 7,

Остаточно позначається вершина позначкою Frame26 .

  1. I* = {1,2,3,4,5,6,7}, ω(I*) = {8}.

d6 = max(9+4,6+5,7+2) = 13.

Вершина остаточно позначається позначкою Frame27 .

Це і є довжина найдовшого шляху в графі. Зобразимо цей шлях і позначимо вершини.

Найдовший шлях у графі

Довжина цього шляху дорівнює 13.