Решение задачи коммивояжера методом ветвей и границ

курсовая работа

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

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

Табл.1

j

i

1

2

3

4

5

6

1

?

7

16

21

2

17

2

13

?

21

15

43

23

3

25

3

?

31

17

9

4

13

10

27

?

33

12

5

9

2

19

14

?

51

6

42

17

5

9

23

?

1) Справа к таблице присоединяем столбец Ui, в котором записываем минимальные элементы соответствующих строк. Вычитаем элементы Ui из соответствующих элементов строки матрицы.

j

i

1

2

3

4

5

6

Ui

1

?

7

16

21

2

17

2

2

13

?

21

15

43

23

13

3

25

3

?

31

17

9

3

4

13

10

27

?

33

12

10

5

9

2

19

14

?

51

2

6

42

17

5

9

23

?

5

2) Внизу полученной матрицы присоединяем строку Vj, в которой записываем минимальные элементы столбцов. Вычитаем элементы Vj из соответствующих столбцов матрицы.

j

i

1

2

3

4

5

6

1

?

5

14

19

0

15

2

0

?

8

2

30

10

3

22

0

?

28

14

6

4

3

0

17

?

23

2

5

7

0

17

12

?

49

6

37

12

0

4

18

?

Vj

0

0

0

2

0

2

3) В результате вычислений получаем матрицу, приведенную по строкам и столбцам, которая изображена в виде таблицы 2.

Табл.2

j

i

1

2

3

4

5

6

1

?

5

14

17

019

13

2

03

?

8

02

30

8

3

22

04

?

26

14

4

4

3

00

17

?

23

04

5

7

07

17

10

?

47

6

37

12

08

2

18

?

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

Таким образом, нижней границей множества всех гамильтоновых контуров будет число

5) Находим степени нулей полностью приведенной матрицы. Для этого как бы заменяем в ней все нули на знак «?» и устанавливаем сумму минимальных элементов соответствующей строки и столбца. Степени нулей записаны в правых верхних углах клеток, для которых .

6) Определяем максимальную степень нуля. Она равна 19 и соответствует клетке (1;5). Таким образом, претендентом на включение в гамильтонов контур является дуга (1;5).

7) Разбиваем множество всех гамильтоновых контуров на два: и . Матрицу с дугой (1;5) получаем табл.2 путем вычеркивания строки 1 и столбца 5. Чтобы не допускать образования негамильтонова контура, заменяем элемент (5;1) на знак «?».

j

i

1

2

3

4

6

2

0

?

8

0

8

3

22

0

?

26

4

4

3

0

17

?

0

5

?

0

17

10

47

6

37

12

0

2

?

8) Матрицу гамильтоновых контуров получим из таблицы 2 путем замены элемента (1;5) на знак «?».

j

i

1

2

3

4

5

6

1

?

5

14

17

?

13

5

2

0

?

8

0

30

8

3

22

0

?

26

14

4

4

3

0

17

?

23

0

5

7

0

17

10

?

47

6

37

12

0

2

18

?

14

9) Делаем дополнительное приведение матрицы контуров : = 0. Нижняя граница множества равна .

10) Находим константу приведения для множества контуров

:

Следовательно, нижняя граница множества равна

11) Сравниваем нижние границы подмножеств и . Так как

то дальнейшему ветвлению подвергаем множество .

На рис.1 представлено ветвление по дуге (1;5).

Рис.1

Переходим к ветвлению подмножества . Его приведенная матрица представлена в таблице ниже.

j

i

1

2

3

4

6

2

03

?

8

02

8

3

22

04

?

26

4

4

3

00

17

?

04

5

?

010

17

10

47

6

37

12

010

2

?

12) Узнаем степени нулей матрицы. Претендентами на включение в гамильтонов контур будут несколько дуг (5;2) и (6;3). Для дальнейших расчетов выберем дугу (6;3). Разбиваем множество на два подмножества: и (табл. 3 и 4). Чтобы не допустить образования негамильтонова контура, в таблице 3 заменяем элемент (3;6) на знак «?»

Табл.3

j

i

1

2

4

6

2

0

?

0

8

3

22

0

26

?

4

3

0

?

0

5

?

0

10

47

Табл.4

j

i

1

2

3

4

6

2

0

?

8

0

8

3

22

0

?

26

4

4

3

0

17

?

0

5

?

0

17

10

47

6

37

12

?

2

?

2

8

Определим константы приведения для этих матриц

,

Следовательно

,

Так как , то дальнейшему ветвлению подлежит подмножество . Находим степени нулей матрицы.

j

i

1

2

4

6

2

03

?

02

8

3

22

022

26

?

4

3

00

?

08

5

?

010

10

47

Претендентом к включению в гамильтонов контур станет дуга (3;2). Разбиваем множество на два и .

j

i

1

4

6

2

0

0

8

4

3

?

0

5

?

10

47

10

j

i

1

2

4

6

2

0

?

0

8

3

22

?

26

?

22

4

3

0

?

0

5

?

0

10

47

Очевидно

,

Следовательно, очередному ветвлению нужно подвергнуть подмножество .

Переходим к ветвлению подмножества . Определяем степени нулей. Претендентом на включение в гамильтонов контур является дуга (5;4). Разбиваем множество на два подмножества: и .

Находим нижние границы

,

Следовательно, очередному ветвлению нужно подвергнуть подмножество . Но его матрица имеет размерность . Поэтому в гамильтонов контур следует включить дуги, соответствующие в матрице нулевым элементам.

Определим полученный гамильтонов контур. В него вошли дуги

Длина контура равна

Так как границы оборванных ветвей больше длины контура 1 - 5 - 4 - 6 - 3 - 2 - 1, то этот контура имеет наименьшую длину.

алгоритм крускал коммивояжер

Рис.25

Выводы

Задача коммивояжера является частичным случаем гамильтоновой задачи о путешественнике. Суть задачи коммивояжера состоит в нахождении суммарной минимальной характеристики (расстояния, стоимости проезда и т.д.), при этом коммивояжер должен пройти все n городов по одному разу, вернувшись в тот город, с которого начал.

Существуют несколько методов решения задачи коммивояжера: метод полного перебора, с помощью метода ветвей и границ (алгоритм Литтла), алгоритма Крускала, «деревянного» алгоритма и т.д. Однако только метод ветвей и границ дает нам в итоге самое оптимальное решение.

Основная идея метода Литтла состоит в том, что вначале строят нижнюю границу длин маршрутов для всего множества гамильтоновых контуров . Затем все множество контуров разбивают на два подмножества таким образом, чтобы первое подмножество состояло из гамильтоновых контуров, содержащих некоторую дугу (i,j), а другое подмножество не содержало этой дуги.

Для практической реализации идеи метода ветвей и границ применительно к задаче коммивояжера нужно найти метод определения нижних границ подмножества и разбиения множества гамильтоновых контуров на подмножества (ветвление). Такое определение нижних границ базируется на том утверждении, что если ко всем элементам i-й строки или j-го столбца матрицы C прибавить или отнять число , то задача останется эквивалентной прежней, то есть оптимальность маршрута коммивояжера не изменится, а длина любого гамильтонова контура изменится на данную величину .

Используя ЭВМ, методом ветвей и границ можно решить задачи коммивояжера для .

6. Список использованной литературы

1. О. Е. Акимов «Дискретная математика. Логика, группы, графы», Москва, 2003, 376 с., ил., изд. дом «Лаборатория базовых знаний».

2. Ф. А. Новиков «Дискретная математика для программистов» С.-Петербург, 2002 г. 304 с., ил., изд. дом «Питер».

3. В. М. Бондарев «Основы программирования» 1998 г., 368 с. изд. дом «Феникс»

Делись добром ;)