Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_TRPO / 6_PRBR_s_VZVR_DinPro_lec.doc
Скачиваний:
53
Добавлен:
12.03.2015
Размер:
1.1 Mб
Скачать

7.2. Перебор с возвратом

Опишем общий метод, позволяющий значительно сократить число шагов в ал­горитмах типа полного перебора всех возможностей. Идея перебора с возвратом состоит в том, чтобы, начав с тривиального частичного решения, последовательно продолжать его до тех пор, пока не будет получено полное решение, либо продол­жение станет невозможным. В последнем случае мы возвращаемся на шаг назад и пробуем построить другое продолжение. Если пространство поиска конечно, то либо мы получим полное решение, либо убедимся в невозможности его построе­ния, поскольку осуществлен полный перебор возможных продолжений.

Чтобы применить этот метод, искомое решение должно иметь вид последова­тельности (a1, a2, ...,aN). Основная идея метода состоит в том, что мы строим реше­ние последовательно, начиная с пустой последовательности e (длины 0). Вообще, имея данное частичное решение (a1, a2, ...,ai), мы стараемся найти такое допустимое значение ai+1, относительно которого мы не можем сразу заключить, что (a1, a2, ...,ai+1) можно расширить до некоторого решения (либо (a1, a2, ...,ai+1) уже является решением). Если такое предполагаемое, но еще не использованное решение ai+1 существует, то мы добавляем его к нашему частичному решению и продолжаем процесс для последовательности (a1, a2, ...,ai+1). Если его не существует, то мы воз­вращаемся к нашему частичному решению (a1, a2, ...,ai-1) и продолжаем наш про­цесс, отыскивая новое, еще не использованное допустимое значение ai' - отсюда название "алгоритм с возвратом" (англ. Backtracking).

Общая схема[ ]. Даны N упорядоченных множеств U1, U2,..., UN (N - известно), и требуется построить последовательность (вектор) А = (а12, ..., aN), где a1U1, a2U2 ,..., aNUN, удовлетворяющий заданному множеству условий и ограниче­ний.

В алгоритме перебора последовательность А строится покомпонентно слева направо. Предположим, что уже найдены значения первых (k-1) компонент, А=( а12, ..., ak-1 ,?,.., ?), тогда заданное множество условий ограничивает выбор следую­щей компоненты аk некоторым множеством SkUk. Если Sk ≠ [ ] (пустое), мы вправе выбрать в качестве аk наименьший элемент Sk и перейти к выбору (k+1) компоненты и так далее. Однако если условия таковы, что Sk оказалось пустым, то мы возвращаемся к выбору (k-1) компоненты, отбрасываем ak-1 и выби­раем в ка­честве нового ak-1 тот элемент Sk-1 , который непосредственно сле­дует за только что отброшенным. Может оказаться, что для нового ak-1 условия задачи допускают не­пустое Sk , и тогда мы пытаемся снова выбрать элемент аk. Если невозможно вы­брать аk-1, мы возвращаемся еще на шаг назад и выбираем но­вый элемент аk-2 и так далее.

В данном методе дерево как модель может использоваться не только как эф­фективная струк­тура для представления данных, но и как абстракция для выраже­ния процесса реше­ния задачи – так называемое дерево решений. Метод проб и ошибок при пере­боре вариантов можно рассматривать в общем виде как поиско­вый процесс, который постепенно строит и просматривает дерево подзадач. Иными словами идея поиска с возвратами состоит в следующем. Находясь в неко­торой ситуа­ции, пробуем изменить ее в надежде найти решение. Если изменение не привело к ус­пеху, то возвращаемся в исходную ситуацию (отсюда название «поиск с возвра­тами» ) и пробуем изменить ее другим образом, и так до тех пор, пока не будут исчерпаны все возможности.

Итак, графическое изображение - дерево поиска. Корень дерева (0 уровень) есть пустая последовательность. Его сыновья суть множество кандидатов для вы­бора а1 и, в общем случае, узлы k-го уровня явля­ются кандидатами на вы­бор аk при усло­вии, что а12, ..., ak-1 выбраны так, как указывают предки этих узлов. Вопрос в том, имеет ли задача решение, равносилен вопросу, яв­ляются ли какие-нибудь узлы дерева решениями. Разыскивая все решения мы хотим получить все такие узлы.

Обычно процесс проб и ошибок разделяется на отдельные подзадачи. Часто эти подзадачи наи­более естественно описываются с помощью рекурсии. Предмет этого раздела – общий прин­цип разбиения таких за­дач на подзадачи и ис­пользование в них рекурсии.

Рекурсивная схема реализации алгоритма:

Procedure Backtrack (последовательность, i );

Begin

Соседние файлы в папке Lektsii_TRPO