Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
04_Пояснювальна записка ДР_зразок вимоги.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
472.58 Кб
Скачать

1.3.5. Мій метод (метод Ярощука) рішення задачі комівояжера

Розглянемо рис. 9-10 і спробуємо знайти в них найкоротші тури. Очевидно, що найкоротший тур не повинен містити пересічних ребер (в іншому випадку, помінявши вершини при пересічних ребрах місцями, отримаємо більш короткий тур). У першому випадку найкоротшим є тур 1-2-4-5-3-1, а в другому - тур 1-2-3-4-5-1. Аналізуючи безліч інших аналогічних розташувань п'яти і більше міст, можна зробити наступне загальне припущення:

1. Якщо можна побудувати опуклий багатокутник, по периметру якого лежать всі міста, то такий опуклий багатокутник є найкоротшим туром.

О днак не завжди можна побудувати опуклий багатокутник, по периметру якого лежали б всі міста. Велика ймовірність того, що деякі міста не увійдуть до опуклий багатокутник. Такі міста будемо називати «центральними». Так як побудувати опуклий багатокутник досить легко, то завдання зводиться до того, щоб включити в тур у вигляді опуклого багатокутника всі центральні міста з мінімальними втратами. Нехай є масив T [n + 1], який містить в собі номери міст по порядку, які повинен відвідати комівояжер, т. Е. Спочатку комівояжер повинен відвідати місто T [1], потім T [2], потім T [3] і т . д,, причому T [n + 1] = T [1] (комівояжер повинен повернутися в початковий місто). Тоді, якщо виконується рівність i∈ [1,2..n]; C [T [i], p] + C [p, T [i + 1]] - C [T [I], T [i + 1]] = min, то центральний місто з номером p потрібно включити в тур між містами T [i] і T [i + 1]. Виконавши цю операцію для всіх центральних міст, в результаті отримаємо найкоротший тур. Даний алгоритм можна реалізувати на мові Паскаль і перевірити вірність припущення 1. Для задачі, вирішеною нами методом гілок і меж, мій алгоритм дає правильне рішення.

С пробуємо вирішити даним алгоритмом ЗК для восьми міст. Нехай маємо вісім міст, розташування яких показано на рис. 11. Матриця відстаней наведена поруч на табл. 13. Проміжні побудови найкоротшого туру показані пунктирними лініями, цифри - порядок видалення ребер. Таким чином, маємо для даного випадку найкоротший тур 1-3-7-5-4-8-6-2-1. Довжина цього туру: D = 6 + 7 + 5 + 2 + 6 + 5 + 13 + 13 = 57. Цей результат є правильним, т. К. Алгоритм лексичного перебору, який ніколи не помиляється, дає точно такий же тур. (Слід також зазначити, що жодній алгоритм для цього випадку помиляється всього на 1 і дає тур 1-3-4-5-7-8-6-2-1 довжиною в 58).

1

2

3

4

5

6

7

8

1

13

6

13

14

15

14

16

2

13

11

11

8

13

17

14

3

6

11

5

6

11

7

11

4

13

11

5

2

6

7

6

5

14

8

6

2

6

5

6

6

15

13

11

6

6

13

5

7

14

17

7

7

5

13

9

8

16

14

11

6

6

5

9

табл. 13


Одним з можливих недоліків такого алгоритму є необхідність знати не матрицю відстаней, а координати кожного міста на площині. Якщо нам відома матриця відстаней між містами, але невідомі їх координати, то для їх знаходження потрібно буде вирішити n систем квадратних рівнянь з n невідомими для кожної координати. Вже для 6 міст це зробити дуже складно. Якщо ж, навпаки, є координати всіх міст, але немає матриці відстаней між ними, то створити цю матрицю нескладно. Це можна легко зробити в умі для 5-6 міст. Для більшої кількості міст можна скористатися можливостями комп'ютера, в той час як промоделювати рішення системи квадратних рівнянь на комп'ютері досить складно.

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