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

План
Вступ
Постановка задачі
Математична модель задачі комівояжера
Алгоритм рішення
Висновки
Список використаної літератури


Дата добавления на сайт: 04 марта 2025
Міністерство внутрішніх справ України
Харківський національний університет внутрішніх справ
ННІ Психології,менеджменту,соціальних та інформаційних технологій

Курсова робота з дисципліни:
«Вища математика»
на тему:
"Метод гілок та меж для рішення задач цілочисельного програмування"

Виконав: курсант групи
ІПТ-09-2 Руденко С.В.
Перевірив: доцент кафедри ПМ та
аналітичного забезпечення ОВС
Соколовська О.Г.

Харків 2011
План

Вступ
Постановка задачі
Математична модель задачі комівояжера
Алгоритм рішення
Висновки
Список використаної літератури

Вступ

У 1859 р. Сер Вільям Гамільтон, знаменитий математик, який дав світу теорію комплексного числа і кватерніони, запропонував дитячу головоломку, в якій пропонувалося здійснити «кругове подорож» по 20 містах, розташованих у різних частинах земної кулі. Кожне місто з'єднувався дорогами з трьома сусідніми так, що дорожня мережа утворювала 30 ребер додекаедра, у вершинах якого знаходилися міста a, b,... t. Обов'язковою умовою було вимога: кожне місто за винятком першого можна відвідати один раз.
Гамильтонова завдання про мандрівника нерідко перетворюється на задачу про комівояжера. Комівояжер - не вільно мандрівний турист, а ділова людина, обмежений тимчасовими, грошовими або будь-якими іншими ресурсами. Гамильтонова завдання може стати завданням про комівояжера, якщо кожне з ребер забезпечити числовою характеристикою. Це може бути кілометраж, час на дорогу, вартість квитка, витрата пального і т.д. Таким чином, умовні характеристики дадуть числовий ряд, елементи якого можуть бути розподілені між ребрами як завгодно.

Постановка завдання

Розглянемо задачу про комівояжера.
Є n міст, відстані (вартість проїзду, витрата пального на дорогу і т.д.) між якими відомі. Комівояжер повинен пройти всі n міст по одному разу, повернувшись в те місто, з якого почав. Потрібно знайти такий маршрут руху, при якому сумарний пройдене відстань (вартість проїзду і т.д.) буде мінімальним.
Очевидно, що завдання комівояжера - це проблема віднайдення найкоротшого гамильтонова циклу в повному графі.
Можна запропонувати наступну просту схему розв'язання задачі комівояжера: згенерувати всі n! можливих перестановок вершин повного графа, підрахувати для кожної перестановки довжину маршруту і вибрати найкоротший. Однак, n! із зростанням n росте швидше, ніж будь-який поліном від n, і навіть швидше, ніж Метод гілок та меж для рішення задач цілочисельного програмування (рис. 1). Таким чином, рішення задачі комівояжера методом повного перебору виявляється практично нездійсненним, навіть при досить невеликих n.
Вирішити задачу комівояжера також можна за допомогою алгоритму Крускала і «дерев'яного» алгоритму. Ці методи прискорюють розробку алгоритму в порівнянні з методом повного перебору, проте не завжди дають оптимальне рішення.
Існує метод розв'язання задачі комівояжера, який дає оптимальне рішення. Цей метод називається методом гілок і меж. Рішення задачі комівояжера методом гілок і меж по-іншому називають алгоритмом Літтла.
Якщо вважати міста вершинами графа, а комунікації (i, j) - його дугами, то вимога знаходження мінімального шляху, що проходить один і тільки один раз через кожне місто, і повернення назад, можна розглядати як знаходження на графі гамильтонова контуру мінімальної довжини.
Для практичної реалізації ідеї методу гілок і меж стосовно до задачі комівояжера потрібно знайти метод визначення нижніх меж підмножини і розбиття множини гамільтонових контурів на підмножини (розгалуження).
Визначення нижніх меж базується на тому твердженні, що якщо до всіх елементів i-го рядка або j-го стовпця матриці C додати або відняти число, то завдання залишиться еквівалентної колишньою, тобто оптимальність маршруту комівояжера не зміниться, а довжина будь-якого гамильтонова контуру зміниться на дану величину Метод гілок та меж для рішення задач цілочисельного програмування (рис. 2).
Опишемо алгоритм Літтла для знаходження мінімального гамильтонова контуру для графа з n вершинами. Граф представляють у вигляді матриці його дуг. Якщо між вершинами Xi і Xj немає дуги, то ставиться символ «∞».
Алгоритм Літтла для розв'язання задачі комівояжера можна сформулювати у вигляді наступних правил:
. Знаходимо в кожному рядку матриці Метод гілок та меж для рішення задач цілочисельного програмування (рис. 3) мінімальний елемент Метод гілок та меж для рішення задач цілочисельного програмування (рис. 4) і віднімаємо його з усіх елементів відповідного рядка. Отримаємо матрицю, наведену по рядках, з елементами

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 5).

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

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 8),

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

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 11),

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

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 12).

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

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 13).

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

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 15).

. Розбиваємо безліч всіх гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 16) на дві підмножини Метод гілок та меж для рішення задач цілочисельного програмування (рис. 17)і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 18). Підмножина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 19)гамільтонових контурів містить дугу Метод гілок та меж для рішення задач цілочисельного програмування (рис. 20), - Метод гілок та меж для рішення задач цілочисельного програмування (рис. 21)її не містить. Для отримання матриці контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 22), що включають дугу Метод гілок та меж для рішення задач цілочисельного програмування (рис. 23), викреслюємо в матриці Метод гілок та меж для рішення задач цілочисельного програмування (рис. 24)рядок Метод гілок та меж для рішення задач цілочисельного програмування (рис. 25)і стовпець Метод гілок та меж для рішення задач цілочисельного програмування (рис. 26). Щоб не допустити утворення негамільтонова контуру, замінимо симетричний елемент Метод гілок та меж для рішення задач цілочисельного програмування (рис. 27)на знак «∞».
. Наводимо матрицю гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 28). Нехай Метод гілок та меж для рішення задач цілочисельного програмування (рис. 29)- константа її приведення. Тоді нижня межа множина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 30)визначиться так:

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 31).

. Знаходимо множину гамільтонових контурівМетод гілок та меж для рішення задач цілочисельного програмування (рис. 32), що не включають дугуМетод гілок та меж для рішення задач цілочисельного програмування (рис. 33). Виняток дуги Метод гілок та меж для рішення задач цілочисельного програмування (рис. 34)досягається заміною елемента Метод гілок та меж для рішення задач цілочисельного програмування (рис. 35)в матриці Метод гілок та меж для рішення задач цілочисельного програмування (рис. 36)на ∞.
. Робимо приведення матриці гамільтонових контурівМетод гілок та меж для рішення задач цілочисельного програмування (рис. 37). Нехай Метод гілок та меж для рішення задач цілочисельного програмування (рис. 38)- константа її приведення. Нижня межа множина визначається так:

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 39).

. Порівнюємо нижні множини, підмножини гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 40)іМетод гілок та меж для рішення задач цілочисельного програмування (рис. 41). Якщо Метод гілок та меж для рішення задач цілочисельного програмування (рис. 42), то подальшого розгалуження в першу чергу підлягає множина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 43). Якщо ж Метод гілок та меж для рішення задач цілочисельного програмування (рис. 44), то розбиття підлягає множина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 45).
Процес розбиття множин на підмножини супроводжується побудовою дерева розгалужень.
. Якщо в результаті розгалужень отримуємо матрицю Метод гілок та меж для рішення задач цілочисельного програмування (рис. 46), то визначаємо отриманий розгалуженням гамільтонів контур і його довжину.
. Порівнюємо довжину гамильтонова контуру з нижніми межами обірваних гілок. Якщо довжина контуру не перевищує їх нижніх меж, то завдання виконане. В іншому випадку розвиваємо гілки підмножин з нижньою межею, меншою отриманого контуру, до тих пір, поки не отримаємо маршрут з меншою довжиною або не переконаємося, що такого не існує.

Математична модель задачі комівояжера

Завдання комівояжера може бути сформульована як цілочисельна введенням булевих змінних Метод гілок та меж для рішення задач цілочисельного програмування (рис. 47), якщо маршрут включає переїзд з міста i безпосередньо в місто j і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 48) в іншому випадку. Тоді можна задати математичну модель задачі, тобто записати цільову функцію і систему обмежень:

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 49) (1)
Метод гілок та меж для рішення задач цілочисельного програмування (рис. 50)

Умови (2) - (4) в сукупності забезпечують, що кожна змінна дорівнює або нулю, або одиниці. При цьому обмеження (2), (3) висловлюють умови, що комівояжер побуває в кожному місті один раз на нього прибувши (обмеження (2)), і один раз з нього виїхавши (обмеження (3)).
Проте цих обмежень не достатньо для постановки задачі комівояжера, так як вони не виключають рішення, де замість простого циклу, що проходить через n вершин, відшукуються 2 і більше окремих циклу (підциклу), що проходить через менше число вершин. Тому завдання, описана рівняннями (2) - (4) повинна бути доповнена обмеженнями, що забезпечують зв'язність шуканого циклу.
Для того, щоб виключити при постановці завдання всі можливі підцикли в систему обмежень задачі включають такі обмеження:

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 51), Де Метод гілок та меж для рішення задач цілочисельного програмування (рис. 52),Метод гілок та меж для рішення задач цілочисельного програмування (рис. 53) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 54).

Алгоритм рішення

Дана матриця відстаней, представлена в таблиці 1. Необхідно за допомогою алгоритму Літтла вирішити завдання комівояжера.

Табл.1
ji123456
171621217
21321154323
325331179
41310273312
592191451
642175923

) Праворуч до таблиці приєднуємо стовпець Ui, в якому записуємо мінімальні елементи відповідних рядків. Віднімаємо елементи Ui з відповідних елементів рядка матриці.

ji123456Ui
1716212172
2132115432313
3253311793
4131027331210
5921914512
6421759235

2) Внизу отриманої матриці приєднуємо рядок Vj, в якій записуємо мінімальні елементи стовпців. Віднімаємо елементи Vj з відповідних стовпців матриці.

ji123456Ui
1716212172
2132115432313
3253311793
4131027331210
5921914512
6421759235

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

Табл.2
ji123456
15141701913
203802308
3220426144
4300172304
5707171047
6371208218

) Знаходимо константу приведення:

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 55).

Таким чином, нижньою межею множини всіх гамільтонових контурів буде число Метод гілок та меж для рішення задач цілочисельного програмування (рис. 56).
) Знаходимо ступеня нулів повністю наведеної матриці. Для цього як би замінити в ній всі нулі на знак «∞» і встановлюємо суму мінімальних елементів відповідного рядка і стовпця. Ступені нулів записані в правих верхніх кутах клітин, для яких Метод гілок та меж для рішення задач цілочисельного програмування (рис. 57).
) Визначаємо максимальну ступінь нуля. Вона дорівнює 19 і відповідає клітині (1, 5). Таким чином, претендентом на включення до гамільтонів контур є дуга (1, 5).
) Розбиваємо безліч всіх гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 58) на два: Метод гілок та меж для рішення задач цілочисельного програмування (рис. 59) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 60). Матрицю Метод гілок та меж для рішення задач цілочисельного програмування (рис. 61) з дугою (1; 5) отримуємо табл.2 шляхом викреслювання рядка 1 і стовпця 5. Щоб не допускати утворення негамільтонова контуру, замінюємо елемент (5; 1) на знак «∞».

ji12346
20808
3220264
430170
50171047
6371202

8) Матрицю гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 62) отримаємо з таблиці 2 шляхом заміни елементу (1, 5) на знак «∞».

ji123456
151417135
2080308
322026144
43017230
570171047
637120218
14

9) Робимо додаткове приведення матриці контурів: Метод гілок та меж для рішення задач цілочисельного програмування (рис. 63):Метод гілок та меж для рішення задач цілочисельного програмування (рис. 64) = 0. Нижня межа множини Метод гілок та меж для рішення задач цілочисельного програмування (рис. 65) дорівнює Метод гілок та меж для рішення задач цілочисельного програмування (рис. 66).
) Знаходимо константу приведення для множині контурівМетод гілок та меж для рішення задач цілочисельного програмування (рис. 67):Метод гілок та меж для рішення задач цілочисельного програмування (рис. 68). Отже, нижня межа множини Метод гілок та меж для рішення задач цілочисельного програмування (рис. 69) дорівнює Метод гілок та меж для рішення задач цілочисельного програмування (рис. 70).
) Порівнюємо нижні межі підмножин Метод гілок та меж для рішення задач цілочисельного програмування (рис. 71) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 72). Так як Метод гілок та меж для рішення задач цілочисельного програмування (рис. 73), то подальшого розгалуження піддаємо множини.
На рис.1 представлено розгалуження по дузі (1, 5).

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 74)
рис.1

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

ji12346
2038028
32204264
43001704
5010171047
637120102

12) Дізнаємося ступеня нулів матриці. Претендентами на включення до гамільтонів контур будуть кілька дуг (5, 2) і (6, 3). Для подальших розрахунків виберемо дугу (6, 3). Розбиваємо множину на дві підмножини: Метод гілок та меж для рішення задач цілочисельного програмування (рис. 76) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 77) (табл. 3 та 4). Щоб не допустити утворення негамільтонова контуру, у таблиці 3 замінюємо елемент (3; 6) на знак «∞»

Табл.3
ji1246
2008
322026
4300
501047

Табл.4
ji12346
20808
3220264
430170
50171047
6371222
8

Визначимо константи приведення для цих матрицьМетод гілок та меж для рішення задач цілочисельного програмування (рис. 78), Метод гілок та меж для рішення задач цілочисельного програмування (рис. 79). Отже, Метод гілок та меж для рішення задач цілочисельного програмування (рис. 80), Метод гілок та меж для рішення задач цілочисельного програмування (рис. 81). Так як Метод гілок та меж для рішення задач цілочисельного програмування (рис. 82), то подальшого розгалуження підлягає підмножина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 83). Знаходимо ступеня нулів матриці.
ji1246
203028
32202226
430008
50101047

Претендентом до включення в гамільтонів контур стане дуга (3, 2). Розбиваємо множину Метод гілок та меж для рішення задач цілочисельного програмування (рис. 84)на дві Метод гілок та меж для рішення задач цілочисельного програмування (рис. 85) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 86).

ji146
2008
430
5104710

Очевидно, Метод гілок та меж для рішення задач цілочисельного програмування (рис. 87), Метод гілок та меж для рішення задач цілочисельного програмування (рис. 88). Отже, чергового розгалуження потрібно піддати підмножина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 89).

ji1246
2008
3222622
4300
501047

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

ji146
203008
43011
503737

Визначаємо ступеня нулів. Претендентом на включення до гамільтонів контур є дуга (5, 4). Розбиваємо безліч Метод гілок та меж для рішення задач цілочисельного програмування (рис. 91) на дві підмножини: Метод гілок та меж для рішення задач цілочисельного програмування (рис. 92) і Метод гілок та меж для рішення задач цілочисельного програмування (рис. 93).

ji16
208
430

i\j146
2008
430
53737

Знаходимо нижні межі Метод гілок та меж для рішення задач цілочисельного програмування (рис. 94), Метод гілок та меж для рішення задач цілочисельного програмування (рис. 95). Отже, чергового розгалуження потрібно піддати підмножина Метод гілок та меж для рішення задач цілочисельного програмування (рис. 96). Але його матриця має розмірність Метод гілок та меж для рішення задач цілочисельного програмування (рис. 97). Тому в гамільтонів контур слід включити дуги, що відповідають у матриці Метод гілок та меж для рішення задач цілочисельного програмування (рис. 98) нульовим елементам. Це дуги (2; 1) і (4, 6).
На рис.2 представлено дерево розгалужень. Визначимо отриманий гамільтонів контур. До нього увійшли дуги Метод гілок та меж для рішення задач цілочисельного програмування (рис. 99). Довжина контуру дорівнює Метод гілок та меж для рішення задач цілочисельного програмування (рис. 100). Так як кордони обірваних гілок більше довжини контуру 1 - 5 - 4 - 6 - 3 - 2 - 1, то цей контуру має найменшу довжину.

Метод гілок та меж для рішення задач цілочисельного програмування (рис. 101)
Рис.2
гамільтон модель задача комівояжер
Висновки

Завдання комівояжера є частковим випадком гамильтоновой завдання про мандрівника. Суть задачі комівояжера полягає в знаходженні сумарною мінімальної характеристики (відстані, вартості проїзду і т.д.), при цьому комівояжер повинен пройти всі n міст по одному разу, повернувшись в те місто, з якого почав.
Існують кілька методів розв'язання задачі комівояжера: метод повного перебору, за допомогою методу гілок і меж (алгоритм Літтла), алгоритму Крускала, «дерев'яного» алгоритму і т.д. Однак тільки метод гілок і меж дає нам у результаті найоптимальніше рішення.
Основна ідея методу Літтла полягає в тому, що спочатку будують нижню межу довжин маршрутів для всього безлічі гамільтонових контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 102). Потім вся безліч контурів Метод гілок та меж для рішення задач цілочисельного програмування (рис. 103) розбивають на дві підмножини Метод гілок та меж для рішення задач цілочисельного програмування (рис. 104) таким чином, щоб перше підмножина складалося з гамільтонових контурів, містять деяку дугу (i, j), а інше підмножина не містило цієї дуги.
Для практичної реалізації ідеї методу гілок і меж стосовно до задачі комівояжера потрібно знайти метод визначення нижніх меж підмножини і розбиття множини гамільтонових контурів на підмножини (розгалуження). Таке визначення нижніх меж базується на тому твердженні, що якщо до всіх елементів i-го рядка або j-го стовпця матриці C додати або відняти число Метод гілок та меж для рішення задач цілочисельного програмування (рис. 105), то завдання залишиться еквівалентної колишньою, тобто оптимальність маршруту комівояжера не зміниться, а довжина будь-якого гамильтонова контуру зміниться на дану величину.
Використовуючи ЕОМ, методом гілок і меж можна вирішити задачі комівояжера для Метод гілок та меж для рішення задач цілочисельного програмування (рис. 106).

Список використаної літератури

1. О.Е. Акимов «Дискретная математика. Логика, группы, графы», Москва, 2003, 376 с., ил., изд. дом «Лаборатория базовых знаний».
. Ф.А. Новиков «Дискретная математика для программистов» С.-Петербург, 2002 г. 304 с., ил., изд. дом «Питер».
. В.М. Бондарев «Основы программирования» 1998 г., 368 с. изд. дом «Феникс»



Комментарии:

Вы не можете оставлять комментарии. Пожалуйста, зарегистрируйтесь.