Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
115
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

8.2.2. Приближения в задаче коммивояжера

«Жадный» алгоритм для задачи коммивояжера является вариантом алгоритма Крускала. Здесь, как и в основном алгоритме Крускала, сначала рассматриваются самые короткие ребра. В алгоритме Крускала очередное ребро принимается в том случае, если оно не образует цикла с уже принятыми ребрами; в противном случае ребро отвергается. В случае задачи коммивояжера «критерием принятия» ребра является то, что:

– при добавлении ребра не образуется цикл, если это – не завершающее ребро в пути;

– добавляемое ребро не является третьим, выходящим из какой-либо вершины.

Совокупность ребер, выбранных в соответствии с этими условиями, образуют совокупность несоединенных путей; такое положение сохраняется до выполнения последнего шага, когда единственный оставшийся путь замыкается, образуя маршрут.

С

Табл. 8.1 Пример матрицы примыканий для задачи коммивояжера

Из\До

2

3

4

5

6

7

1

16

12

13

6

7

11

2

21

18

8

19

5

3

20

1

3

15

4

14

10

4

5

2

17

6

9

тоимость проезда между двумя городами можно задать матрицей примыканий (табл. 8.1)

Эта матрица – верхняя треугольная, поскольку стоимость проезда между городами i и j одинакова в обоих направлениях. Использование верхней матрицы позволяет упростить трассировку алгоритма.

В примере первым выбираем ребро (3,5) с минимальным весом 1. Следующим выбранным ребром будет (5,6). Затем алгоритм рассматривает ребро (3,6), однако оно будет отвергнуто, поскольку вместе с двумя уже выбранными ребрами образует цикл (3,5,6,3), не проходящий через все вершины.

Следующими будут добавлены два ребра (4,7) и (2,7). Затем рассматривается ребро (1,5), но оно будет отвергнуто, поскольку это третье ребро, выходящее из вершины 5 (уже выбраны ребра (3,5), (5,6)).

Добавляем ребро (1,6) (отбросив при этом ребра (2,5), (6,7), (4,6), (1,7) – как третьи ребра из вершин, и ребро (1,3), дающее цикл (3-5,5-6,6-1,1-3), не захватывающий все города).

По этому принципу на следующем шаге добавляется ребро (1,4). И, наконец, ребро (2,3).

В результате получается циклический путь (2,3,5,6,1,4,7,2), или, если стартовать из первой вершины, (1,4,7,2,3,5,6,1), стоимость которого равна 53.

Это не оптимальное решение: есть, по крайней мере, один более короткий путь (1,4,7,2,5,3,6,1), полная длина которого 41.