Алгоритм перебора с возвратом
Лабораторная работа 36. Алгоритм перебора с возвратом
Цель работы: изучить рекурсивный алгоритм перебора с возвратом, научиться разрабатывать рекурсивную триаду и алгоритм перебора с возвратом при решении задач на языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Для обработки данных необходимо реализовать рекурсивную функцию алгоритма перебора с возвратом. Ввод данных осуществляется с клавиатуры или из файла с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 36.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
- На основе описания из Примера 1 лекции 36 решите задачу о нахождении всех расстановок n ферзей на шахматной доске размером nxn.
- Найдите количество всех расстановок ферзей на шахматной доске размером nxn.
- Найдите все основные расстановки ферзей на шахматной доске размером nxn.
- Решите задачу о рюкзаке. Имеется n предметов, пронумерованных числами от 0 до n-1, для каждого из которых известен набор масс m0,...,mn-1 и набор стоимостей s0,...,sn-1. Определите, какой набор предметов необходимо положить в рюкзак, чтобы его масса не превышала Q, а стоимость предметов была бы наибольшей.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученным рекурсивным алгоритмом перебора с возвратом, реализовав программный код на языке С++. Перед реализацией кода каждой задачи необходимо разработать рекурсивную триаду в соответствии с постановкой задачи: выполнить параметризацию, выделить базу и оформить декомпозицию рекурсии. Рекомендуется воспользоваться материалами лекции 36, где подробно рассматриваются описание метода перебора с возвратом, примеры разработки рекурсивной триады и обоснование декомпозиции. Этапы рекурсивной триады необходимо отразить в математической модели к отчету, выполнив обоснование декомпозиции. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя рекурсивные функции. Этапы сопроводить комментариями в коде. В отчете следует отразить результаты тестирования программ.
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- В чем проявляется рекурсивность метода перебора с возвратом?
- Почему полный метод перебора с возвратом гарантирует отыскание всех решений задачи?
- Как формируется рекурсивная база метода возвратной рекурсии?
- Какие классы задач сводятся к разработке детерминированных алгоритмов, а какие – к недетерминированным? Поясните примерами.
- Поясните, почему данные описания характеризуют описание действий над ферзем в контексте модели шахматной доски:
- В позицию (i,j) можно поставить ферзь, если hoi+dui+j+ddn+i-j=0.
- Поставить ферзь в позицию (i,j) равносильно присваиваниям: hoi=1, dui+j=1, ddn+i-j=1.
- Убрать ферзь из позиции (i,j) равносильно присваиваниям: hoi=0, dui+j=0, ddn+i-j=0.