Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Основні положення. В попередній роботі розглянуто алгоритм, що дозволяє знайти найкоротші шляхи з першого вузла мережі до решти вузлів






В попередній роботі розглянуто алгоритм, що дозволяє знайти найкоротші шляхи з першого вузла мережі до решти вузлів. Розглянемо задачу знаходження найкоротших ланцюгів між усіма парами вузлів мережі G=(N, A) (задачу про багатополюсний найкоротший ланцюг). Отже, N={1, 2,..., n} – множина вузлів мережі. Дуги з множини А можуть бути орієнтованими або неорієнтованими. Однак, оскільки напрямок потоку в неорієнтованих дугах неможливо визначити заздалегідь, то кожну таку дугу слід замінити двома орієнтованими дугами з протилежними напрямками та довжиною, що дорівнює довжині неорієнтованої дуги.

Якщо довжині кожної дуги відповідає відстань або вартість одиниці потоку по цій дузі Сij, то найкоротшим ланцюгом між двома довільними вузлами є ланцюг, вартість одиниці потоку для якого є мінімальною.

Позначимо через d*ik довжину найкоротшого ланцюга з вузла i до вузла k.

Припустимо, що величина dik представляє найкращу оцінку довжини найкоротшого ланцюга, що з’єднує вузли i й k. Тоді довжина = dij+djk кожного найкоротшого ланцюга, що проходить через проміжний вузол j, або перевищує величину dik, або поточна довжина найкоротшого ланцюга дорівнює . Однак якщо довжина нового ланцюга (через деякий транзитний вузол) менше dik, то поточне значення dik слід замінити на .

Алгоритм Флойда [3] працює наступним чином. Спочатку за довжину найкоротшого ланцюга між двома довільними вузлами i та k приймається величина довжини дуги (i, k), що з’єднує ці вузли (рис. 2.1). Потім послідовно перевіряються всі можливі транзитні вузли, що розташовані між i та k. Якщо довжина ланцюга, що проходить через деякий транзитний вузол, менше поточного значення dik, то оцінці dik привласнюється нове значення. Ця процедура повторюється для всіх можливих пар вузлів, доки не будуть отримані всі значення d*ik.

Для будь-яких трьох різних вузлів i, j та k сформульовані вище умови можуть бути записані в вигляді нерівності:

dij + djk ≥ dik i≠ j≠ k, (2.1)

оскільки в протилежному випадку найкоротший ланцюг и вузла i в k повинен містити вузол j і тоді величина dik не дорівнювала б довжині найкоротшого ланцюга. В алгоритмі Флойда початковим значенням dik є величина Сik, а потім ця оцінка послідовно покращується, доки не буде знайдено найкоротший ланцюг між вузлами i та k.

 
 

Алгоритм Флойда дозволяє вирішити задачу побудови багатополюсного найкоротшого ланцюга для мережі з n вузлів за n ітерацій. Для формального описання ітеративної процедури пошуку рішення, позначимо символом djik оцінку довжини найкоротшого ланцюга з вузла i до вузла k, отриману на j - й ітерації. Ця оцінка обирається як найменше значення з оцінки цього ланцюга на попередній (j-1) - й ітерації та довжини ланцюга через транзитний вузол j:

dik j= min [dik j-1; dij j-1+djk j-1], i ≠ j ≠ k (2.2)

Якщо операцію (2.2) виконати з даною парою вузлів i й k і усіма можливими транзитними вузлами j (i ≠ j ≠ k), збільшуючи номери j від 1 до n, то значення dⁿ ik, отримане на останній ітерації, буде дорівнювати довжині найкоротшого ланцюга з вузла i до вузла k.

Будемо використовувати матричний метод, який дозволить запам’ятовувати довжини найкоротших ланцюгів та їх маршрути. На кожній ітерації алгоритму будуються дві матриці. Перша – матриця довжин – містить поточні оцінки довжини найкоротших ланцюгів, тобто на j-й ітерації ця матриця виглядає:

Dj =[djik].

Алгоритм починає роботу при Dº =[d°ik], де ik=Cik. Потім виконується порівняння (2.2) для усіх елементів матриці і обчислюється D1 і т. д. доки для кожної пари вузлів не буде виконано критерій оптимальності (2.1).

Друга матриця – матриця маршрутів – необхідна для находження транзитних вузлів найкоротших ланцюгів. На j - й ітерації вона визначається як Rj=rjik, где rjik перший транзитний вузол найкоротшого ланцюга з i в k, що обирається серед вузлів множини {1, 2,..., j} (i ≠ j ≠ k). На початку алгоритма R°=[r°ik], где ik=k. На j-й ітерації вузол rjik обирається з наступного співвідношення:

(2.3)

Таким чином, після побудови початкових матриць и R ° треба для кожного j =1, 2,..., n, виконати 2 кроки:

Крок 1. Визначити j-й вузол як базовий. (Тобто на цій ітерації саме цей вузол перевіряється як «кандидат» в транзитні вузли між іншими вузлами). Викреслити j-й рядок та j-й стовпчик матриці відстаней Dj-1, а також рядки і стовпчики Dj-1, що містять в базовому рядку чи стовпчику елементи, рівні ¥.

Крок 2. Кожний невикреслений елемент dikj-1 (k≠ j) матриці відстаней порівнюється з сумою dij j-1 та djk j-1 елементів, розташованих на перетині розглянутого стовпчика і базового рядка та розглянутого рядка і базового стовпчика відповідно.

Якщо виконується нерівність dijj-1+djk j-1 ≥ dik j-1, тобто шлях через транзитний вузол j гірше, ніж попередня оцінка, то перейти до розгляду наступного невикресленого елемента. В протилежному випадку включення вузла j в маршрут зменшує довжину найкоротшого ланцюга з вузла i до вузла k, отже необхідно поновити значення відповідних елементів в обох матрицях:

елементу dikj-1 матриці довжин присвоїти значення dikj=dijj-1+djkj-1, а відповідному елементу матриці маршрутів — значення j. Після перегляду усіх елементів знову перейти до кроку 1 при j=j+l. При j=n будуть побудовані матриця відстаней і матриця маршрутів, що надають рішення задачі.

Приклад 2.

Рисунок 2.2 – Граф мережі

 

Задано граф мережі (рис. 2.2), в якій потрібно знайти найкоротші шляхи між усіма парами вузлів.

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

Початкові значення матриць: D0 – матриця відстаней (вартостей) Сij (якщо немає прямого зв'язку, то ставиться «»), і R0 – матриця, де в кожнім стовпці проставлено номер цього стовпця.

Крок № 0: j=0

D0

                 
       
         
             
         
         
         
         
         

R0

                 
                 
                 
                 
                 
                 
                 
                 
                 

Крок № 1: j=1.

З матриці D0 викреслюємо ті рядки і стовпці, де на перетинанні з першим стовпцем і першим рядком присутня «», тобто стовпці 3, 5, 6, 7, 8 і рядки 3, 5, 6, 7, 8.

 

 

       
       
     
     

 

Для визначення найкоротшої відстані (для значень з незаштрихованої області) потрібно вибирати мінімальне значення з поточного значення, і суми значень, що знаходяться в j -му рядку та і -му стовпці заштрихованої області.

d124 = min [d024; d021+d014] = min[∞; 9+3] = 12,

d142 = min [d042; d041+d012] = min[∞; 3+9] = 12,

Далі всі зміни потрібно внести в матрицю відстаней і матрицю маршрутів. Для матриці маршрутів вноситься номер кроку в ті комірки, де були внесені зміни в матриці відстаней. Дана зміна в матриці маршрутів означає, що, приміром, з вузла 2 у вузол 4 першим проміжним вузлом на шляху проходження маршруту буде вузол 1 (дане твердження не є остаточним, у процесі виконання алгоритму це значення може ще помінятися).

D1

                 
       
        [12]  
             
    [12]      
         
         
         
         

R1

                 
                 
        [1]        
                 
    [1]            
                 
                 
                 
                 

 

Крок № 2: j=2.

Викреслюємо стовпці 6, 7, 8 і рядки 6, 7, 8.

           
       
           
         
         
       

 

d213 = min [d113; d112+d123] = min [∞; 9+2] = 11,

d215 = min [d115; d112+d125] = min [∞; 9+7] = 16,

d231 = min [d131; d132+d121] = min [∞; 2+9] = 11,

d245 = min [d145; d142+d125] = min [∞; 12+7] = 19,

d251 = min [d151; d152+d121] = min [∞; 7+9] = 16,

d254 = min [d154; d152+d124] = min [∞; 7+12] = 19,

Усі зміни вносимо в матриці.

D2

                 
      [11]   [16]
           
  [11]            
          [19]  
  [16]     [19]    
         
         
         

R2

                 
      [2]   [2]      
                 
  [2]              
          [2]      
  [2]     [2]        
                 
                 
                 

 

Кроки №№ 3-8: j = 3, …, 8...

З 6 ітерації матриця D не міняється, отже, D5 і R5 – оптимальні.

D5

                 
               
               
               
               
               
               
               
                 

R5

                 
                 
                 
                 
                 
                 
                 
                 
                 

 

Після одержання оптимальних матриць відстаней і маршрутів можна визначити найкоротшу відстань з одного вузла в інший і відповідний маршрут. Приміром, потрібно знайти найкоротший шлях між вузлами 1-5. По матриці D5 знаходиться найкоротша відстань: D155 = 9. По матриці R5 знаходиться маршрут проходження: в комірці 1-5 значення 4 (R155 = 4), тобто наступним після 1-го вузла буде 4-й, далі потрібно подивитися комірку 4-5 (R455 = 3), тобто після 4-го вузла йде 3-й.

Далі R355 = 5. У підсумку виходить маршрут: 1-4-3-5.


 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.