
- •Лабораторная работа №1. Решение задачи коммивояжёра
- •Алгоритм Литтла
- •Полный перебор
- •Жадный алгоритм
- •Решение задачи коммивояжера методом ветвей и границ
- •Решение задачи коммивояжера венгерским методом
- •Деревянный алгоритм
- •Лабораторная работа №2 Алгоритмы поиска пути
- •Алгоритм поиска a*
- •Волновой алгоритм
- •Алгоритм Дейкстры
Решение задачи коммивояжера венгерским методом
Венгерский алгоритм — алгоритм оптимизации, решающий задачу о назначениях за полиномиальное время (см. исследование операций). Он был разработан и опубликован Харолдом Куном в 1955 году. Автор дал ему имя «венгерский метод» в связи с тем, что алгоритм в значительной степени основан на более ранних работах двух венгерских математиков (Кёнига и Эгервари).
Джеймс Манкрес в 1957 году заметил, что алгоритм является (строго) полиномиальным. С этого времени алгоритм известен также как алгоритм Куна — Манкреса или алгоритм Манкреса решения задачи о назначениях. Временная сложность оригинального алгоритма была O(n4), однако Эдмондс и Карп (а также Томидзава независимо от них) показали, что его можно модифицировать так, чтобы достичь времени выполнения O (n3). Форд и Фалкерсон распространили метод на общие транспортные задачи. В 2006 году было обнаружено, что Якоби нашёл решение задачи о назначениях в XIX веке и опубликовал его в 1890 году на латыни.
Алгоритм основан на двух идеях:
если из всех элементов некоей строки или столбца вычесть одно и то же число y, общая стоимость уменьшится на y, а оптимальное решение не изменится;
если есть решение нулевой стоимости, оно оптимально.
Алгоритм ищет значения, которые надо вычесть из всех элементов каждой строки и каждого столбца (разные для разных строк и столбцов), такие что все элементы матрицы останутся неотрицательными, но появится нулевое решение.
http://ru.wikipedia.org/wiki/%C2%E5%ED%E3%E5%F0%F1%EA%E8%E9_%E0%EB%E3%EE%F0%E8%F2%EC
Деревянный алгоритм
Поиск через построение кратчайшего остовного дерева
Вернемся к ЗК и опишем решающий ее деревянный алгоритм.
Построим на входной сети ЗК кратчайшее остовное дерево и удвоим все
его ребра. Получим граф G – связный и с вершинами, имеющими только
четные степени.
Построим эйлеров цикл G, начиная с вершины 1, цикл задается
перечнем вершин.
Просмотрим перечень вершин, начиная с 1, и будем зачеркивать каждую
вершину, которая повторяет уже встреченную в последовательности.
Останется тур, который и является результатом алгоритма.
Лабораторная работа №2 Алгоритмы поиска пути
Реализовать приложение, выполняющее следующие функции
Загрузка карты уровня в формате bmp (или любом схожем). Белый цвет – проходимая ячейка, черный – непроходимая. Размер карты 32х32 пикселя
Точка старта и точка финиша задаются по варианту
Отрисовка карты уровня
Перемещение фишки (игрока) от точки старта до точки финиша в автоматическом режиме
Отрисовка пройдённого маршрута любым удобным способом
По желанию можно использовать ячейки с частичной проходимости, тогда можно использовать любой алгоритм поиска пути.
Сдача лабораторной работы происходит в два этапа:
Демонстрация загрузки карты уровня, отрисовка и разбиение ее на блоки, пригодные к обработке
Добавление движения фишки и поиска пути от старта к финишу
№ |
Ключевые точки |
Алгоритм |
№ |
Ключевые точки |
Алгоритм |
|
Старт – верхний левый угол. Финиш – нижний правый |
Алгоритм Дейкстры |
|
Старт – верхний правый Финиш – верхний левый угол. |
Алгоритм Дейкстры |
|
Старт – верхний правый Финиш – верхний левый угол. |
Волновой алгоритм |
|
Старт – слева по центру. Финиш – верхний правый угол. |
Волновой алгоритм |
|
Старт – слева по центру. Финиш – верхний правый угол. |
Алгоритм A* |
|
Старт - нижний правый. Финиш – справа по центру. |
Алгоритм A* |
|
Старт - нижний правый. Финиш – справа по центру. |
Алгоритм Дейкстры |
|
Старт – верхний левый угол. Финиш – нижний правый |
Алгоритм Дейкстры |
|
Старт – верхний левый угол. Финиш – нижний правый |
Волновой алгоритм |
|
Старт – верхний правый Финиш – верхний левый угол. |
Волновой алгоритм |
|
Старт – верхний правый Финиш – верхний левый угол. |
Алгоритм A* |
|
Старт – слева по центру. Финиш – верхний правый угол. |
Алгоритм A* |
|
Старт – слева по центру. Финиш – верхний правый угол. |
Алгоритм Дейкстры |
|
Старт - нижний правый. Финиш – справа по центру. |
Алгоритм Дейкстры |
|
Старт - нижний правый. Финиш – справа по центру. |
Волновой алгоритм |
|
Старт – верхний левый угол. Финиш – нижний правый |
Волновой алгоритм |
|
Старт – верхний левый угол. Финиш – нижний правый |
Алгоритм A* |
|
Старт – верхний правый Финиш – верхний левый угол. |
Алгоритм A* |