Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
10_САОД.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
333.31 Кб
Скачать

7. Алгоритмы исчерпывающего поиска

Под термином "исчерпывающий поиск" будем понимать поиск оптимального решения задачи, выполняющийся путем перебора вариантов. Задачи, которые решаются таким способом, составляют довольно обширную группу задач дискретной оптимизации. Часто такие задачи называют также комбинаторными задачами оптимизации.

Одной из групп алгоритмов исчерпывающего поиска являются алгоритмы полного перебора, при котором перебираются все возможные варианты решения и из них выбирается наилучшее (или просто подходящее по каким-либо критериям). Такого рода алгоритмы имеют экспоненциальную (либо ещё более высокую) временную сложность, поэтому применимы лишь для очень небольших объёмов входных данных - не более нескольких десятков элементов.

При разработке таких алгоритмов обычно нужно решить две задачи.

1. Установить порядок на элементах, подлежащих перечислению. В качестве порядка обычно используется лексикографический порядок -сначала сравниваются первые буквы слов (или разряды чисел), потом вторые и т.д.

2. Научиться переходить от произвольного элемента к непосредственно следующему за ним.

Крайне важным методом, рассматриваемым далее в данной главе, является метод динамического программирования. С помощью данного метода для большого круга задач можно разработать алгоритмы с полиномиальной (или псевдополиномиальной) временной сложностью алгоритма, что позволяет обрабатывать входные данные в тысячи и десятки тысяч раз большего объёма, чем при полном переборе вариантов.

Способ разбиения задачи на подзадачи уже встречался нам ранее в алгоритма типа "разделяй и властвуй" - например, в алгоритмах быстрой сортировки Хоара. сортировки слиянием и др. При этом задача делится на несколько независимых подзадач, каждая из которых решается рекурсивно, после чего из их решений строится решение исходной задачи. Метод динамического программирования отличается тем, что подзадачи не являются независимыми - т.е. разные вспомогательные задачи используют решения одних и тех же подзадач. Отличия между этими случаями схематично можно изобразить следующим рисунком:

Для второго случая стоит использовать метод динамического программирования - т.е. решать каждую подзадачу только один раз, запоминая её решение в таблице. Чтобы избежать многократного решения одних и тех же вспомогательных подзадач, в методе динамического программирования каждая из них решается только одни раз, и её ответ сохраняется в таблице (обычно в одномерном или двумерном массиве).

Метод ветвей и границ

Общая идея метода может быть описана на примере поиска минимума и максимума функции f(x) на множестве допустимых значений x. Функция f и x могут быть произвольной природы. Для метода ветвей и границ необходимы две процедуры: ветвление и нахождение оценок (границ).

Процедура ветвления состоит в разбиении области допустимых решений на подобласти меньших размеров. Процедуру можно рекурсивно применять к подобластям. Полученные подобласти образуют дерево, называемое деревом поиска или деревом ветвей и границ. Узлами этого дерева являются построенные подобласти.

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

В основе метода ветвей и границ лежит следующая идея (для задачи минимизации): если нижняя граница для подобласти A дерева поиска больше, чем верхняя граница какой-либо ранее просмотренной подобласти B, то A может быть исключена из дальнейшего рассмотрения (правило отсева). Обычно, минимальную из полученных верхних оценок записывают в глобальную переменную m; любой узел дерева поиска, нижняя граница которого больше значения m, может быть исключен из дальнейшего рассмотрения.

Если нижняя граница для узла дерева совпадает с верхней границей, то это значение является минимумом функции и достигается на соответствующей подобласти.

Поиск с возвратом

Если, начиная поиск решения задачи (или целевого утверждения), мы должны выбрать между альтернативными путями, то мы ставим маркер у места ветвления (называемого точкой отката) и выбираем первую подцель, которую и станем проверять. Если данная подцель не выполнится (что эквивалентно достижению тупика в лабиринте), то вернемся к точке отката и попробуем проверить другую подцель.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]