Скачиваний:
37
Добавлен:
30.05.2020
Размер:
3.32 Mб
Скачать

 

1

2

3

4

5

 

1

2

3

5

 

 

1

2

3

4

5

 

 

 

 

1

 

 

1

-

3

1

О4

2

5

-

1

0

 

7

-

3

1

-

0

 

 

23; 4

 

2

5

-

1

6

0і

3

3

1

-

0

 

2

5

-

1

6

0

2£!

27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

3

1

-

7

0і

4

0

4

5

2

3

3

1

-

7

0

 

Ж

 

 

ч

4

&

4

5

-

2

5

2

0

0

-

4

0

4

5

-

2

 

2

 

 

 

3

5

2

0і

о1

4

-

 

 

 

 

 

 

5

2

0

0

4

-

 

(1,4)

 

 

(М)

а)

 

 

 

 

 

б)

 

 

 

 

в)

 

 

 

 

 

г)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мал. 106

 

 

 

 

 

 

 

 

 

 

місто 4 вже остаточно визначені (мал. 106, б), а у другому - таб­ лиця (мал. 105, а) з виключеним ребром (1,4) 1 4 = «-»), оскільки вирішено далі його не розглядати (мал. 106, в). Зазна­ чимо, що при подальшому виключенні рядків і стовпців таб­ лиці зберігатимемо їх початкову нумерацію, оскільки ці номе­ ри визначають реальні вершини заданого графа.

Можна говорити про побудову бінарного дерева розв'язку задачі. У вершині 1 цього дерева розміщено вихідну таблицю (мал. 106, а) і дії щодо визначення сумарної константи її приве­ дення (23), що є одночасно нижньою границею, та визначення найбільшої вартості ризику нульового ребра (4) (мал. 106, г). Ця вершина дерева розв'язку має двох нащадків. У вершині 2 розміщено перший варіант, розглянутий вище, а у вершині 3 - другий. На ребрах цього дерева вказано нижню границю вар­ тості переходу до відповідних вершин.

Подальші дії розгалужуються: у лівій гілці дерева розв'язку розглядатиметься побудова гамільтонового циклу з поточною нижньою границею 23 з урахуванням того, що ребро (1,4) уві­ йшло до нього, а у правій - з поточною нижньою границею 27 з урахуванням того, що до шуканого циклу поки не включено жодного ребра, а ребро (1,4) зовсім виключене з перегляду.

Оскільки все одно треба буде розглянути обидві гілки, домо­ вимося надалі рухатися спочатку лівою, а потім уже правою. Розглянемо таблицю (мал. 106, б) і приведемо її по рядках (мал. 107, о) та стовпцях (мал. 107, б). Сумарна константа при­ ведення становить 4. Вартість ризику нульових ребер таблиці (мал. 105, б) визначена на малюнку 107, в. Наступним ребром для дослідження буде (4,5), оскільки саме воно має найбільшу вартість ризику 2. Вчинимо з ним так само, як і з ребром (1,4): в одному варіанті включимо його до шуканого циклу й інфор­ мацію про це розмістимо у вершині 4 дерева розв'язку, а у дру­ гому виключимо з перегляду, про що свідчитиме вершина 5 де­ рева розв'язку (мал. 107, г).

У вершині 2 дерева розв'язку уточнимо інформацію: у ре­ зультаті приведення матриці, що розглядалася у цій вершині, отримано сумарну константу приведення 4; вартість переходу

170

від вершини 2 до вершини 4 збільшить нижню границю вар­ тості 23 на це значення і тепер становитиме 27; перехід до вершини 5 збільшить значення нижньої границі вартості 27 на максимальну вартість ризику ребра (4,5), що становить 2. Та­ ким чином, вартість переходу від вершини 2 до вершини 5 де­ рева розв'язку буде обмежена значенням нижньої границі 29.

 

 

1

 

2

 

 

3

 

5

тіп

 

1

2

з

5

 

їїк

 

23; 4

 

2

5

 

-

 

 

1

 

0

0

2

5

-

1

0

 

 

 

3

3

1

-

0

0

3

3

1

-

0

 

 

 

 

 

і * Si

 

23 27

 

4

-

4

5

2

2

4

-

4

5

2

 

 

о |

 

 

 

5

2

0

0

-

0

5

2

0

0

-

 

о.

 

 

 

Сума приведення

2

тіп

2

0

0

0

 

2є

(1,4);23+4=27;2

 

а)

 

 

 

 

 

 

 

 

 

 

б)

 

 

 

 

 

 

27

29

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1 2 І

3 j 5

 

 

 

 

 

 

 

 

 

 

(М)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

і3 1 - I і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

і

 

і

'

 

-

І о1

 

 

 

 

 

 

 

(4,5)

 

(4т5)

 

4

-

2

1

3

0*

 

 

 

 

 

 

г)

 

 

 

5

0і і 0і , 0і І —

в)

 

 

 

 

 

 

 

 

 

Мал. 107

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для вершини 4 дерева розв'язку (мал. 107, г) розглядається таблиця (мал. 107, в) без 3-го рядка і 4-го стовпця, представлена на малюнку 108, а, що відповідає виходам з 4-ї і входам у 5-ту вершину графа. Для вершини 5 - таблиця, представлена на малюнку 108, б, де виключене з розгляду ребро (4,5). У таблиці (мал. 108, а), окрім викреслених 4-го рядка і 5-го стовпця, еле­ мент С5 х набув значення «-». Слушне запитання: чому? Якщо розглядається вершина 4 дерева розв'язку, то це означає, що шуканий цикл містить два ребра (1,4) і (4,5) гілки, які скла­ даються з вершин 1, 2, 4. Оскільки визначення циклу ще не за­ вершено, то «зациклювати» будь-яке ребро або послідовність ребер зарано. Ребра (4,1) і (5,4) у таблиці на малюнку 108, а відсутні, тому залишається виключити ребро (5,1).

За традицією перейдемо до вершини 4 дерева розв'язку. Вартість цього переходу обмежуватиметься нижньою границею 27. Приведе­ мо таблицю (мал. 109, а): по рядках константа приведення дорівню-

 

 

1

2

3

 

 

1

2

3

5

 

2

3

-

1

 

2

3

-

1

0

 

3

1

1

-

 

3

1

1

-

0

 

5

-

0

0

 

4

-

2

3

-

 

а)

 

 

 

б)

5

0

0

0

-

'

 

 

 

Мал. 108

 

 

 

 

171

 

1

2

 

3

 

 

 

ватиме 2, а по стовпцях - 0.

 

 

 

 

 

 

 

23; 4

Сумарна вартість приведен­

2

2

-

 

о2

 

 

 

 

 

 

 

 

 

 

ня - 2, результат приведення

3

О2

 

-

 

23

27

 

 

 

 

 

 

відображений на малюнку

5

-

 

 

 

 

 

 

109, а. На цьому малюнку

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

 

визначено й вартості ризику

 

 

 

(1,4);23+4=27;2

(М)

нульових

елементів. Ребро,

 

 

 

яке має найбільший за вар­

 

 

 

27

29

 

тістю ризик виключення 2,

 

 

_jSL

 

 

знаходиться у 2-му рядку і

 

 

 

 

 

 

 

 

3-му стовпці. Це означає, що

(4,5);27+2=29;2

(4ї«)

 

можна спробувати дописати

 

29

31

 

 

 

до

шуканого циклу ребро

 

 

 

 

(2,3). Нагадаємо, що вклю­

 

^

 

 

ч__

 

 

 

 

 

 

 

чення ребра (2,3) до шукано­

 

 

 

 

 

 

(2,3)

 

 

(2тЗ)

б)

 

го

циклу

коштуватиме 2

 

 

 

(вершина

6 дерева розв'яз­

 

 

 

 

 

 

 

 

 

 

 

 

Мал. 109

 

ку), а виключення його з пе-

регляду додасть ще 2 (вершина 7 дерева розв'язку). Продовжимо по­ будову дерева розв'язку на малюнку 109, б.

Розглянемо переваги включення ребра (2,3) до шуканого цик­ лу, тобто перейдемо до вершини 6 у дереві розв'язку. Виключимо 2-й рядок і 3-й стовпець, заблокуємо ребро (3,2) як те, що може передчасно зациклити процес, і отримаємо таблицю, представле­ ну на малюнку 110, а. Спроби її приведення по рядках і стовпцях дадуть сумарну константу зі значенням 0. Визначення вартості

 

 

/

2

 

 

2

 

 

 

1

2

 

 

3

 

0"

-

 

5

0"

 

 

3

-

-

 

23; 4

5

 

-

 

б)

 

5

-

0

 

23^ 27

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

 

 

в)

 

 

 

'

 

 

 

 

 

 

 

 

 

 

 

(1,4);23+4=27;2

6W)

 

 

 

 

 

 

 

 

 

 

 

 

У 27 29

 

 

 

 

 

 

 

 

(4,5);27+2=29;2

 

 

 

 

 

 

 

 

6

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2,3);29+0=29;0

 

J2v3)

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

(3,1);29+0=29;0

 

 

 

(ЗтІ)

 

 

 

 

29^29

 

 

 

 

 

 

 

 

 

 

10

 

11

 

 

 

 

 

 

 

(5,2)~

 

 

 

 

 

г)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мал. 110

 

172

ризику для її нульових елементів так само дасть результат зі зна­ ченням 0. Отже, за умовами попередніх дій можна вибрати будьяке ребро з вартістю ризику 0 для включення його до шуканого циклу. Нехай це буде ребро (3,1). У дереві розв'язку отримаємо нову вершину 8. Подальший розгляд лівої гілки дерева розв'язку (мал. 110, г) приводить до отримання таблиці (мал. 110, б), де присутнє лише одне ребро (5,2), яке необхідно включити до цик­ лу (вершина 10 дерева розв'язку). Оцінка нижньої границі вар­ тості включення цього ребра лишається незмінною і дорівнює 29. Таким чином, проаналізувавши ліву гілку дерева розв'язку, яка привела до умови відсутності продовження пошуку, отримано та­ ку послідовність ребер, сума довжин яких становить 29: (1,4), (4,5), (2,3), (3,1), (5,2). Можна стверджувати, що вони утворюють гамільтонів цикл у заданому повному зваженому неорієнтованому графі (1,4), (4,5), (5,2), (2,3), (3,1).

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

Розглянемо останню справа гілку, тобто вершину 11 дерева розв'язку, яка одержана виключенням із розгляду ребра (5,2). До неї веде така послідовність вершин дерева: 1,2,4, 6, 8, 9. Невключення ребра (5,2) до послідовності ребер (1,4), (4,5), (2,3), (3,1) втрачає будь-який сенс, оскільки у цьому разі цикл не буде утворено.

Повертаємося до вершини 9. На цьому кроці до шуканого циклу включено ребра (1,4), (4,5), (2,3) і виключено з перегля­ ду ребро (3,1). Поточна нижня границя вартості дорівнює 29, тобто ще не перевищена довжина визначеного гамільтонового циклу. Розглянемо таблицю, представлену на малюнку 110, в, з виключеним ребром (3,1) (С3 1 = «-»). Претендентом на вклю­ чення до шуканого циклу залишається тільки ребро (5,2), але при цьому, як і попереднього разу, цикл утворено не буде. Вис­ новок такий: дерево у вершині 9 неможливо добудувати.

Піднімаємося до вершини 7. Розгляд цієї гілки так само безпер­ спективний, оскільки нижня границя переходу до неї 31 більша за значення довжини побудованого гамільтонового циклу 29.

Вершина 5 дає привід для розгляду, оскільки її нижня гра­ ниця не перевищує знайденого результату. Розглянемо табли­ цю, представлену на малюнку 108, б. її приведення показано на малюнку 111, а, б, звідки видно, що сума обох констант приве­ дення дорівнює 2. Тобто перехід до будь-якої з вершин-на- щадків вершини 5 збільшить нижню границю вартості май-

173

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

Залишилося розглянути тільки одну праву вершину З (мал. 110, г). Значення нижньої границі вартості 27 - досить непоганий привід для подальшого пошуку. Розглянемо таблицю, зображену на малюнку 110, в, і виконаємо її приведення по ряд­ ках і стовпцях (мал. 111, а, б). Результатом такого приведення є значення суми констант 4. Таким чином, перехід до лівого на­ щадка вершини 5 коштуватиме щонайменше 31. Прийняття рішення щодо розгляду цієї гілки дерева розв'язку може бути тільки таким: він безперспективний, оскільки на першому ж кроці нижня границя вартості гамільтонового циклу 31 (27 + 4 = = 31) вже перевищила знайдену 29, а з урахуванням вартості ризику виключення ребра (4,1) (мал. 111, в) ще збільшить її на 4.

 

1

2

3

4

5

тіп

 

1

2

3

4

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

-

3

1

-

0

0

1

-

3

1

-

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

5

-

1

6

0

0

2

5

-

1

6

0

 

 

 

 

 

 

 

 

 

 

 

 

 

3

3

3

1

-

7

0

0

3

3

1

-

7

0

&

 

 

 

 

 

 

 

 

 

 

 

 

 

в

4

0

4

5

-

2

0

4

0

4

5

-

2

St

 

 

 

 

 

 

 

 

 

 

 

 

 

о

5

2

0

0

4

-

0

5

2

0

0

4

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сума приведення

0

тіп

0

0

0

4

0

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

б)

 

 

 

 

 

 

Мал. 111

 

1

2

3

4

5

 

 

 

 

 

 

 

1

-

3

1

-

0

і

 

 

 

 

 

 

 

2

5

 

1

2

0

і

 

 

 

 

 

 

 

3

3

1

-

3

0

і

 

 

 

 

 

 

4

6*

1

%

-

2

5

2

0 і

0і

0 2

| -

 

в)

Таким чином, можна визнати факт, що знайдено розв'язок задачі про комівояжера вартістю 29, яка складається з таких ребер: (1,4), (4,5), (5,2), (2,3), (3,1). Ця відповідь повністю збігається з визначеною раніше.

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

1.Задати матрицю суміжності досліджуваного повного гра­ фа А, що складається з N вершин.

2.ЯкщоЛ^= 1 іА1 д = 0, то перейти до п. 9.

3.Привести задану таблицю по рядках і стовпцях і визначи­ ти сумарну константу приведення.

4.Визначити вартість шуканого гамільтонового циклу на даному кроці, додавши сумарну константу приведення.

5.Обчислити вартість ризику кожного нульового ребра, що відображено у таблиці.

6.Визначити нульове ребро з максимальним ризиком.

7.Розглянути випадок, коли ребро з максимальною вартіс­ тю ризику включається до шуканого циклу: дописати ребро з максимальною вартістю ризику до списку ребер, що утворюють

174

шуканий цикл; вилучити рядок і стовпець, на перетині яких знаходиться зазначене ребро; перейти до п. 2.

8.Розглянути випадок, коли ребро з максимальною вартіс­ тю ризику виключається із подальшого перегляду: збільшити поточне значення вартості шуканого гамільтонового циклу на значення вартості ризику ребра, що вилучається; заблокувати це ребро у таблиці суміжності; перейти до п. 2.

9.Дописати ребро, що відповідає елементуAjд, до списку ребер, які утворюють шуканий гамільтонів цикл з мінімальною вартістю.

10.Завершити алгоритм.

Пропонується такий варіант реалізації описаного алгоритму у вигляді програми. Для покращення читабельності програми наведені фрагменти містять «заглушки» у вигляді коментарів щодо обчислення тих або інших величин. Аналіз наведеного вище алгоритму наводить на думку щодо раціональності вико­ ристання рекурсії для його реалізації.

{Процедура, що виконує приведення поточної таблиці суміжності.} procedure reduce(a:mas; n:byte; var way:word; var way_rib: mas_w;

var item:byte);

 

 

var i, j, x, y, rib_x, rib_y: byte;

 

 

 

max, sumjnin: word;

 

 

 

begin

 

 

 

if П > 1

{Якщо розмірність таблиці більша за 1, то}

then

 

 

 

begin

 

 

 

min_const(a, n, sum_min); {визначається сумарна константа приведення;}

 

 

{визначається нульове ребро}

max_risk(a, n, max, х, у, rib_x, rib_y);

{з максимальним ризиком;}

 

 

{збільшується поточне значення}

inc(way, sum_min);

 

{вартості циклу, що будується.}

if way < m i n w a y {Якщо це значення менше від визначеного мінімального, то}

t h e n b e g i n

 

{(ліва гілка дерева розв'язку)}

 

{збільшується лічильник включених}

inc(item);

 

 

{до шуканого циклу ребер;}

way_rib[item].x := r i b x ;

{дописується визначене ребро}

way_rib[item].y := rib_y;

 

{до списку ребер.}

{Визначення ребра, що зациклює послідовність знайдених ребер і]

{присвоєння елементу таблиці, що йому відповідає значення -1.}

f o r І := 0 to П do

{Виключається рядок, що відповідає}

f o r j := у to n - 1

do

 

{визначеному ребру.}

a [ i , j ] : = a [ i , j +

1];

 

 

f o r j := 0 to П do

{Виключається стовпець, що відповідає}

f o r і := х to n - 1

do

 

{визначеному ребру;}

a[i,j] :=a[i + 1,j];

 

 

reduce(a, n - 1, way, way_rib, item);

{перехід до розгляду}

e n d ;

 

{таблиці зменшеної розмірності.}

{Збільшення поточного значення вартості циклу}

inc(way, max);

{на значення максимального ризику.}

if way < m i n w a y {Якщо це значення менше від визначеного мінімального, то}

175

t h en begin

{{права гілка дерева розв 'язку)}

a[rib_x, rib_y] := - 1 ;

{блокування ребра;}

reduce(a, n, way, w a y r i b , item); {перехіддо розгляду таблиці}

end;

{з виключеним ребром.}

end

 

 

else begin

{У разі зменшення таблиці до одного елемента:}

if way < тігпл/ау{якщо значення отриманого циклу менше за мінімальне, то}

then begin

 

 

m i n w a y := way;

{запам'ятати це значення;}

 

inc(item); {збільшити лічильник кількості ребер у шуканому циклі;}

 

 

{дописати ребро до списку ребер,}

 

way_nbptem]j<:=а[1,0];

{що утворюють гамільтонів цикл}

 

way_rib[item].y :=а[0,1];

{з мінімальним значенням.}

 

end;

 

end;

 

 

end;

 

 

Основна частина програми:

 

for І := 1 to n do

{Введення таблиці суміжності, що описує заданий граф.}

for j := 1 to n do read(f_in, c[i, j]);

for і := 1 to n do c[i, 0] := і;{Введення додаткового стовпця з нумерацією вершин.} for j := 1 to n do C[0, j] := j; {Введення додаткового рядка з нумерацією вершин.}

for і := 1 to n do с[і, і] := - 1 ;

{Блокування ребер (/', /').}

min_way := 65535; way := 0; item := 0;

{Ініціалізація початку розв'язку задачі.}

 

{Звернення до процедури,}

reduce(c, n, way, way_rib, item);

{що визначає розв'язок задачі.}

for І := 1 to n do

{Виведення визначеного гамільтонового}

write(f_out, '(', way_rib[i].x, '", way_rib[i].y, ') ');{циклу мінімальної довжини.} writeln(f_OUt); {Виведення значення довжини} writeln(f_out, 'Minimum way=', m i n w a y ) ; {мінімального гамільтонового циклу.}

Метод гілок і границь є досить ефективним евристичним підходом до розв'язання задачі про комівояжера. Проаналізує­ мо факти, що свідчать на користь цього твердження.

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

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

176

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

Уперше метод гілок і границь був запропонований Лендом і Дойгом у 1960 р. для розв'язування загальної задачі цілочисло­ вого лінійного програмування. У 1963 р. Літтл, Мурті, Суїні і Керел у своїй роботі запропонували застосування цього методу для розв'язання задачі про комівояжера у наведеній інтерпретації.

Однак це не єдиний спосіб застосування методу гілок і гра­ ниць для розв'язування задачі про комівояжера.

Нагадаємо алгоритм повного перебору, розглянутий у розді­ лі «NP-повні задачі». У його основі лежить алгоритм пере­ становки номерів вершин заданого графа у лексикографічному порядку. Для кожної такої перестановки визначалася сума довжин ребер, які відповідають утвореній послідовності вер­ шин. У розглянутому алгоритмі були застосовані деякі відсі­ кання зайвих дій, пов'язані з припиненням сумування у разі, якщо поточна сума перевищувала визначене на даний момент мінімальне значення довжини циклу. Користуючись новою термінологією, відсікання зайвих дій відповідає відсіканню гілок дерева розв'язку, а контроль за неперевищенням поточ­ ного мінімуму - встановлення нижньої границі вартості циклу.

А чи не можна використати ще якусь евристику, тобто збіль­ шити кількість відсікань наперед неперспективних гілок? Пропонується такий хід міркувань. Розглянемо їх на прикладі наведеного раніше алгоритму, де курсивом виділено коментарі, які стосуються змін у тексті основної частини програми:

b := a; flag := true;

 

{Ініціалізація початку перебору варіантів.}

while flag do

 

 

{Повторення перебору варіантів,}

begin

 

{поки не буде досягнуто останнього варіанта.}

permutation;

 

 

{Одержання поточної перестановки.}

sum := 0; І := 1;

{Ініціалізація одержання довжини поточного маршруту.}

while (sum < min) and (І <= П - 1) do

{Поки поточна сума менша)

begin

 

 

{за поточний мінімум,}

sum := sum + d[a[i], а[і + 1]]; {обчислення довжини поточного маршруту.}

іпс(і)

 

 

 

end;

 

 

 

if І > П - 1 {Якщо знайдена сума всіх ребер перестановки, крім останньої, то}

then begin

 

 

 

sum := sum + d [ a [ n ] , a [ 1 ] ] ; {додавання останньої ланки маршруту;}

if sum < min then

{перевірка оптимальності поточного маршруту;}

begin

 

 

 

min := sum;

{визначення оптимального поточного маршруту;}

Ь := а

 

 

{збереження послідовності об'їзду}

end;

 

 

{міст оптимального маршруту.}

end

 

 

 

177

else SOrt( І); {(УВАГА! ІДЕЯ МЕТОДУ!) інакше сортування залишку вершин]

 

{поточної перестановки за зростанням}

 

{для відсікання всіх неперспективних перестановок.}

count := 0;

{Ініціалізація визначення завершення перестановок.)

for І := 2 to П - 1 do {Починаючи з другого елемента поточної перестановки,}

if а[І] > а[І + 1 ]

{підрахунок пар сусідніх елементів,}

then inc(COunt);

{що утворюють спадну послідовність.}

if count = n - 2 then flag := false;

{Якщо всі елементи перестановок,}

end; {крім першої, утворюють спадну послідовність, то завершити алгоритм.)

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

Нехай для деякої перестановки av а2 , ..., at, ai + 1,..., an ви­ значено мінімальне значення суми довжин усіх ребер. Спочат­ ку розглянемо випадок, коли наступна перестановка дасть су­ му, більшу за визначене мінімальне значення. Така ситуація

може статися для деякого елемента послідовності at, тобто до­

давання довжини ребра (at, ai + х) перевищить знайдений поточ­

ний мінімум: d[av а2 ] + d[a2, а3 ] + ... + d[at, al + J > min. Оскіль­

ки це сталося після додавання d[ap ai +

J, то можна стверджува­

ти, що d[av a2 ] + d[a2, a3 ] + ... + d[at_v

at] sSi min. Таким чином,

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

Розглянемо дві частини поточної послідовності: av a2 , ..., at і al + j, ..., an. Перша представляє вершини графа, що утворю­ ють ребра, сума довжин яких не перевищує поточного мініму­ му, а додавання другої - перевищує його. Значить, якою не бу­ ла б послідовність елементів ai + l,..., an, додавання довжин цих ребер все одно буде перевищувати мінімум. Тому логічно буде пропустити всі перестановки цих елементів, які, як відомо, відбуваються якраз справа наліво. Остаточним варіантом пе­ рестановки значень елементів ai + v ..., an буде такий, для яко­ го виконується умова ai + 1> аі + 2> •••> ап- Тому, для того щоб не розглядати зайві перестановки елементів аі + 1, ..., ап, штуч­ но упорядкуємо їх за спаданням і продовжимо алгоритм далі.

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

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

178

якому кроці виконання алгоритму всі елементи послідовності а2 , ..., at, аі + 1, ..., ап упорядкуються за зростанням. Нагадаємо, що першим елементом послідовності є номер вершини, з якої починається об'їзд комівояжера.

А тепер підіб'ємо підсумок і остаточно визначимо, де у роз­ глянутому алгоритмі є ознаки методу гілок і границь. По-перше, це можливість відкидання наперед неперспективних пере­ становок елементів (гілок), що є номерами вершин графа. Подруге, критерієм оцінювання ситуації щодо відкидання пере­ становок елементів at + j>, ..., ап є значення поточного мінімуму (нижня границя). Евристичні підходи до розробки такого алго­ ритму базуються на ідеї скасування всіх перестановок елементів, що належать фрагменту аі + 1, ..., ап, як ті, що не дадуть покра­ щання результату при врахуванні довжин відповідних їм ребер.

Точних оцінок ефективності роботи методу гілок і границь на разі не існує. Однак слід зазначити, що на сучасних комп'ю­ терах більшість задач про комівояжера із застосуванням цього методу можна розв'язати і для кількості вершин, що сягає зна­ чення 100.

Щодо тестування цих алгоритмів, то порада буде такою: корисно перевірити їх роботу на тих самих тестах, на яких пе­ ревірялися інші методи, рекомендовані для розв'язання задачі про комівояжера.

Завдання

1.Розробити та реалізувати у вигляді програми алгоритм ви­ значення наближеного розв'язку задачі про комівояжера, використавши алгоритм Ейлера.

2.Виконати завдання 1 для повного зваженого графа з кіль­ кістю вершин N ^5. Результат виконання програми вивести у файл.

3.Виконати завдання 1 для повного зваженого графа з кіль­ кістю вершин N < 12. Результат виконання програми вивес­ ти у файл.

4.Розробити та реалізувати у вигляді програми алгоритм ви­ значення розв'язку задачі про комівояжера, використавши метод гілок і границь, що базується на ідеї приведення таб­ лиці суміжності.

5.Виконати завдання 4 для повного зваженого графа з кількістю вершин N^5. Результат виконання програми вивести у файл.

6.Виконати завдання 4 для повного навантаженого графа з кількістю вершин N ^ 12. Результат виконання програми вивести у файл.

7.Розробити та реалізувати у вигляді програми алгоритм визна­ чення розв'язку задачі про комівояжера, використавши метод гілок і границь, що базується на ідеї повного перебору варіантів.

179

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз