Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 4. Взвешенные графы и орграфы, 2 часть.doc
Скачиваний:
12
Добавлен:
13.02.2016
Размер:
553 Кб
Скачать
☆

Замечание

Поскольку данный алгоритм является эвристическим, найденное решение будет зависеть от выбора начальной вершины. Например, если выбрать начальную вершину b, то алгоритм дает следующее решение:

Алгоритм нахождения нижней границы проблемы путешествующего купца:

  1. Выбрать у взвешенного полносвязного графа вершину VS и удалить её из графа вместе с инцидентными к ней рёбрами.

  2. Найти минимальное каркасное дерево T, соединяющее оставшиеся вершины и подсчитать общий вес дерева w (для этой цели использовать алгоритм Крускала или метод Прима).

  3. Найти два наименьших веса, w1 и w2, рёбер, инцидентных с VS. Тогда w+w1+ w2 является нижней границей решения проблемы путешествующего купца.

Пример

a

a

7

1

d

. Начальная вершина а. Удаляем ее вместе с инцидентными ребрами:

  1. Находим минимальное каркасное дерево Т:

  1. Два ребра с наименьшими весами, инцидентные вершине а:

w1=w(a,e)=2,

w2 =w(a,c)=4.

5. Нижняя граница решения проблемы ТСР

w+ w1+ w2=16+2+4=22.

Замечание

Как и для случая оценки верхней границы, величина оценки нижней границы зависит от выбора вершины VS. Например, если взять VS=d, то получим:

Это решение замечательно тем, что верхняя и нижняя границы совпали! Следовательно, точное решение проблемы ТСР=26.

    1. Кратчайшие пути во взвешенных

графах и орграфах

Определения

Задан граф 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) – найти кратчайшие расстояния между всеми возможными парами вершин графа (орграфа).

Класс сложности

Проблема нахождения кратчайших путей в графе (орграфе) относится к Р-классу (полиномиальному классу).

      1. Алгоритм Дейкстры (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]= , v V-s, π[v]=nil,

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 в очередь

}

}

Существует несколько способов создания приоритетной очереди. Самым простым явялется метод сортировки: очередь сортируется по созрастанию 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.

      1. Алгоритм Беллмана-Форда