Алгоритмы на графах. Алгоритмы нахождения кратчайшего пути
Лабораторная работа 45. Алгоритмы на графах. Алгоритмы нахождения кратчайшего пути
Цель работы: изучить основные алгоритмы поиска кратчайшего пути и научиться решать задачи поиска кратчайшего пути на основе алгоритмов Дейкстры, Флойда и переборных алгоритмов.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Для обработки данных необходимо реализовать алгоритмы поиска кратчайшего пути на графе на основе алгоритмов Дейкстры, Флойда и переборных алгоритмов в соответствии с постановкой задачи. Ввод данных осуществляется из файла с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 45.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
- На основании приведенной в лекции 45 функций реализуйте программы, в которых выполняются алгоритм Дейкстры и алгоритм Флойда.
- На основании приведенной в лекции функции реализуйте программу, в которой выполняется переборный алгоритм методом поиска в ширину.
- Оля (A), Маша (B), Витя (C), Дима (D), Ваня (E) и Катя (F) живут в разных городах. Стоимость билетов из разных городов известна (рис.). Добраться до городов можно разными способами. Определить наименьшую сумму, которую нужно потратить, чтобы Оля могла навестить каждого из своих друзей.
- Квадратное озеро задается матрицей MxN и покрыто мелкими островками. В левом верхнем углу находится плот размером mxm. За один шаг плот может передвигаться на одну клетку по вертикали или горизонтали. Требуется определить кратчайший путь плота до правого нижнего угла.
- Напишите алгоритм, находящий строку длиной 100 символов, состоящую только из букв "A", "B", "C", такую, что в ней никакие две соседние подстроки не равны друг другу. Воспользуйтесь перебором с возвратом.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными алгоритмами поиска кратчайшего пути на графе на основе алгоритмов Дейкстры, Флойда и переборных алгоритмов, реализовав программный код на языке С++. Рекомендуется воспользоваться материалами лекции 45, где подробно рассматриваются описания алгоритмов поиска кратчайшего пути на графе, примеры разработки функций, реализующих алгоритмы поиска на графе, на языке С++. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя функции. Этапы решения сопроводить комментариями в коде. В отчете следует отразить разработку и обоснование математической модели решения задачи, представить результаты тестирования программ.
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- С какими видами графов работают алгоритмы Дейкстры, Флойда и переборные алгоритмы?
- Как от представления графа зависит эффективность алгоритма его обхода?
- За счет чего поиск в ширину является достаточно ресурсоемким алгоритмом?
- В чем преимущества алгоритмов обхода графа в ширину?
- Каким образом в алгоритме перебора с возвратом при обходе графа обрабатывается посещение тупиковых вершин?
- Поясните на примере обхода графа этап обратного хода в волновом алгоритме. Почему его удобно выполнять с конца?
- При программной реализации алгоритмов обхода графа с помощью рекурсии что выделяется в качестве базы и как организована декомпозиция?