Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dokumentatsiya.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
4.97 Mб
Скачать

Методи розв’язку задачі

Метод повного перебору

В кожному конкретному формулюванні задачі комівояжера потрібно знайти найкоротший тур при заданих відстанях, причому множина усіх маршрутів є скінченною. Тому з теоретичної точки зору ЗАВЖДИ можна зробити ПОВНИЙ ПЕРЕБІР усіх маршрутів, вирахувати їх довжини і вибрати найкоротший маршрут. Тобто ми маємо згенерувати всі n! можливих перестановок вершин повного графа, підрахувати для кожної перестановки довжину маршруту і вибрати найкоротший. Проте, n! із зростанням n росте дуже швидко, тому вказаний спосіб рішення задачі при великих значеннях n виявляється практично нездійсненним, навіть при достатньо невеликих n. Особливо цей метод не продуктивний у несиметричних матрицях задачі комівояжера, бо на відміну від симетричних ЗК тут не має однакових даних матриці, їх в два рази більше ніж в симетричній матриці. Але іноді зустрічаються такі задачі, які цим методом вирішити можна дуже просто, наприклад в задачі про станок можна побачити, що найменший час на налаштування станку є оптимальним при такій послідовності операцій: I → II → III → IV → V → I. В такій послідовності можна легко помітити, що сумарний час нульовий, але таких задач не багато, тому, взагалі, цей метод все ж таки не є раціональним.

Метод гілок та меж

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

Основна ідея методу досить проста. Спочатку будується деяка оцінка знизу довжини маршруту для множини всіх гамільтонових циклів. Після цього множина всіх гамільтонових маршрутів розбивається на дві підмножини. Перша підмножина складається з гамільтонових циклів, що включають деяку дугу (i, j) (позначимо його [i, j]), а інша підмножина складається з циклів, що не включають цю дугу (позначимо його ). Для кожної з підмножин по тому ж правилу, що і для початкової множини гамільтонових маршрутів, визначається нижня межа. Кожна нова нижня межа виявляється не менше нижньої межі, визначеної для всієї множини. Порівнюючи нижні межі, можна відокремити підмножину гамільтонових шляхів, усередині якого з більшою ймовірністю міститься оптимальний маршрут. Ця підмножина за аналогічним правилом розбивається ще на дві, і знову знаходяться змінені нижні межі, і так роблять до тих пір, поки не залишиться єдиний цикл. Процес розбиття підмножин супроводжується побудовою деякого дерева за типом рис. 4.

О

рис.4

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

Надалі підмножини гамільтонових шляхів, що включають дуги (i1, i2), (i3,i4),... і які не включають дуги (j1, j2), (j3, j4) ..., ми будемо позначати так [i1, i2], [i3, i4], …, , ,… Множину всіх гамільтонових шляхів позначимо [Ur].

Основна «родзинка» методу полягає у вказівці способу обчислення нижньої межі для відповідних підмножин і у вказівці дуги (i, j), включення або не включення якої в маршрут розбиває досліджувану множину гамільтонових шляхів на підмножини. Зупинимося коротенько на цих двох питаннях.

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

Ідея отримання цієї оцінки пов'язана з тим, що якщо вирішити ЗК з деякою матрицею відстаней, а потім з будь-якого рядка або стовпця цієї матриці відняти довільне додатне число, то рішення ЗК з цією зміненою матрицею відстаней збігається з попереднім рішенням, а довжина маршруту зміниться на це ж саме число. Якщо цю операцію проробити і для інших рядків і стовпців, то довжина маршруту буде відрізнятися на суму всіх чисел, що віднімаються з рядків і стовпців.

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

Після цього аналогічним чином здійснюється зведення отриманої матриці по стовпцях.

Зведена по рядках і стовпцях матриця містить принаймні один нуль в кожному рядку і кожному стовпці. Так як довжина L1 оптимального маршруту в задачі з зведеною матрицею відрізняється від довжини маршруту L в задачі з не зведеною матрицею на суму констант зведення h, то

В зведеній матриці усі елементи невід’ємні, тому L1 ≥ 0, а сума констант зведення h може служити нижньою межею довжини гамільтонового шляху.

Апріорне виключення якої-небудь дуги (i, j) з маршруту виражається в заміні відповідного елемента di,j, у вихідній (а також у зведеній) матриці на ∞. У результаті такої заміни з’являється можливість провести додаткове зведення матриці та покращення оцінки.

Апріорне включення дуги (i, j) в маршрут автоматично веде до скорочення розмірів матриці (так як викреслюється i-й рядок та j-й стовпець). Одночасно з’являється можливість, виключити одну з дуг.

О

рис.5

скільки виключення цієї дуги представляє важливий елемент алгоритму, то розглянемо його більш детальніше. Включення дуги (i, j) призводить до утворення зв’язкового шляху, з’єднуючий деякі точки p та q (рис. 5). Припустимо, що маршрути повинні проходити через усі точки графу, тому забороняється включення до маршруту дуги (q, p), інакше утворюється замкнутий цикл, приходящий тільки через частину точок. В найпростішому випадку включення дуги (i, j) означає не включення дуги (j, i), тобто dj,i = ∞.

С

рис.8

корочення розмірів матриці та виключення елементу (q, p) дозволяє повести додаткове зведення матриці і тим самим покращити нижню оцінку довжини будь-якого гамільтонового маршруту, який міститься в підмножині [i, j].

Р

рис.8

озглянемо тепер питання щодо вибору дуги (i, j), яка грає таку важливу роль при розбитті множини гамільтонових шляхів на підмножини.

Найбільш імовірно, що в оптимальний маршрут входять дуги, для яких у зведеній матриці di,j = 0. Не включення в маршрут саме цих дуг різко збільшує нижню оцінку. Як уже зазначалося, виключаючи дугу (i, j), ми повинні покласти, що di,j = ∞ і, здійснюючи зведення знову отриманої матриці, поліпшити оцінку. Константами зведення є мінімальний елемент у i-ому рядку і такий же в j-ому стовпці. Тому найбільш різка зміна оцінки відбудеться в тому випадку, коли вибирається той елемент матриці відстаней, для якого:

  1. di,j = 0;

  2. після заміни di,j = 0 на di,j = ∞ сума мінімальних елементів у i-ому рядку та в j-ому стовпці має найбільше значення.

Матеріали цієї глави дають достатньо підстав вважати, що найбільш ефективним способом полегшення обчислень стало б зменшення кількості міст, які треба буде обійти комівояжеру. Якщо розгляд розташування міст в просторі або аналіз матриці відстаней підказують, що якась дуга або послідовність дуг входить в шуканий гамільтоновий цикл, то надалі такі дуги або послідовність дуг можна розглядати як одне узагальнене місто і на кілька стовпців і рядків скоротити початкову матрицю відстаней. Крім цього існує ще цілий ряд способів скорочення розмірів задачі, які можна використати для одержання наближеного рішення.

Жадібний алгоритм

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

Подивимося, як поведеться при вирішенні ЗК жадібний алгоритм. Тут він перетвориться на стратегію "йди до найближчого (до якого ще не входив) міста". Жадібний алгоритм, очевидно, безсилий у цьому завданні. Розглянемо для приклада цикл на рис. 2, що представляє вузький ромб. Нехай комівояжер стартує з міста 1. Алгоритм "йди ви найближче місто" виведе його в місто 2, потім 3, потім 4; на останньому кроці доведеться платити за жадібність, повертаючись по довгій діагоналі ромба. У результаті вийде не найкоротший, а довжелезний тур.

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

Як бачимо, жадібний алгоритм помиляється. Чи можна довести, що він помиляється помірно, що отриманий ним тур гірше мінімального, приміром, у 1000 разів? Ми доведемо, що цього довести не можна, причому не тільки для жадібного логарифма, а для алгоритмів набагато більш потужних. Але спочатку потрібно домовитися, як оцінювати похибки неточних алгоритмів, для визначеності, в задачі мінімізації. Нехай fB - справжній мінімум, а fA - той квазімінімум, який отримано за алгоритмом. Ясно, fA/fB ≥ 1, але це - тривіальне твердження, що може бути похибкою. Щоб оцінити її, потрібно затиснути ставлення оцінкою зверху:

fA/fB ≥1+ nε,

(1)

де, як зазвичай у вищій математиці, ε ≥ 0, але, проти звичаю, може бути дуже великим. Величина ε і буде служити мірою похибки. Якщо алгоритм мінімізації буде задовольняти нерівності (1), ми будемо говорити, що він має похибка ε.

Припустимо тепер, що є алгоритм А рішення ЗК, похибку якого потрібно оцінити. Візьмемо довільний граф G (V, E) і по ньому складемо вхідну матрицю ЗК:

С[i,j]={

1, якщо ребро (i, j) належить Е

1+nε у іншому випадку

Якщо в графі G є гамільтонів цикл, то мінімальний тур проходить по цьому циклу і fB = n. Якщо алгоритм А теж завжди буде знаходити цей шлях, то за результатами алгоритму можна судити, чи є гамільтонів цикл в довільному графі. Однак, неперебiрний алгоритм, який міг би відповісти, чи є гамільтонів ц икл в довільному графі, до цих пір нікому не відомо. Таким чином, наш алгоритм А повинен іноді помилятися і включати в тур хоча б одне ребро довжини 1+nε. Але тоді fA³(n-1)+(1+nε) так що fA/fB=1+nε тобто перевершує похибка ε на задану нерівністю (1). Про величину ε в нашому міркуванні ми не домовлялися, так що ε може бути безпідставно великий.

Таким чином доведена наступна теорема.

Або алгоритм А визначає, чи існує в довільному графі гамільтонів цикл, або похибка А при вирішенні ЗК може бути безпідставно велика.

Це міркування було вперше опубліковано Сані і Гонзалес в 1980 р. Теорема Сані-Гонзалеса заснована на тому, що немає ніяких обмежень на довжину ребер. Теорема не проходить, якщо відстані підпорядковуються нерівності трикутника.

Сij+ Сjk³Cik

Якщо її дотримуються, можна запропонувати кілька алгоритмів з похибкою 12. Перш, ніж описати такий алгоритм, слід згадати старовинну головоломку. Чи можна накреслити однією лінією відкритий конверт? Рис.2 показує, що можна (цифри на відрізках показують порядок їх проведення). Закритий конверт (рис.3.) однією лінією намалювати не можна і ось чому. Будемо називати лінії ребрами, а їх перехрестя ­­­­­­­—

вершинами.

Коли через точку проводиться лінія, то використовується два ребра - одне для входу в вершину, одне - для виходу. Якщо ступінь вершини непарна - то в ній лінія повинна початися або скінчитися. На рис. 3 вершин непарної ступеня дві: в одній лінія починається, в іншій - кінчається. Однак на рис. 4 є чотири вершини ступені три, але в однієї лінії не може бути чотири кінця. Якщо ж потрібно прокреслити фігуру однією замкненою лінією, то всі її вершини повинні мати парну ступінь.

Вірно і зворотне твердження: якщо всі вершини мають парну ступінь, то фігуру можна намалювати однієї незамкненою лінією. Дійсно, процес проведення лінії може скінчитися, тільки якщо лінія прийде в вершину, звідки вже виходу немає: всі ребра, приєднані до цієї вершини (зазвичай кажуть: інцидентних цій вершині), вже прокреслені. Якщо при цьому намальована вся фігура, щось потрібне твердження доведено, а якщо ні, видалимо вже намальовану частина G’. Після цього від графа залишиться одна або кілька зв'язкових компонент; нехай G’ – одна з таких компонент. У силу зв'язності вихідного графа G, G’ і G’’ мають хоч одну спільну вершину, скажімо, v. Якщо у G’’ видалені якісь ребра, то по парним числом від кожної вершини. Тому G’’ – зв'язний і всі його вершини мають парну ступінь. Побудуємо цикл в G’’ (може бути, не намалювавши все G’’) і через v додамо промальовувала частина G’’ к G’. Збільшуючи таким чином промальовувала частина G’, ми доб'ємося того, що G’ охватить весь G.

Це завдання колись вирішив Ейлер, і замкнуту лінію, яка покриває всі ребра графа, тепер називають ейлеровим циклом. По суті була доведена наступна теорема.

Ейлеров цикл в графі існує тоді і тільки тоді, коли (1) граф зв'язний і (2) всі його вершини мають парні ступені.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]