DAA - Задача коммивояжера
Постановка задачи
Путешественнику необходимо посетить все города из списка, где известны расстояния между всеми городами, и каждый город нужно посетить только один раз. Каков самый короткий маршрут, по которому он посетит каждый город ровно один раз и вернется в исходный город?
Решение
Задача коммивояжера - самая известная вычислительная задача. Мы можем использовать метод грубой силы, чтобы оценить каждый возможный тур и выбрать лучший. Заn количество вершин в графе, есть (n - 1)! количество возможностей.
Вместо перебора с использованием подхода динамического программирования решение может быть получено за меньшее время, хотя нет алгоритма с полиномиальным временем.
Рассмотрим граф G = (V, E), где V это набор городов и Eпредставляет собой набор взвешенных ребер. Крайe(u, v) представляет, что вершины u а также vподключены. Расстояние между вершинамиu а также v является d(u, v), который должен быть неотрицательным.
Предположим, мы начали в городе 1 и после посещения некоторых городов теперь мы в городе j. Следовательно, это частичный тур. Нам обязательно нужно знатьj, поскольку от этого будет зависеть, какие города наиболее удобно посетить в следующий раз. Нам также необходимо знать все города, которые мы посетили до сих пор, чтобы мы не повторяли ни один из них. Следовательно, это подходящая подзадача.
Для подмножества городов S Є {1, 2, 3, ... , n} это включает 1, и j Є S, позволять C(S, j) быть длиной кратчайшего пути, посещающего каждый узел в S ровно один раз, начиная с 1 и заканчивая j.
Когда |S| > 1, определимC(S, 1) = ∝, поскольку путь не может начинаться и заканчиваться в 1.
Теперь позвольте выразить C(S, j)с точки зрения более мелких подзадач. Нам нужно начать с1 и закончить в j. Мы должны выбрать следующий город таким образом, чтобы
$$ C (S, j) = min \: C (S - \ lbrace j \ rbrace, i) + d (i, j) \: где \: i \ in S \: и \: i \ neq jc ( S, j) = minC (s- \ lbrace j \ rbrace, i) + d (i, j) \: где \: i \ in S \: и \: i \ neq j $$
Algorithm: Traveling-Salesman-Problem
C ({1}, 1) = 0
for s = 2 to n do
for all subsets S Є {1, 2, 3, … , n} of size s and containing 1
C (S, 1) = ∞
for all j Є S and j ≠ 1
C (S, j) = min {C (S – {j}, i) + d(i, j) for i Є S and i ≠ j}
Return minj C ({1, 2, 3, …, n}, j) + d(j, i)
Анализ
Существует не более $ 2 ^ nn $ подзадач, и каждая из них требует линейного времени для решения. Следовательно, общее время работы составляет $ O (2 ^ nn ^ 2) $.
пример
В следующем примере мы проиллюстрируем шаги для решения задачи коммивояжера.
Из приведенного выше графика подготовлена следующая таблица.
1 | 2 | 3 | 4 | |
1 | 0 | 10 | 15 | 20 |
2 | 5 | 0 | 9 | 10 |
3 | 6 | 13 | 0 | 12 |
4 | 8 | 8 | 9 | 0 |
S = Φ
$$ \ small Cost (2, \ Phi, 1) = d (2,1) = 5 \ small Cost (2, \ Phi, 1) = d (2,1) = 5 $$
$$ \ small Cost (3, \ Phi, 1) = d (3,1) = 6 \ small Cost (3, \ Phi, 1) = d (3,1) = 6 $$
$$ \ small Cost (4, \ Phi, 1) = d (4,1) = 8 \ small Cost (4, \ Phi, 1) = d (4,1) = 8 $$
S = 1
$$ \ small Cost (i, s) = min \ lbrace Cost (j, s - (j)) + d [i, j] \ rbrace \ small Cost (i, s) = min \ lbrace Cost (j, s ) - (j)) + d [i, j] \ rbrace $$
$$ \ small Cost (2, \ lbrace 3 \ rbrace, 1) = d [2,3] + Cost (3, \ Phi, 1) = 9 + 6 = 15cost (2, \ lbrace3 \ rbrace, 1) = d [2,3] + стоимость (3, \ Phi, 1) = 9 + 6 = 15 $$
$$ \ small Cost (2, \ lbrace 4 \ rbrace, 1) = d [2,4] + Cost (4, \ Phi, 1) = 10 + 8 = 18cost (2, \ lbrace4 \ rbrace, 1) = d [2,4] + стоимость (4, \ Phi, 1) = 10 + 8 = 18 $$
$$ \ small Cost (3, \ lbrace 2 \ rbrace, 1) = d [3,2] + Cost (2, \ Phi, 1) = 13 + 5 = 18cost (3, \ lbrace2 \ rbrace, 1) = d [3,2] + стоимость (2, \ Phi, 1) = 13 + 5 = 18 $$
$$ \ small Cost (3, \ lbrace 4 \ rbrace, 1) = d [3,4] + Cost (4, \ Phi, 1) = 12 + 8 = 20cost (3, \ lbrace4 \ rbrace, 1) = d [3,4] + стоимость (4, \ Phi, 1) = 12 + 8 = 20 $$
$$ \ small Cost (4, \ lbrace 3 \ rbrace, 1) = d [4,3] + Cost (3, \ Phi, 1) = 9 + 6 = 15cost (4, \ lbrace3 \ rbrace, 1) = d [4,3] + стоимость (3, \ Phi, 1) = 9 + 6 = 15 $$
$$ \ small Cost (4, \ lbrace 2 \ rbrace, 1) = d [4,2] + Cost (2, \ Phi, 1) = 8 + 5 = 13cost (4, \ lbrace2 \ rbrace, 1) = d [4,2] + стоимость (2, \ Phi, 1) = 8 + 5 = 13 $$
S = 2
$$ \ small Cost (2, \ lbrace 3, 4 \ rbrace, 1) = \ begin {cases} d [2, 3] + Cost (3, \ lbrace 4 \ rbrace, 1) = 9 + 20 = 29 \ \ d [2, 4] + Стоимость (4, \ lbrace 3 \ rbrace, 1) = 10 + 15 = 25 = 25 \ small Стоимость (2, \ lbrace 3,4 \ rbrace, 1) \\\ lbrace d [ 2,3] + \ small cost (3, \ lbrace4 \ rbrace, 1) = 9 + 20 = 29d [2,4] + \ small Cost (4, \ lbrace 3 \ rbrace, 1) = 10 + 15 = 25 \ end {case} = 25 $$
$$ \ small Cost (3, \ lbrace 2, 4 \ rbrace, 1) = \ begin {cases} d [3, 2] + Cost (2, \ lbrace 4 \ rbrace, 1) = 13 + 18 = 31 \ \ d [3, 4] + Стоимость (4, \ lbrace 2 \ rbrace, 1) = 12 + 13 = 25 = 25 \ small Стоимость (3, \ lbrace 2,4 \ rbrace, 1) \\\ lbrace d [ 3,2] + \ small cost (2, \ lbrace4 \ rbrace, 1) = 13 + 18 = 31d [3,4] + \ small Cost (4, \ lbrace 2 \ rbrace, 1) = 12 + 13 = 25 \ end {case} = 25 $$
$$ \ small Cost (4, \ lbrace 2, 3 \ rbrace, 1) = \ begin {cases} d [4, 2] + Cost (2, \ lbrace 3 \ rbrace, 1) = 8 + 15 = 23 \ \ d [4, 3] + Стоимость (3, \ lbrace 2 \ rbrace, 1) = 9 + 18 = 27 = 23 \ small Стоимость (4, \ lbrace 2,3 \ rbrace, 1) \\\ lbrace d [ 4,2] + \ small cost (2, \ lbrace3 \ rbrace, 1) = 8 + 15 = 23d [4,3] + \ small Cost (3, \ lbrace 2 \ rbrace, 1) = 9 + 18 = 27 \ end {case} = 23 $$
S = 3
$$ \ small Cost (1, \ lbrace 2, 3, 4 \ rbrace, 1) = \ begin {cases} d [1, 2] + Cost (2, \ lbrace 3, 4 \ rbrace, 1) = 10 + 25 = 35 \\ d [1, 3] + Стоимость (3, \ lbrace 2, 4 \ rbrace, 1) = 15 + 25 = 40 \\ d [1, 4] + Стоимость (4, \ lbrace 2, 3 \ rbrace, 1) = 20 + 23 = 43 = 35 cost (1, \ lbrace 2,3,4 \ rbrace), 1) \\ d [1,2] + cost (2, \ lbrace 3,4 \ rbrace , 1) = 10 + 25 = 35 \\ d [1,3] + стоимость (3, \ lbrace 2,4 \ rbrace, 1) = 15 + 25 = 40 \\ d [1,4] + стоимость (4 , \ lbrace 2,3 \ rbrace, 1) = 20 + 23 = 43 = 35 \ end {case} $$
Минимальная стоимость пути - 35.
Начать со стоимости {1, {2, 3, 4}, 1}, получаем минимальное значение для d [1, 2]. когдаs = 3, выберите путь от 1 до 2 (стоимость 10), затем вернитесь назад. когдаs = 2, получаем минимальное значение для d [4, 2]. Выберите путь от 2 до 4 (стоимость 10), затем вернитесь назад.
когда s = 1, получаем минимальное значение для d [4, 3]. Выбрав путь с 4 по 3 (стоимость 9), мы перейдем кs = Φшаг. Получаем минимальное значение дляd [3, 1] (стоимость 6).