You are on page 1of 7

1

ТЕМА 2-1.
Задача комівояжера

Комівояжер повинен виїхати із заданого міста, об’їхати усі міста, що


залишилися і повернутися додому за найкоротшим маршрутом.
Метод базується на перетворенні матриці відстаней графа, вершини якого –
міста, а дугами є шляхи між містами. Кожній дузі приписано вагу, яка дорівнює
відстані між відповідною парою міст. Метод використовує ряд евристичних
процедур, тобто процедур, які дають хороший практичний результат, але
справедливість цих процедур не доводиться.
Приклад
1 2 3 4 5 6 7
1  3 93 13 33 9 57
2 4  77 42 21 16 34
3 45 17  36 16 28 25
4 39 90 80  56 7 91
5 28 46 88 33  25 57
6 3 88 18 46 92  7
7 44 26 33 27 84 39 

У клітинці іі стоїть знак "", а не “0”, тому що у алгоритмі використовується


евристична процедура стеження за “0” (за мінімальною відстанню, яка дорівнює 0).
У плані використання цієї процедури клітинка іі ніякої інформації не несе, отже,
можна поставити "".
Алгоритм.
1. Процедура редукції. Полягає у приведенні матриці відстаней по строкам, а
потім по стовпчикам.
а). Приведення по строках. У кожній строці обирається мінімальне число. Воно
віднімається з числа, яке записане у кожній клітинці строки, що розглядається.
2

Праворуч від матриці будується додатковий стовпчик, куди заноситься це


мінімальне число. Потім числа у стовпчику додаються.
1 2 3 4 5 6 7
1  0 90 10 30 6 54 3
2 0  73 38 17 12 30 4
3 29 1  20 0 12 9 16
4 32 83 73  49 0 84 7
5 3 21 63 8  0 32 25
6 0 85 15 43 89  4 3
7 18 0 7 1 58 13  26

б). Приведення по стовпчикам. У кожному стовпчику матриці, приведеної по


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

1 2 3 4 5 6 7
1  0 83 9 30 6 50
2 0  66 37 17 12 26
3 29 1  19 0 12 5
4 32 83 66  49 0 80
5 3 21 56 7  0 28
6 0 85 8 42 89  0
7 18 0 0 0 58 13 

0 0 7 1 0 0 4
Потім додаються сумарні результати строки та стовпчика. Отримане число є
нижньою межею самого короткого маршруту комівояжера, тобто усі маршрути,
знайдені у ході рішення, будуть 96.
2. У приведеній матриці обираються усі нульові клітинки. Кожна клітинка
забезпечує мінімальну відстань, яка дорівнює “0” для відповідної пари.
Серед нульових клітинок обирається така, що при заміни “0” на "", дозволить
відняти зі своєї строки і стовпчика найбільше сумарне число.
3

Вказана процедура також є евристичною. Якщо формується декілька клітинок з


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

Нульові Число, що Сумарний


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

(1,2) 6 0 6
(2,1) 12 0 12
(3,5) 1 17 18
4 6
(4,6) 32 0 32
(5,6) 3 0 3
(6,1) 0 0 0
(6,7) 0 5 5
(7,2) 0 0 0
(7,3) 0 8 8
(7,4) 0 7 7
Вибір клітинки (4,6) означає, що обрано фрагмент маршруту від вершини 4 до
вершини 6.
Так як клітинку (4,6) обрано, то вершини 4 і 6 більше у маршруті участі не
беруть як вихідна та вхідна відповідно, це означає, що ми викреслюємо строку 4 та
стовпчик 6, а у (6,4) ставимо знак "", так як комівояжер ніколи не поїде зворотньо з
6 у 4.
Матриця прийме вигляд:
1 2 3 4 5 7
1  0 83 930 50
2 0  66 3717 26
3 29 1  19 0 5
5 3 21 56 7 28
6 0 85 8  89 0
7 18 0 0 0 58 

Її ми знову приводимо по строках:


4

1 2 3 4 5 7
1  0 83 9 30 50 0
2 0  66 37 17 26 0
3 29 1  19 0 5 0
5 0 18 53 4  25 3
6 0 85 8  89 0 0
7 18 0 0 0 58  0
Приведення по стовпчиках у останній матриці вже неможливе.
Сума, яка отримана у додатковому стовпчику, додається до значення нижньої
межи маршруту і ми отримуємо нову межу 3+96=99.
Нульові Число, що Сумарний
клітинки віднімається з результат
строки стовпчика 4 6

(1,2) 9 0 9 3 5
(2,1) 17 0 17
(3,5) 1 17 18
(5,1) 4 0 4
(6,1) 0 0 0
(6,7) 0 5 5
(7,2) 0 0 0
(7,3) 0 8 8
(7,4) 0 4 4
Знову викреслюємо строку і стовпчик, а отриману матрицю приводимо по
строках і стовпчиках. У клітинку (5,3) ставимо символ "".
12 3 4 7
1  0 83 9 50
2 0  66 37 26
5 0 18  4 25
6 0 85 8  0
7 18 0 0 0 
Але її привести неможливо, тому знову складаємо таблицю.
5

Нульові Число, що Сумарний


клітинки віднімається результат
4 6
строки стовпчика

(1,2) 9 0 9 3 5
(2,1) 26 0 26
(5,1) 4 0 4
2 1
(6,1) 0 0 0
(6,7) 0 25 25
(7,2) 0 0 0
(7,3) 0 8 8
(7,4) 0 4 4
Викреслюємо строку 2 та стовпчик 1. При цьому не забуваючи поставити знак
"" у клітинку (1,2).
2 3 4 7
1  83 9 50
5 18  4 25
6 85 8  0
7 0 0 0 
Приведемо по строках:
2
3 4 7
1  74 0 41 9
5 14  0 21 4
6 85 8  0 0
7 0 0 0  0
Подальше приведення по стовпчиках неможливе. Нижня межа знову змінилася
і становить 99+9+4=112.
В отриманій матриці знову обираємо усі нульові клітинки і будуємо таблицю:
6

Нульові Число, що Сумарний


клітинки віднімається результат 4 6
строки стовпчика
(1,4) 41 0 41
3 5
(5,4) 14 0 14
(6,7) 8 21 29
(7,2) 0 14 14 2 1
(7,3) 0 8 8
(7,4) 0 0 0

У останній матриці викреслюємо строку 1 та стовпчик 4. У клітинці (4,1) ми


повинні поставити "", але такої клітинки немає! Якщо вона відсутня, то
використовується наступне евристичне правило:
Якщо дуга, що додається до побудованого шляху, йде з іn до j1, а побудований
шлях складається з двох частин: i1i2i3...in та j1j2...jv, тоді у
матриці комівояжера не повинно бути дуги з jv до i1, тому що інакше
утвориться контур, який не є гамільтоновим. Інакше кажучи, треба уни кати за
циклювання новоствореного маршруту. У нашому випадку символ "" треба
ставити у (6,2).
Тоді матриця прийме вигляд:
2 3 7
5 14  21
6  8 0
7 0 0 
Після приведення:
2 3 7
5 0 147
6  8 00
7 0 0  0
Подальше приведення по стовпчиках неможливе. Нижня межа знову змінилася
і складає 112+14=126. Обираємо нульові клітинки і будуємо таблицю:
7

Нульові Число, що віднімається Сумарний


клітинки з результат 4 6
строки стовпчика 7

(5,2) 7 0 7 3 5
(6,7) 8 7 15
(7,2) 0 0 0
2 1
(7,3) 0 8 8

Видаляємо строку 6 і стовпчик 7. У відповідності з правилом у (7,2) ставимо "".

2 3
5  0
7  0
Клітинки, що залишилися, є рівноцінними. На їх базі додаємо дуги, яких не
достає.
Граф прийме вигляд:

4 6
7

3 5

2 1

You might also like