komivoyazhera
.docxИмеется необходимость посетить n городов в ходе деловой поездки. Спланировать поездку нужно так, чтобы, переезжая из города в город, побывать в каждом не более одного раза и вернуться в исходный город. Определить оптимальный маршрут посещения городов и его минимальное расстояние. Задана матрица расстояний между городами cij.
Решение проводим с помощью калькулятора Решение задачи коммивояжера. Возьмем в качестве произвольного маршрута: X0 = (1,2);(2,3);(3,4);(4,5);(5,6);(6,7);(7,1) Тогда F(X0) = 20 + 20 + 16 + 9 + 21 + 18 + 12 = 116 Для определения нижней границы множества воспользуемся операцией редукции или приведения матрицы по строкам, для чего необходимо в каждой строке матрицы D найти минимальный элемент. di = min(j) dij
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
di |
1 |
M |
20 |
20 |
16 |
13 |
16 |
20 |
13 |
2 |
18 |
M |
20 |
16 |
12 |
13 |
18 |
12 |
3 |
16 |
14 |
M |
16 |
M |
21 |
14 |
14 |
4 |
16 |
9 |
14 |
M |
9 |
19 |
22 |
9 |
5 |
M |
12 |
19 |
20 |
M |
21 |
12 |
12 |
6 |
11 |
11 |
22 |
22 |
14 |
M |
18 |
11 |
7 |
12 |
12 |
9 |
M |
16 |
15 |
M |
9 |
Затем вычесть его из элементов рассматриваемой строки. В связи с этим во вновь полученной матрице в каждой строке будет как минимум один ноль.
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
M |
7 |
7 |
3 |
0 |
3 |
7 |
2 |
6 |
M |
8 |
4 |
0 |
1 |
6 |
3 |
2 |
0 |
M |
2 |
M |
7 |
0 |
4 |
7 |
0 |
5 |
M |
0 |
10 |
13 |
5 |
M |
0 |
7 |
8 |
M |
9 |
0 |
6 |
0 |
0 |
11 |
11 |
3 |
M |
7 |
7 |
3 |
3 |
0 |
M |
7 |
6 |
M |
Затем такую же операцию редукции проводим по столбцам, для чего в каждом столбце находим минимальный элемент: d j = min(i) dij
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
M |
7 |
7 |
3 |
0 |
3 |
7 |
2 |
6 |
M |
8 |
4 |
0 |
1 |
6 |
3 |
2 |
0 |
M |
2 |
M |
7 |
0 |
4 |
7 |
0 |
5 |
M |
0 |
10 |
13 |
5 |
M |
0 |
7 |
8 |
M |
9 |
0 |
6 |
0 |
0 |
11 |
11 |
3 |
M |
7 |
7 |
3 |
3 |
0 |
M |
7 |
6 |
M |
dj |
0 |
0 |
0 |
2 |
0 |
1 |
0 |
После вычитания минимальных элементов получаем полностью редуцированную матрицу, где величины di, dj называются константами приведения.
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
M |
7 |
7 |
1 |
0 |
2 |
7 |
2 |
6 |
M |
8 |
2 |
0 |
0 |
6 |
3 |
2 |
0 |
M |
0 |
M |
6 |
0 |
4 |
7 |
0 |
5 |
M |
0 |
9 |
13 |
5 |
M |
0 |
7 |
6 |
M |
8 |
0 |
6 |
0 |
0 |
11 |
9 |
3 |
M |
7 |
7 |
3 |
3 |
0 |
M |
7 |
5 |
M |
Сумма констант приведения определяет нижнюю границу H: H = 13+12+14+9+12+11+9+0+0+0+2+0+1+0 = 83 Элементы матрицы dij соответствуют расстоянию от пункта i до пункта j. Поскольку в матрице n городов, то D является матрицей nxn с неотрицательными элементами d ij >=0 Каждый допустимый маршрут представляет собой цикл, по которому коммивояжер посещает город только один раз и возвращается в исходный город. Длина маршрута определяется выражением: Причем каждая строка и столбец входят в маршрут только один раз с элементом dij . Определяем ребро ветвления и разобьем все множество маршрутов относительно этого ребра на два подмножества (i,j) и (i*,j*). С этой целью для всех клеток матрицы с нулевыми элементами заменяем поочередно нули на М(бесконечность) и определяем для них сумму образовавшихся констант приведения, они приведены в скобках.
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
di |
1 |
M |
7 |
7 |
1 |
0(1) |
2 |
7 |
1 |
2 |
6 |
M |
8 |
2 |
0(0) |
0(2) |
6 |
0 |
3 |
2 |
0(0) |
M |
0(1) |
M |
6 |
0(0) |
0 |
4 |
7 |
0(0) |
5 |
M |
0(0) |
9 |
13 |
0 |
5 |
M |
0(0) |
7 |
6 |
M |
8 |
0(0) |
0 |
6 |
0(2) |
0(0) |
11 |
9 |
3 |
M |
7 |
0 |
7 |
3 |
3 |
0(8) |
M |
7 |
5 |
M |
3 |
dj |
2 |
0 |
5 |
1 |
0 |
2 |
0 |
0 |
d(1,5) = 1 + 0 = 1; d(2,5) = 0 + 0 = 0; d(2,6) = 0 + 2 = 2; d(3,2) = 0 + 0 = 0; d(3,4) = 0 + 1 = 1; d(3,7) = 0 + 0 = 0; d(4,2) = 0 + 0 = 0; d(4,5) = 0 + 0 = 0; d(5,2) = 0 + 0 = 0; d(5,7) = 0 + 0 = 0; d(6,1) = 0 + 2 = 2; d(6,2) = 0 + 0 = 0; d(7,3) = 3 + 5 = 8; Наибольшая сумма констант приведения равна (3 + 5) = 8 для ребра (7,3), следовательно, множество разбивается на два подмножества (7,3) и (7*,3*). Нижняя граница гамильтоновых циклов этого подмножества: H(7*,3*) = 83 + 8 = 91 Исключение ребра (7,3) проводим путем замены элемента d73 = 0 на M, после чего осуществляем очередное приведение матрицы расстояний для образовавшегося подмножества (7*,3*), в результате получим редуцированную матрицу.
i j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
di |
1 |
M |
7 |
7 |
1 |
0 |
2 |
7 |
0 |
2 |
6 |
M |
8 |
2 |
0 |
0 |
6 |
0 |
3 |
2 |
0 |
M |
0 |
M |
6 |
0 |
0 |
4 |
7 |
0 |
5 |
M |
0 |
9 |
13 |
0 |
5 |
M |
0 |
7 |
6 |
M |
8 |
0 |
0 |
6 |
0 |
0 |
11 |
9 |
3 |
M |
7 |
0 |
7 |
3 |
3 |
M |
M |
7 |
5 |
M |
3 |
dj |
0 |
0 |
5 |
0 |
0 |
0 |
0 |
8 |
Включение ребра (7,3) проводится путем исключения всех элементов 7-ой строки и 3-го столбца, в которой элемент d37 заменяем на М, для исключения образования негамильтонова цикла. В результате получим другую сокращенную матрицу (6 x 6), которая подлежит операции приведения. Сумма констант приведения сокращенной матрицы: После операции приведения сокращенная матрица будет иметь вид:
i j |
1 |
2 |
4 |
5 |
6 |
7 |
di |
1 |
M |
7 |
1 |
0 |
2 |
7 |
0 |
2 |
6 |
M |
2 |
0 |
0 |
6 |
0 |
3 |
2 |
0 |
0 |
M |
6 |
M |
0 |
4 |
7 |
0 |
M |
0 |
9 |
13 |
0 |
5 |
M |
0 |
6 |
M |
8 |
0 |
0 |
6 |
0 |
0 |
9 |
3 |
M |
7 |
0 |
dj |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Нижняя граница подмножества (7,3) равна: H(7,3) = 83 + 0 = 83 < 91 Поскольку нижняя граница этого подмножества (7,3) меньше, чем подмножества (7*,3*), то ребро (7,3) включаем в маршрут. Определяем ребро ветвления и разобьем все множество маршрутов относительно этого ребра на два подмножества (i,j) и (i*,j*). С этой целью для всех клеток матрицы с нулевыми элементами заменяем поочередно нули на М(бесконечность) и определяем для них сумму образовавшихся констант приведения, они приведены в скобках.
i j |
1 |
2 |
4 |
5 |
6 |
7 |
di |
1 |
M |
7 |
1 |
0(1) |
2 |
7 |
1 |
2 |
6 |
M |
2 |
0(0) |
0(2) |
6 |
0 |
3 |
2 |
0(0) |
0(1) |
M |
6 |
M |
0 |
4 |
7 |
0(0) |
M |
0(0) |
9 |
13 |
0 |
5 |
M |
0(0) |
6 |
M |
8 |
0(6) |
0 |
6 |
0(2) |
0(0) |
9 |
3 |
M |
7 |
0 |
dj |
2 |
0 |
1 |
0 |
2 |
6 |
0 |
d(1,4) = 1 + 0 = 1; d(2,4) = 0 + 0 = 0; d(2,5) = 0 + 2 = 2; d(3,2) = 0 + 0 = 0; d(3,3) = 0 + 1 = 1; d(4,2) = 0 + 0 = 0; d(4,4) = 0 + 0 = 0; d(5,2) = 0 + 0 = 0; d(5,6) = 0 + 6 = 6; d(6,1) = 0 + 2 = 2; d(6,2) = 0 + 0 = 0; Наибольшая сумма констант приведения равна (0 + 6) = 6 для ребра (5,7), следовательно, множество разбивается на два подмножества (5,7) и (5*,7*). Нижняя граница гамильтоновых циклов этого подмножества: H(5*,7*) = 83 + 6 = 89 Исключение ребра (5,7) проводим путем замены элемента d57 = 0 на M, после чего осуществляем очередное приведение матрицы расстояний для образовавшегося подмножества (5*,7*), в результате получим редуцированную матрицу.
i j |
1 |
2 |
4 |
5 |
6 |
7 |
di |
1 |
M |
7 |
1 |
0 |
2 |
7 |
0 |
2 |
6 |
M |
2 |
0 |
0 |
6 |
0 |
3 |
2 |
0 |
0 |
M |
6 |
M |
0 |
4 |
7 |
0 |
M |
0 |
9 |
13 |
0 |
5 |
M |
0 |
6 |
M |
8 |
M |
0 |
6 |
0 |
0 |
9 |
3 |
M |
7 |
0 |
dj |
0 |
0 |
0 |
0 |
0 |
6 |
6 |
Включение ребра (5,7) проводится путем исключения всех элементов 5-ой строки и 7-го столбца, в которой элемент d75 заменяем на М, для исключения образования негамильтонова цикла. В результате получим другую сокращенную матрицу (5 x 5), которая подлежит операции приведения. Сумма констант приведения сокращенной матрицы: После операции приведения сокращенная матрица будет иметь вид:
i j |
1 |
2 |
4 |
5 |
6 |
di |
1 |
M |
7 |
1 |
0 |
2 |
0 |
2 |
6 |
M |
2 |
0 |
0 |
0 |
3 |
2 |
0 |
0 |
M |
6 |
0 |
4 |
7 |
0 |
M |
0 |
9 |
0 |
6 |
0 |
0 |
9 |
3 |
M |
0 |
dj |
0 |
0 |
0 |
0 |
0 |
0 |