Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DM_shpory.doc
Скачиваний:
48
Добавлен:
21.09.2019
Размер:
1.59 Mб
Скачать

35. Задача коммивояжера. Алгоритм поиска субоптимального решения.

  • Коммивояжер должен совершить поездку по городам и вернуться обратно, побывав в каждом городе ровно один раз, сведя при этом затраты на передвижение к минимуму.

  • Для решения задачи нам необходимо найти гамильтонов цикл минимального общего веса.

  • Эффективный алгоритм пока не известен. Для сложных сетей число гамильтоновых циклов непомерно велико. Рассмотрим алгоритм поиска субоптимального решения.

  • Алгоритм ближайшего соседа

Дан нагруженный граф с множеством вершин V. Цикл, полученный в результате работы, будет совпадать с конечным значением переменной маршрут, а его длина — конечное значение переменной w.

Begin

Выбрать v Î V;

Маршрут := v;

w:= 0;

v¢:=v;

Отметить v¢;

while останутся неотмеченные вершины do

begin

Выбрать неотмеченную вершину u, ближайшую к v¢;

Маршрут := маршрут и;

w:= w + вес ребра v¢ u;

v¢ := u;

Отметить v¢

еnd

Маршрут := маршрут v;

w:= w + вес ребра v¢ v

end

u

Маршрут

w

 

Исходные значения

D

0

D

C

DC

3

C

A

DCA

9

A

B

DCAB

14

B

Последний проход

B

DCABD

24

B

!!! В полном графе с 20-ю вершинами существует приблизительно 6,1*1016 гамильтононовых циклов

36. Задача построения минимального остовного дерева. Алгоритм Краскала. Алгоритм Прима. Оценка вычислительной сложности этих алгоритмов.

Деревья

Граф G = <VE> называется деревом, если он связен и ацикличен.

Пусть G = <VE> — граф с n вершинами и m ребрами.

Необходимые и достаточные условия того, что G — дерево:

  • Любая пара вершин в G соединена единственным путем

  • G связен и m = n – 1

  • G связен и удаление хотя бы одного его ребра нарушает связность графа

  • G ацикличен, но если добавить хотя бы одно ребро, то в G появится цикл.

Остовной граф

  • В любом связном графе найдется подграф, являющийся деревом.

  • Подграф в G, являющийся деревом и включающий в себя все вершины G, называется остовным деревом.

  • Построение остовного дерева: Выбираем произвольное ребро и последовательно добавляем другие ребра, не создавая при этом циклов, до тех пор, пока нельзя будет добавить никакого ребра, не получив при этом цикла.

  • Всего n -1 ребро!!!

Алгоритм построения минимального остовного дерева (задача поиска кратчайшего соединения)

  • Задача построения минимального остовного дерева — это одна из немногих задач теории графов, которую можно считать полностью решенной.

  • Задача о проведении дорог. Для каждой пары городов А и В известна стоимость С(А,В) строительства городов между ними. Нужно построить самую дешевую из все возможных сеть дорог. Искомый граф должен быть деревом, которое называют экономическим. Таким образом, задача состоит в нахождении алгоритма, определяющего среди nn–2 возможных деревьев, которые соединяют вершины, дерева наименьшей длины, определяемой как сумма его ребер.

Алгоритм Краскала

  • Пусть есть связный граф, имеющий n вершин.

  • Шаг 1. Упорядочим ребра графа в порядке их неубывания их весов.

  • Шаг 2. Начиная с первого ребра в этом списке, добавлять ребра в графе, соблюдая условие: такое добавление не должно приводить к появлению цикла.

  • Шаг 3. Повторять Шаг 2 до тех пор, пока число ребер в графе не станет равно n – 1. Получившееся дерево является минимальным остовным деревом графа.

Больше всего времени необходимо для выполнения сортировки — при m ребрах это m log2m операций. Но нужны только n – 1 ребро!

Для полных графов более эффективный алгоритм был предложен Примом и Дейкстрой.

Алгоритм Прима

  • Шаг 1. Выбрать произвольную вершину и ребро, соединяющее ее с ближайшим по весу соседом.

  • Шаг 2. Найдите не присоединенную (еще) вершину, ближе всего лежащую к одной из присоединенных, и соедините с ней.

  • Шаг 3. Повторять Шаг 2 до тех пор, пока все вершины не будут присоединены.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]