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

Билет 12. Алгоритмы перебора с возвратом. Способы сокращения перебора.

Есть такие комбинаторные задачи, для решения которых приходится организовывать полный перебор возможных вариантов. Перебор с возвратом (backtrack)  - это общий метод упорядоченного перебора. Перебор с возвратом  особенно удобен для решения задач, требующих проверки потенциально большого, но конечного числа решений. Метод ветвей и границ был впервые предложен в 1960 году Ленд и Дойг для решения задач целочисленного программирования.

Основная идея поиска с возвратом: построение решения по одному компоненту и выяснение, может ли дальнейшие построение привести к решению. Если да – решение продолжается путем выбора первого допустимого варианта для следующего компонента. Если таких вариантов нет, то такие варианты для всех оставшихся компонентов не рассматриваются. Алгоритм в этой ситуации возвращается к последнему построенному компоненту и заменяет его следующим допустимым компонентом этого уровня. Общий алгоритм перебора с возвратом на псевдокоде: void try ( ) { инициализация ( ); do { выбора_варианте ( ): if (подходит) { запись_варианта ( ); if (решение неполное) { try(n+-…) if ( ! удача) стирание_варианта ( ); } } } while ( !удача || нет_вариантов); }

Пример – задача о 8 ферзях.

Способы сокращения перебора

  1. Отбрасывание заведомо неверных вариантов (обрезание каких-то ветвей дерева подзадач).

  2. Применение эвристик. Эвристика в программировании – это решение задачи при помощи разбора частных случаев, так как каждая ветвь эвристического алгоритма эффективнее, чем общее решение. Таким образом эвристический алгоритм не решает задачу в общем виде, а работает только в определенных случаях, но это и хорошо, так как некоторые задачи не имеют общего решения и они решаются только при помощи эвристики. Применяется тогда, когда мы ищем одно из возможных решений, а не все. Таким образом эвристика позволяет выбрать из всех вариантов самый вероятный.

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

---- внизу – дополнительно ---

Классическим примером использования алгоритма поиска с возвратом является задача о восьми ферзях. Её формулировка такова: «Расставить на стандартной 64-клеточной шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого». Сперва на доску ставят одного ферзя, а потом пытаются поставить каждого следующего ферзя так, чтобы его не били уже установленные ферзи. Если на очередном шаге такую установку сделать нельзя — возвращаются на шаг назад и пытаются поставить ранее установленного ферзя на другое место.

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

Алгоритм "Все расстановки"

Шаг 1. Полагаем  ( D - множество решений, j - текущий столбец для очередного ферзя).

Шаг 2. Пытаемся в столбце j продвинуть вниз по вертикали или новый (если столбец j пустой), или уже имеющийся там ферзь на ближайшую допустимую строку. Если это сделать не удалось, то переходим к шагу 4.

Шаг 3. Увеличиваем j на 1, то есть переходим к следующему столбцу. Если j<n-1, то переходим к шагу 2. В противном случае j=n-1, то есть все вертикали уже заняты. Найденное частичное решение запоминаем в множестве D и переходим к шагу 2.

Шаг 4. Уменьшаем j на 1, то есть снимаем ферзь со столбца j и переходим к предыдущему столбцу. Если j>0, то выполняем шаг 2. Иначе вычисления прекращаем. Решения задачи находятся в множестве D, которое, может быть и пустым.

Способы сокращения переборов

Отсечение лишних вариантов

Первый принцип при таком подходе предельно прост – не рассматривать те варианты, которые не могут дать решение задачи. Как правило, большую часть таких вариантов можно избежать, организовав перебор соответствующим образом. Часто ``лишние'' варианты не продиктованы смыслом задачи, а возникают из-за способа организации перебора. Действительно, часто используемый способ получения простых формулировок – грубо (``с запасом'') описывает пространство решений задачи. При этом структура алгоритма поиска решения становится наиболее простой – как правило, это вложенные циклы. Но ценой этому – расширение пространства перебора. Пространство перебора может быть излишне расширено и просто из-за неподходящей, неумело подобранной формулировки.

Использование симметрии

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

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

Группирование элементов

Часто при проверке перебираемых вариантов многие операции повторяются для разных элементов пространства перебора. Напрашивается следующая идея оптимизации: выполнять эти операции сразу для групп элементов. Причём чем больше группы, тем лучше.

Метод ветвей и границ (англ. branch and bound) — общий алгоритмический метод для нахождения оптимальных решений различных задач оптимизации, особенно дискретной икомбинаторной оптимизации. По существу, метод является вариацией полного перебора с отсевом подмножеств допустимых решений, заведомо не содержащих оптимальных решений.

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