Замечание
Поскольку данный алгоритм является эвристическим, найденное решение будет зависеть от выбора начальной вершины. Например, если выбрать начальную вершину b, то алгоритм дает следующее решение:
Алгоритм нахождения нижней границы проблемы путешествующего купца:
Выбрать у взвешенного полносвязного графа вершину VS и удалить её из графа вместе с инцидентными к ней рёбрами.
Найти минимальное каркасное дерево T, соединяющее оставшиеся вершины и подсчитать общий вес дерева w (для этой цели использовать алгоритм Крускала или метод Прима).
Найти два наименьших веса, w1 и w2, рёбер, инцидентных с VS. Тогда w+w1+ w2 является нижней границей решения проблемы путешествующего купца.
Пример
a
a
7
1
d
Находим минимальное каркасное дерево Т:
Два ребра с наименьшими весами, инцидентные вершине а:
w1=w(a,e)=2,
w2 =w(a,c)=4.
5. Нижняя граница решения проблемы ТСР
w+ w1+ w2=16+2+4=22.
Замечание
Как и для случая оценки верхней границы, величина оценки нижней границы зависит от выбора вершины VS. Например, если взять VS=d, то получим:
Это решение замечательно тем, что верхняя и нижняя границы совпали! Следовательно, точное решение проблемы ТСР=26.
Кратчайшие пути во взвешенных
графах и орграфах
Определения
Задан граф G=(V,E) или орграф D=(V,A) с функцией веса w:E→R (или w:A→R).
Вес w(P) пути
P=(v0,e0,v1,e1,…,vk-1,ek-1,vk)
Определяется как сумма весов ребер (дуг) пути:
w(P)=
w(ei).
Путь между вершинами u и v будет кратчайшим (минимальным), если его вес будет наименьшим по сравнению с другими возможными путями между этими вершинами:
δ(u,v)= min
wi(u,v).
Существуют следующие разновидности зазачи определения кратчашего пути графа (орграфа):
Задача простой пары (Simple Pair Problem) – задан граф (орграф) и вершины u,v
V.
Найти кратчайший путь w(P).Задача одного источника (Single Source Problem) - задан граф (орграф) и вершины s V. Вершина s называется источником. Найти кратчайшие пути от источника s ко всем остальным вершинам.
Задача всех пар (All Pairs Problem) – найти кратчайшие расстояния между всеми возможными парами вершин графа (орграфа).
Класс сложности
Проблема нахождения кратчайших путей в графе (орграфе) относится к Р-классу (полиномиальному классу).
Алгоритм Дейкстры (Dijkstra)
Является алгоритмом решения задачи одного источника графа и орграфа при неотрицательных весах ребер (дуг).
Атрибуты
В графе G=(V,E) задана вершина-источник s. Для каждой вершины v V устанавливаюся следующие атрибуты:
d[v] – верхняя граница веса кратчайшего пути между s и r ;
π[u] – вершина-предшественник: вершина u является последней вершиной, из которой путь пришел в вершину v;
stat[v] – статус вершины. Имеет три значения: {недостигнута, помечена, просмотрена}.
Релаксация
Процесс релаксации ребра {u,v} позволяет определить, уменьшается ли кратчайший путь при добавлении в этот путь какого-либо ребра.
Пусть d[v] будет оценкой кратчайшего расстояния от вершины s к вершине v, полученная ранее. Предшественником вершины v была вершина z , т.е. π[z]=v . При добавлении к пути между s и v нового ребра {u,v} возможны два варианта (далее w(u,v) обозначает вес ребра {u,v}):
d[v]<d[u]+w(u,v). В этом случае оценка расстояния d[v] остается неизменной.
d[v]>d[u]+w(u,v). В этом случае надо изменить атрибут d[v]=d[u]+w(u,v) и указать предшественника вершины v – π[v]=u.
Механизм релаксации ребер лежит в основе почти всех алгоритмов нахождения кратчайших путей.
Пример
s
“Cтарый” путь
Оценки кратчайшего пути: -d[v]=9
при предшественнике π[v]=x; -d[u]=5.
x
Изменненый путь
v
u
2
При новой итерации алгоритма путь
к вершине v получается
добавление ребра {u,v}. Тогда d[v]=9<d[u]=5+w(u,v)=2=7. Релаксация ребра: d[v]=7,
π[v]=u.
Инициализация:
d[s]=0, stat[s] =просмотрена,
d[v]=
stat[v]=недостигнута
для всех вершин v
V-s.
Создать приоритетную очередь
Q вершин.
До тех
пор, пока Q не будет пуста,
делать:
{изять вершину u
из головы очереди Q;
{для каждой вершины
z, инцидентной вершине
u,
делать
{ если d[z]>d[u]+w(u,z),
тогда
d[z]=d[u]+w(u,z);
stat[z]=помечена;
stat[u]=просмотрена;
π[z]=u.
Убрать u
из очереди, поставить z
в очередь
}
}
,
v
V-s,
π[v]=nil,
Существует несколько способов создания приоритетной очереди. Самым простым явялется метод сортировки: очередь сортируется по созрастанию d[v] – от меньшего (голова очереди) к наибольшему (хвост очереди). Если d[v]=d[u], то размещение ребер в очереди друг относительно друга несущественно.
В этом случае сложность алгоритма O(n2+m), где n=|V|, m=|E|.
По указателям-предшественникам восстанавливаются кратчайшие пути (записываются только вершины пути)
d[s]=0;
π[b]=s → (s-a), d[a]=3 π[c]=d, π[d]=b, π[b]=s → (s-b-d-s), d[c]=7
π[d]=b, π[b]=s → (s-b-d), d[d]=4 π[e]=d, π[d]=b, π[b]=s → (s-b-d-e), d[e]=7.
Алгоритм Беллмана-Форда
