
- •Билет 1. Концепция языка Си, его достоинства и недостатки
- •Билет 2. Представление целых чисел в эвм. Основные типы данных в Си и операции над ними. Особенности операций над вещественными числами.
- •Билет 3. Основные управляющие конструкции в Си. Понятие инварианта цикла и его применение.
- •Билет 4. Характеристика алгоритмов, программ, языков программирования и соответствия между ними.
- •Билет 5. Массивы и указатели в языке Си. Их представление, связь между ними.
- •Билет 6. Метод барьера и различные варианты его применения.
- •Билет 7. Процедуры и функции в Си. Формальные и фактические. Входные и выходные параметры, локальные и глобальные переменные.
- •Билет 8. Массивы и указатели в Си, связь между ними. Передача массивов и указателей как параметров процедур.
- •Билет 9. Представление строк и символов в Си. Операции над ними.
- •Билет 10. Понятие эффективности алгоритма, различные способы ее измерения.
- •Билет 11. Понятие рекурсии. Виды и характеристики.
- •Билет 12. Алгоритмы перебора с возвратом. Способы сокращения перебора.
- •Способы сокращения перебора
- •Билет 13. Алгоритмы оптимального поиска. Метод ветвей и границ.
- •Билет 14. Сортировка массивов. Простые методы.
- •Билет 15. Сортировка массивов. Усовершенствованные методы.
- •Билет 16. Алгоритм поиска подстроки в строке.
- •3. Эвристика совпавшего суффикса. Если при сравнении строки и шаблона совпало один или
- •Билет 17. Алгоритм получения случайных чисел. Правильный выбор параметров линейного конгруэнтного генератора.
Билет 12. Алгоритмы перебора с возвратом. Способы сокращения перебора.
Есть такие комбинаторные задачи, для решения которых приходится организовывать полный перебор возможных вариантов. Перебор с возвратом (backtrack) - это общий метод упорядоченного перебора. Перебор с возвратом особенно удобен для решения задач, требующих проверки потенциально большого, но конечного числа решений. Метод ветвей и границ был впервые предложен в 1960 году Ленд и Дойг для решения задач целочисленного программирования.
Основная идея поиска с возвратом: построение решения по одному компоненту и выяснение, может ли дальнейшие построение привести к решению. Если да – решение продолжается путем выбора первого допустимого варианта для следующего компонента. Если таких вариантов нет, то такие варианты для всех оставшихся компонентов не рассматриваются. Алгоритм в этой ситуации возвращается к последнему построенному компоненту и заменяет его следующим допустимым компонентом этого уровня. Общий алгоритм перебора с возвратом на псевдокоде: void try ( ) { инициализация ( ); do { выбора_варианте ( ): if (подходит) { запись_варианта ( ); if (решение неполное) { try(n+-…) if ( ! удача) стирание_варианта ( ); } } } while ( !удача || нет_вариантов); }
Пример – задача о 8 ферзях.
Способы сокращения перебора
-
Отбрасывание заведомо неверных вариантов (обрезание каких-то ветвей дерева подзадач).
-
Применение эвристик. Эвристика в программировании – это решение задачи при помощи разбора частных случаев, так как каждая ветвь эвристического алгоритма эффективнее, чем общее решение. Таким образом эвристический алгоритм не решает задачу в общем виде, а работает только в определенных случаях, но это и хорошо, так как некоторые задачи не имеют общего решения и они решаются только при помощи эвристики. Применяется тогда, когда мы ищем одно из возможных решений, а не все. Таким образом эвристика позволяет выбрать из всех вариантов самый вероятный.
-
Метод ветвей и границ.
---- внизу – дополнительно ---
Классическим примером использования алгоритма поиска с возвратом является задача о восьми ферзях. Её формулировка такова: «Расставить на стандартной 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) — общий алгоритмический метод для нахождения оптимальных решений различных задач оптимизации, особенно дискретной икомбинаторной оптимизации. По существу, метод является вариацией полного перебора с отсевом подмножеств допустимых решений, заведомо не содержащих оптимальных решений.