130 7. Задача коммивояжера
ния «хорошего», но, возможно, не опт имального результата. Сразу же
возникает проблема: как сильно отличается найденное решение от опти-
мального? Обычно легче сконструировать быстрый алгоритм, дающий
правдоподобное решение, чем оценить его погрешность.
Рассмотрим, например, простейший алгоритм построения маршрута
коммивояжера, реализующий «жадный» алгоритм и называемый
Nearest_vertex или Ближайший сосед. В качестве начальной вершины
выбираем произвольную вершину и объявляем ее последней включен-
ной в маршрут. Далее, пусть v — последняя включенная в маршрут
вершина. Среди всех еще не включенных в маршрут вершин выбира-
ем ближайшую к v вершину w, включаем w в маршрут после вершины
v и объявляем w последней включенной вершиной. Если все вершины
включены в маршрут, то возвращаемся в исходную вершину.
Изложенный алгоритм легко реализовать так, чтобы он имел слож-
ность O(n
2
). Понятно, что этот алгоритм иногда может находить опти-
мальный маршрут, но так будет далеко не всегда. Оценку возможной
ошибки дает следующая
Теорема 7.1. Пусть G = (V, E, c) — полный взвешенный граф, мат-
рица весов которого неотрицательна и удовлетворяет неравенству
треугольника. Пусть Nvt(G) — маршрут коммивояжера, построен-
ный алгоритмом Nearest_vertex, Opt(G) — оптимальный маршрут,
а c(Nvt(G)) и c(Opt(G)) — их веса. Тогда
c(Nvt(G)) 6
1
2
(blog nc + 1) · c(Opt(G)).
Доказательство данной теоремы можно найти в [46]. Эта теорема
дает только в ерхнюю оценку отношения веса решения Nvt(G) к весу
оптимального решения Opt(G) и не говорит о том, насколько плохим
на самом деле может быт ь такое отношение. Имеются примеры гра-
фов, для которых оно больше чем
1
3
log n. Таким образом, алгоритм
Nearest_vertex может иногда давать решения очень далекие от опти-
мальных.
Однако, можно получить лучшие результаты, используя чуть более
искусную стратегию. Так алгоритм Nearest_insert или Ближайшая
вставка, начиная с “цикла”, состоящего из одной вершины, шаг за ша-
гом наращивает растущий цикл в полном графе до тех пор, пока он не