Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 35-66 / 76.Поиск с возвратом( алгоритм, применение метода к задаче нахождения гамильтонова цикла в графе

.).pdf
Скачиваний:
86
Добавлен:
11.05.2015
Размер:
247.49 Кб
Скачать

76.Поиск с возвратом: алгоритм, применение метода к задаче нахождения гамильтонова цикла в графе.

Рассмотрим задачу нахождения путей, проходящих ровно один раз через каждую вершину (а не через каждое ребро) графа.

Путь с таким свойством называется гамильтоновым путем, а цикл – гамильтоновым циклом.

Очевидным алгоритмом нахождения гамильтонова пути в графе является полный перебор всех возможностей: генерируем все n! различных последовательностей вершин и для каждой проверяем, определяет ли она гамильтонов путь. Такие действия потребуют по крайней мере n! шагов.

Алгоритм с возвратом:

Строим наше решение последовательно, начиная с пустой последовательности длины 0. Имея некоторое частичное решение < xj,..., xi >, стараемся найти такое допустимое значение xi+1,относительно которого мы не можем сразу заключить, что < xj,..., xi, xi+1 > можно расширить до некоторого решения (а может быть < xj,...,xi,xi+1 > уже является решением). Если такое предполагаемое, но еще не использованное значение xi+i существует, то мы добавляем его к нашему частичному решению и продолжаем процесс для последовательности < xj,..., xi, xi+1 > . Если его не существует, то мы возвращаемся к частичному решению < xj,..., xi _j > и продолжаем наш процесс, отыскивая новое, еще не использованное допустимое значение xi . Пример:

Двигаемся: 1->2->3->4->5->6 , т.к. невозможно 6->1 (нет общего ребра), 6->5->4->6->5, но опять нет 5->1, поэтому 5->4->3->… и т.д. В результате получится путь: 1->2->4->6->5->3->1. Алгоритм:

Алгоритм GamiltonCycle(G)

1.for all vϵV do dop[v] <- true

2.x[1] <- v0

3.dop [v0] <- false

4.Gamilton(2)

Gamilton (k)

1.for y <- List (X[k-1]) do

2.if (y = x0) and (k = n+1) 3.then x[k] <- v0; return x

4.else if dop[y] then

5x[k] <- y

6.dop[y] <- false

7.Gamilton (k+1) 8.dop[y] <- true

9.end if

10end if

11end for