Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Алгоритм перебора Робертса и Флореcа
(поиск гамильтонова цикла) Задача: задан граф G, найти все гамильтоновы циклы исходного графа. Идея алгоритма. - выбирается некоторая начальная вершина графа. Пусть исходной будет v1. Эта вершина образует первый элемент множества S; S = {v1}. - множество S на каждом шаге будет хранить уже найденные вершины гамильтоновой цепи. К S добавляется первая вершина в столбце, соответствующем v1. Пусть эта вершина a. - затем к S добавляется первая “возможная” вершина в столбце a. Пусть это вершина b. S = {v1, a, b}. Под “возможной” понимается вершина, которой нет в S. Существует 2 принципа, препятствующих включению некоторой вершины во множество S. Пусть множество S имеет вид: S = {v1, a, b, c … vr-1, vr} 1. Если в столбце vr нет возможных вершин (множество S нельзя расширить). 2. Цепь, определенная последовательностью вершин S имеет длину p – 1, где p – количество вершин графа, т. е. она является гамильтоновой цепью. В случае 2 тоже 2 варианта. а) В графе G существует ребро (vr, v1), следовательно, найден гамильтонов цикл б) Ребро (vr, v1) не существует, следовательно, гамильтонов цикл не может быть получен. В случае 1 и 2б следует прибегнуть к возвращению. Если нужны все гамильтоновы циклы, то в случае 2а обработать гамильтонов цикл и сделать шаг возвращения. Возвращение состоит в удалении последней включенной вершины из S после чего S примет вид: S = {v1, a … vr-1} И добавление к S первой возможной вершины, следующего за vr в столбце vr-1. Если не существует ни какой возможной вершины, то делается следующий шаг возвращения. Поиск заканчивается тогда и только тогда, когда S состоит из одной вершины v1 и не существует ни какой возможной вершины, которую можно было добавить в S, шаг возвращения делает S пустым. Это значит, что все гамильтоновы циклы найдены. Алгоритм заканчивает работу.
Пример: АG – матрица смежности: Граф G:
Множество S: Комментарии: 1) S = { v1} Выбираем начальную вершину графа v1 2) S = { v1, v2} Добавляем первую возможную вершину в столбце v1 (т.е. вершину v 2) 3) S = { v1, v2, v3} Первая вершина (v1) в столбце v2 не является возможной, т.к. она уже принадлежит множеству S, поэтому добавляем следующую вершину в столбце (т.е. вершину v3) 4) S = { v1, v2, v3, v4} Добавляем вершину v4 5) S = { v1, v2, v3, v4, v5} - Г Добавляем вершину v5 и видим, что это гамильтонова цепь. Дуга (v5, v1) дает гамильтонов цикл 6) S = { v1, v2, v3, v4} Возвращение 7) S = { v1, v2, v3} Возвращение 8) S = { v1, v2} Возвращение 9) S = { v1} Возвращение
10) S = { v1, v3} Добавляем вершину v3 11) S = { v1, v3, v2} Добавляем вершину v2 12) S = { v1, v3} В столбце v2 нет возможной вершины. Возвращение 13) S = { v1, v3, v4} Добавляем вершину v4 14) S = { v1, v3, v4, v5} Добавляем вершину v5. Дуга (v5, v1) дает цикл, но он не является гамильтоновым, т.к. во множестве S отсутствует вершина v2 15) S = { v1, v3, v4} Возвращение 16) S = { v1, v3} Возвращение 17) S = { v1} Возвращение
18) S = { v1, v5} Добавляем вершину v5 19) S = { v1, v5, v4} Добавляем вершину v4 20) S = { v1, v5, v4, v3} Добавляем вершину v3 21) S = { v1, v5, v4, v3, v2} - Г Добавляем вершину v2 и видим, что это гамильтонова цепь. Дуга (v2, v1) дает гамильтонов цикл 22) S = { v1, v5, v4, v3} Возвращение 23) S = { v1, v5, v4} Возвращение 24) S = { v1, v5} Возвращение 25) S = { v1} Возвращение 26) S = Æ Конец поиска
|