Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Math-Exel / exel / РГР_1_в2.doc
Скачиваний:
63
Добавлен:
12.02.2016
Размер:
10.27 Mб
Скачать

Рішення задачі

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

Порівнюючи нижні границі φ() і φ(), можна виділити ту підмножину маршрутів, яка з більшою вірогідністю містить маршрут мінімальної довжини.

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

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

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

Для того, щоб знайти нижню границю скористаємося наступним міркуванням:

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

Довжина ж будь-якого маршруту комівояжера зміниться на дану величину.

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

Константу приведення слід вибирати в якості нижньої границі довжини маршрутів.

Розбиття множини маршрутів на підмножини

Для виділення претендентів на включення в множину дуг, по яких проводиться галуження, розглянемо в приведеній матриці всі елементи, рівні нулю. Знайдемо ступені Θij нульових елементів цієї матриці. Ступінь нульового елементу Θij дорівнює сумі мінімального елементу в рядку i і мінімального елементу в стовпці j (при виборі цих мінімумів cij – не враховується). З найбільшою вірогідністю шуканому маршруту належать дуги з максимальним ступенем нуля.

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

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

Алгоритм Литтла для вирішення завдання комівояжера можна сформулювати у вигляді наступних правил:

1. Знаходимо в кожному рядку матриці мінімальний елементі віднімаємо його зі всіх елементів відповідного рядка. Отримаємо матрицю, приведену по рядках, з елементами

.

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

,

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

3. Підсумовуємо елементи і, отримаємо константу приведення

,

яка буде нижньою границею множини всіх допустимих гамільтонових контурів, тобто

.

4. Знаходимо ступені нулів для приведеної по рядках і стовпцях матриці. Для цього в думках нулі в матице замінюємо на знак «» і знаходимо суму мінімальних елементів рядка і стовпця, відповідних цьому нулю. Записуємо її в правому верхньому кутку клітки:

.

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

.

6. Розбиваємо множину всіх гамільтонових контурів на дві підмножиниі. Підмножинагамільтонових контурів містить дугу,- її не містить. Для отримання матриці контурів, що включають дугу, викреслюємо в матрицірядокі стовпець. Аби не допустити утворення негамільтонового контуру, замінимо симетричний елемент на знак «».

7. Приводимо матрицю гамільтонових контурів . Хай- константа її приведення. Тоді нижня границя множинивизначиться так:

.

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

9. Робимо приведення матриці гамільтонових контурів . Хай- константа її приведення. Нижня границя множинивизначиться так:

.

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

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

11. Якщо в результаті розгалужень отримуємо матрицю , то визначаємо отриманий розгалуженням гамільтоновий контур і його довжину.

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

Соседние файлы в папке exel