Задача коммивояжёра.ppt
- Количество слайдов: 25
Задача коммивояжёра Постановка задачи: Имеются n городов, расстояния между которыми заданы; коммивояжеру необходимо выйти из какого-то города, посетить остальные n-1 городов точно по одному разу и вернуться в исходный город. При этом маршрут коммивояжера должен быть минимальной длины (стоимости). Задача принадлежит классу NP-полных, полиномиальные алгоритмы ее решения. то есть неизвестны В задаче с n городами необходимо рассмотреть (n-1)! маршрутов, чтобы выбрать маршрут минимальной длины. Итак, при больших значениях n невозможно за разумное время получить результат.
Метод ветвей и границ Считается относительно успешным для решения многих труднорешаемых задач. Граф G = (V, E) – полный и задан матрицей весов. Будем считать, что граф является ориентированным и взвешенным, то есть сетью. Маршрутом коммивояжёра в ориентированном графе называется контур, включающий каждый узел ровно по одному разу. Для полной сети с n узлами имеется ровно (n-1)! вариантов маршрута коммивояжёра. Метод ветвей и границ является хорошим способом сокращения полного перебора.
Представим процесс построения маршрута в виде построения двоичного корневого дерева решений, в котором каждому узлу x соответствует некоторое подмножество М(х) множества всех маршрутов. Корню поставлено в соответствие множество всех маршрутов. Пусть х – некоторый узел дерева. Выберем дугу (v, w), которая входит хотя бы в один маршрут из М(х). Тогда М(х) разбивается на 2 непересекающихся множества, в одно из которых можно отнести все маршруты, содержащие дугу (v, w), а в другое – не содержащие её. Будем считать, что первое подмножество соответствует левому сыну узла х, а второе – правому. Получаем в общих чертах правило ветвления. Узел дерева решений, для которого строятся сыновья называется активным. Главное достоинство метода ветвей и границ в сравнении с полным перебором заключается в том, что активными являются лишь те узлы, в которых может содержаться оптимальный маршрут.
Правило активизации узлов, которое сводится к правилу подсчёта границ: Предположим, что для узлов дерева решений вычислено значение f(x) такое, что вес любого маршрута из множества М(х) не меньше, чем f(х). Такое число называется нижней границей или границей узла х. Правило активизации узлов: из множества узлов, не имеющих сыновей, в качестве активного выбирается узел с наименьшей нижней границей. Дерево решений прирастает за счёт сыновей активного узла. Узел, для которого построены оба сына, активным стать в дальнейшем не может.
Процесс построения дерева решений продолжается до тех пор, пока активным не будет объявлен узел, для которого множество М(х) состоит из одного маршрута, а границы всех других узлов не меньше чем вес этого маршрута. Процедуру вычитания из каждого элемента строки (соответственно столбца) минимального элемента этой же строки (столбца) называют редукцией. Процедуру, которая сначала осуществляет редукцию каждой строки, а затем по изменённой матрице редукцию всех столбцов, называют редукцией матрицы, а саму матрицу – редуцированной. При этом в каждой строке и каждом столбце имеется хотя бы один нулевой элемент.
F – сумма всех констант, использованных при редукции. Тогда f является нижней границей всех маршрутов коммивояжёра для исходной нередуцированной матрицы весов. Получили правило вычисления нижней границы корневого узла дерева решений. Правило построения нижней границы для каждого узла аналогично.
ПРИМЕР: Сеть задана матрицей весов 1 2 3 4 5 g 1 12 9 9 12 9 8 19 15 8 3 6 0 16 10 0 4 5 9 12 16 5 5 15 7 13 23 7 h 0 0 3 32 Столбец содержит минимальные элементы каждой строки Строка содержит минимальные элементы каждого столбца после того, как в каждой строке из соответствующих элементов вычли минимальный (элемент столбца g)
1 2 3 4 5 r 1 3 0 0 2 1 0 11 4 1 3 6 0 16 7 6 4 0 4 7 8 4 5 8 0 6 16 6 s 1 0 0 11 4 Получили редуцированную матрицу. Общая сумма вычтенных элементов = 32. Следовательно, любой маршрут коммивояжёра в сети G имеет вес не меньше, чем 32.
Для ветвления из корня дерева нужно выбрать дугу (v, w) и разбить всё множество маршрутов на 2 непересекающихся подмножества, в одно из которых включаются все маршруты, содержащие дугу (v, w), а в другое – не содержащие эту дугу. Выбор дуги означает, что маршруты из М(х) для левого сына х не содержат дуг, выходящих из v, и дуг, входящих в w. То есть, из матрицы весов для левого сына можно удалить строку v и столбец w. Кроме того, следует исключить возможность включения в маршрут дуги (w, v), для чего достаточно положить А[w, v] = . Таким образом, размер матрицы весов левого сына уменьшается на 1, по сравнению с матрицей весов отца. Поскольку маршруты из М(х) для правого сына х запрещают лишь использовать дугу (v, w), то все изменения в матрице весов сводятся к тому, что нужно положить А[v, w] = .
Поэтому предпочтительно находить решение, двигаясь по левым, а не по правым сыновьям. Следовательно, дуга (v, w) должна выбираться так, чтобы нижняя граница правого сына была как можно больше границы левого сына. В редуцированной матрице в столбце r (соответственно строке s) указаны вторые по величине минимальные элементы соответствующих строк (столбцов). Правило выбора дуги (v, w): выбрать тот нуль в редуцированной матрице, для которого сумма значений элементов, находящихся на пересечении строки v со столбцом r, и столбца w со строкой s, наибольшая. В матрице эта сумма является наибольшей для элемента [1, 4]. Разбиение множества всех маршрутов следует осуществить по дуге (1, 4).
Получаем следующие матрицы: 1 2 3 5 g 2 1 0 4 0 3 6 0 7 0 4 4 7 8 4 5 8 0 6 0 h 1 0 0 4 9 Исходная матрица весов левого сына
1 2 3 5 r 2 0 0 3 5 0 3 3 4 0 3 0 0 5 7 0 6 6 s 5 0 3 0 редуцированная матрица весов левого сына
1 2 3 4 5 r 3 0 0 0 5 0 2 3 1 6 4 7 0 5 4 5 s 0 8 1 4 0 0 5 5 8 4 5 1 7 6 0 4 Редуцированная матрица правого сына (вычли число 11 из четвёртого столбца)
Пусть х0 – корень, х00 – левый сын, х01 – правый. Если хк – некоторый узел дерева, где к – последовательность из 0 и 1, то левый сын получает индекс приписыванием к к значения 0, а правый – 1. Граница узла обозначена как f(x), получаем, что f(x)=32, f(x 00)=41, f(x 01)=43 После построения узлов х00 и х01 дерево решений имеет вид: Х 0 (32) (1, 4) Х 00 (41) Х 01 (43)
Поскольку узел х00 имеет границу меньше, чем узел х01, то теперь он становится активным. Выбираем дугу (5, 2), ибо 0, стоящий в строке 5 и столбце 2, имеет наибольшую сумму соответствующих ему значений в строке s и столбце r. Получаем:
1 3 5 g 1 3 5 r 2 0 0 0 3 5 3 3 3 2 0 2 4 3 0 0 4 3 0 3 h 0 0 0 3 s 2 3 0 Матрицы узлов х000 и х001 1 2 3 5 r 2 0 0 3 5 0 3 3 4 0 3 0 0 5 1 0 1 s 1 0 0 0
Редукция матрицы х001 состояла лишь в вычитании числа 6 из последней строки. Для нижних границ имеем равенства f(x 000) = 44, f(x 001) = 47. Х 0 (32) (1, 4) Х (41) Х 00 (41) Х 01 (43) 00 (5, 2) Х 000 (44) Х 001 (47)
Активным становится узел х01 (имеет наименьшую границу). В матрице (см. предыдущие матрицы) 1 2 3 4 5 r 1 3 0 0 0 2 1 0 0 4 0 3 6 0 5 7 5 4 0 4 7 8 4 5 8 0 6 5 5 s 1 0 0 5 4 Сразу несколько 0 имеют одинаковую сумму соответствующих элементов. Выберем для разбиения дугу (3, 2).
Нередуцированные матрицы сыновей узла х01 имеют вид: 1 2 3 4 5 g 1 3 0 0 0 2 1 0 0 4 0 3 6 0 5 7 5 4 0 4 7 8 0 5 8 0 6 5 0 h 0 0 0 5 1 3 4 5 g 1 0 0 0 2 1 0 4 0 7 8 0 5 8 6 5 5 h 0 0 5 Матрицы узлов х010 и х011
Получаем f(x 010) = 48 и f(x 011) = 48. Следующим активным становится узел х000, редуцированная матрица которого имеет вид (см. ранее): 1 3 5 r 2 0 0 0 3 2 4 3 0 3 s 2 3 0 В этой матрице 2 равноценных претендента : дуга (2, 3) и дуга (4, 5). Выберем для разбиения дугу (4, 5).
Получаем матрицы узлов х0000 и х0001: 1 2 3 0 1 3 5 2 0 0 3 2 0 4 3 3 0 В первой матрице элемент (2, 1) равен . Дело в том, что все маршруты в М(х0000) содержат дуги (1, 4) и (5, 2) и (4, 5). Никакой маршрут коммивояжёра теперь не может содержать дугу (2, 1). По этой причине элемент (2, 1) в матрице приравнен . Эта матрица в каждой строке и каждом столбце содержит 0 и не нуждается в редукции. Следовательно, f(x 0000) = f(x 000) = 44
Для второй матрицы редукция сводится к вычитанию числа 3 из строки 4. Имеем равенство f(x 0001) = 47. Наконец, активным становится узел х0000, матрица которого имеет вид: 1 3 2 0 3 0 Здесь выбор дуги не играет никакой роли. Есть только 2 возможности. Или сначала выбрать дугу (2, 3) и, проводя разбиение по ней, на следующем шаге выбрать (3, 1), или наоборот.
Важным здесь является лишь то, что при переходе к сыновьям границы левых сыновей не меняются, левые сыновья становятся активными. Границы правых сыновей и в том, и в другом случае равны , что означает отсутствие соответствующих маршрутов коммивояжёра. Дерево решений будет иметь вид:
Х 0 (32) (1, 4) Х 00 (41) Х 01 (43) (5, 2) Х 000 (44) (4, 5) Х 0000 (44) Х 0001 (47) (2, 3) Х 00000 (44) Х 00001 ( ) (3, 1) Х 000000 (44) Х 000001 ( ) Х 010 (48) Х 001 (47) (3, 2) Х 011 (48)
Поскольку активным теперь следует объявить узел, содержащий один единственный маршрут, то алгоритм на этом заканчивает свою работу. Оптимальным в заданном графе является маршрут 1 -4 -5 -2 -3 -1, вес которого = 44.


