11.2.2. Поиск с возвратами
Даже если для решения задач, подобных поставленной в предыдущем разделе, не удается найти эффективного алгоритма, всегда остается возможность найти решение «полным перебором» всех возможных вариантов, просто в силу конечности числа возможностей. Например, наибольшее независимое множество можно найти по следующей схеме.
Вход: граф G(V, E).
Выход: наибольшее независимое множество X. т : = 0 { наилучшее известное значение Д> } for Y е 2V do if Г е£&|У| >mthen
m := |У|; X: = Y { наилучшее известное значение X } end if end for
ЗАМЕЧАНИЕ
Для выполнения этого алгоритма потребуется <9(2Р) шагов.
ОТСТУПЛЕНИЕ
Алгоритм, трудоемкость которого (число шагов) ограничена полиномом от характерного размера задачи, принято называть эффективным, в противоположность неэффективным алгоритмам, трудоемкость которых ограничена более быстро растущей функцией, например экспонентой. Таким образом, жадный алгоритм эффективен, а полный перебор — нет.
При решении переборных задач большое значение имеет способ организации перебора (в нашем случае — способ построения и последовательность перечисления множеств У). Наиболее популярным является следующий способ организации перебора, основанный на идее поиска в глубину и называемый поиском с возвратами.
ЗАМЕЧАНИЕ —
Иногда употребляется термин бэктрекинг (от английского названия этого метода -backtracking).
Идея поиска с возвратами состоит в следующем. Находясь в некоторой ситуации, пробуем изменить ее в надежде найти решение. Если изменение не привело к успеху, то возвращаемся в исходную ситуацию (отсюда название «поиск с возвратами») и пробуем изменить ее другим образом, и так до тех пор, пока не будут исчерпаны все возможности.
Для рассматриваемой задачи метод поиска с возвратами может быть реализован с помощью следующего рекурсивного алгоритма.
Алгоритм 11.1. Поиск с возвратами
Вход: граф G(V, E).
Выход: наибольшее независимое множество X.
т: = О { наилучшее известное значение /Зо }
ВТ(0, V) { вызов рекурсивной процедуры ВТ }
Основная работа выполняется рекурсивной процедурой ВТ.
Вход: S — текущее независимое множество вершин, Т — оставшиеся вершины графа. Выход: изменение глобальной переменной X, если текущее множество не может быть расширено (является максимальным). е: = false { признак расширяемости множества } for v 6 V do if S U {v} € £ then
e : = true { множество можно расширить } BT(S U {г;}, Т \ Г*(г>)) { пробуем добавить v } end if end for if e then
if \S\ > т then
X := S;m := \S\ { наибольшее независимое множество } end if end if
обоснование
По построению вершина v добавляется в множество 5 только при сохранении независимости расширенного множества. В алгоритме это обстоятельство указано в форме условия 5 U {v} e £. Проверить сохранение условия независимости нетрудно, например, с помощью следующего цикла.
/: = true { множество 5 независимое } for и £ S do
if (и, v) e E then /: = false; exit for { множество 5 U {v} зависимое }
end if end for
Этот цикл не включен в явном виде в рекурсивную процедуру ВТ, чтобы не загромождать основной текст и не затуманивать основную идею поиска с воз вратами. Таким образом, множество S, а следовательно, и множество X -зависимые. В тот момент, когда множество S нельзя расширить (e = false), оно максимально по определению. Переменная т глобальна, поэтому среди всех максимальных независимых множеств в конце работы алгоритма X является наи большим независимым множеством вершин.
- Иркутский государственный технический университет
- 1. Определения графов
- 7.4.5. Массив дуг
- 8.4.2. Трансверсаль
- 8.5.4. Алгоритм нахождения максимального потока
- 8.6.3. Выделение компонент сильной связности
- 8.7.1. Длина дуг
- 8.7.2. Алгоритм Флойда
- 8.7.3. Алгоритм Дейкстры
- Глава 9 Деревья
- 9.1. Свободные деревья
- 9.1.1. Определения
- 9.1 .2. Основные свойства деревьев
- 9.2. Ориентированные, упорядоченные и бинарные деревья
- 9.2.1. Ориентированные деревья
- 9.2.2. Эквивалентное определение ордерева
- 9.2.3. Упорядоченные деревья
- 9.2.4. Бинарные деревья
- 9.3. Представление деревьев в эвм
- 9.3.1. Представление свободных, ориентированных и упорядоченных деревьев
- 9.3.2. Представление бинарных деревьев
- 9.3.3. Обходы бинарных деревьев
- 9.3.4. Алгоритм симметричного обхода бинарного дерева
- 9.4. Деревья сортировки
- 9.4.1. Ассоциативная память
- 9.4.2. Способы реализации ассоциативной памяти
- 9.4.3. Алгоритм бинарного (двоичного) поиска
- 9.4.4. Алгоритм поиска в дереве сортировки
- 9.4.5. Алгоритм вставки в дерево сортировки
- 9.4.6. Алгоритм удаления из дерева сортировки
- 9.4.7. Вспомогательные алгоритмы для дерева сортировки
- 9.4.8. Сравнение представлений ассоциативной памяти
- 9.4.9. Выровненные деревья
- 9.4.10. Сбалансированные деревья
- 9.5. Кратчайший остов
- 9.5.1. Определения
- 9.5.2. Схема алгоритма построения кратчайшего остова
- 9.5.3. Алгоритм Краскала
- Глава 10 Циклы
- 10.1. Фундаментальные циклы и разрезы
- 10.1.1. Циклы и коциклы
- 10.1.2. Независимые множества циклов и коциклов
- 10.1.3. Циклический и коциклический ранг
- 10.2. Эйлеровы циклы
- 10.2.1. Эйлеровы графы
- 10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе
- 10.2.3. Оценка числа эйлеровых графов
- 10.3. Гамильтоновы циклы
- 10.3.1. Гамильтоновы графы
- 10.3.2. Задача коммивояжера
- Глава 11 Независимость и покрытия
- 11.1. Независимые и покрывающие множества
- 11.1.1. Покрывающие множества вершин и ребер
- 11.1.2. Независимые множества вершин и ребер
- 11.1.3. Связь чисел независимости и покрытий
- 11.2. Построение независимых множеств вершин
- 11.2.1. Постановка задачи отыскания наибольшего независимого множества вершин
- 11.2.2. Поиск с возвратами
- 11.2.3. Улучшенный перебор
- 11.2.4. Алгоритм построения максимальных независимых множеств вершин
- 11.3. Доминирующие множества
- 11.3.1. Определения
- 11.3.2. Доминирование и независимость
- 11.3.3. Задача о наименьшем покрытии
- 11.3.4. Эквивалентные формулировки знп
- 11.3.5. Связь знп с другими задачами
- Глава 12 Раскраска графов
- 12.1. Хроматическое число
- Ух, . . . ,Vn одноцветные классы,доказательство
- 12.2. Планарность
- 12.2.2. Эйлерова характеристика
- 12.2.3. Теорема о пяти красках
- 12.3. Алгоритмы раскрашивания
- 12.3.1. Точный алгоритм раскрашивания
- 12.3.2. Приближенный алгоритм последовательного раскрашивания
- 12.3.3. Улучшенный алгоритм последовательного раскрашивания