русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Алгоритм перебора Робертса и Флореcа


Дата добавления: 2015-07-23; просмотров: 1657; Нарушение авторских прав


(поиск гамильтонова цикла)

Задача: задан граф 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 пустым.

Это значит, что все гамильтоновы циклы найдены.



Алгоритм заканчивает работу.

  v1 v2 v3 v4 v5
v1
v2
v3
v4
v5

Пример:

А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 = Æ Конец поиска



<== предыдущая лекция | следующая лекция ==>
Теорема Оре | Задание к лабораторной работе


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.