Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичні вказівки з курсової роботи AтаПЗОВПвТ....doc
Скачиваний:
7
Добавлен:
05.12.2018
Размер:
7.49 Mб
Скачать

2. Задача пошуку найкоротших шляхів між заданими множинами вершин

У якості вихідних даних для цієї задачі беремо позначений орграф G(V,E), зображений на рис. 6, що містить час польоту по маршрутах, що зв'язує визначені міста, причому вся множина його вершин V розбита на дві підмножини. До першої підмножини відносяться міста вильотів ( m міст ), а друга підмножина містить міста посадки літаків ( n міст ). Потрібно відшукати найкоротші маршрути перельотів між аеропортами( а\п) вильотів і посадок, включаючи посадки в проміжних а\п (ними можуть бути як а\п вильотів, так і а\п посадок літаків). Іншими словами ми повинні одержати матрицю найкоротших відстаней між а\п вильотів і а\п посадок (табл. 63).

Таблиця 63

Результуюча матриця найкоротших відстаней

а\п посадок

а\п вильотів

1

2

. . .

n

1

C11

C12

. . .

C1n

2

C21

C22

. . .

C2n

. . .

. . .

. . .

. . .

. . .

m

Cm1

Cm2

. . .

Cmn

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

Тут масив D являє собою результуючу матрицю найкоротших відстаней, причому на кожному кроці елемент D[i, v] містить довжину поточного найкоротшого шляху від вершини i до вершини v. Масив C задає вартості перельотів, де елемент C[i, j] дорівнює вартості дуги i —> j. Якщо дуги i —> j не існує, то C[i,j] лягає рівним (нескінченності), тобто більшим будь-якої фактичної вартості дуг. Елемент масиву Р[i, v] містить номер вершини, безпосередньо попередній вершині v у найкоротшому шляху від вершини i. Множина S має той же зміст, що й в алгоритмі Дейкстри.

Лістинг 2. Алгоритм побудови матриці найкоротших відстаней

procedure New( var D: array[1 .. m, l .. (m + n)] of real;

C: array[1 .. (m + n), l .. (m + n)] of real;

P: array[1 .. m, l .. (m + n)] of integer);

begin

(1) for i := 1 to m do

begin

S := {i}; { вибір чергової вершини з підмножини а\п вильотів }

for j := 1 to (m + n) do

begin

D[i, j] := C[i, j]; { ініціалізація D }

P[i, j] := i

end

(2) for j := 1 to (m + n –1) do

begin

вибір з множини V\S такої вершини w, що значення D[i, w]

мінімально;

додати w до множини S;

for кожна вершина v з множини V\S do

begin

if (D[i, w) + C[w, v] < D[i, v] then

P[i, j] := w;

D[i, v] := min(D[i, v], D([i, w] + C[w, v] );

end

(3) end

(4) end

end; { New }

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

У таблицях 64, 65 і 66, відповідно, приведена матриця C, D і P, які отримані за допомогою нового алгоритму для орграфа, зображеного на рис. 6. У якості а\п вильотів обрані 1 і 2, інші 3, 4 і 5 – а\п посадок.

(У додатку 18 наведений текст процедури на мові Delphy, яка реалізує метод графів – модифікований метод Дейкстри).

Таблиця 64 Таблиця 65

Матриця вартостей Матриця найкоротших відстаней

а\п вильотів і посадок

а\п вильотів і посадок

1

2

3

4

5

1

2

3

4

5

а\п вильотів і посадок

1

 

10

 

30

100

а\п

вильотів

1

 

10

50

30

60

2

 

50

 

2

120

 

50

120

60

3

70

10

Таблиця 66

Матриця проміжних вершин

1

2

3

4

5

4

 

20

 

а\п

вильотів

1

1

4

1

3

5

 

 

 

60

 

2

3

2

5

3