Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы ДМ.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
56.61 Кб
Скачать

Решение задачи коммивояжера венгерским методом

Венгерский алгоритм — алгоритм оптимизации, решающий задачу о назначениях за полиномиальное время (см. исследование операций). Он был разработан и опубликован Харолдом Куном в 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

Деревянный алгоритм

Поиск через построение кратчайшего остовного дерева

Вернемся к ЗК и опишем решающий ее деревянный алгоритм.

  1. Построим на входной сети ЗК кратчайшее остовное дерево и удвоим все

  1. его ребра. Получим граф G – связный и с вершинами, имеющими только

  2. четные степени.

  3. Построим эйлеров цикл G, начиная с вершины 1, цикл задается

  4. перечнем вершин.

  1. Просмотрим перечень вершин, начиная с 1, и будем зачеркивать каждую

  1. вершину, которая повторяет уже встреченную в последовательности.

  2. Останется тур, который и является результатом алгоритма.

Лабораторная работа №2 Алгоритмы поиска пути

Реализовать приложение, выполняющее следующие функции

  1. Загрузка карты уровня в формате bmp (или любом схожем). Белый цвет – проходимая ячейка, черный – непроходимая. Размер карты 32х32 пикселя

  2. Точка старта и точка финиша задаются по варианту

  3. Отрисовка карты уровня

  4. Перемещение фишки (игрока) от точки старта до точки финиша в автоматическом режиме

  5. Отрисовка пройдённого маршрута любым удобным способом

По желанию можно использовать ячейки с частичной проходимости, тогда можно использовать любой алгоритм поиска пути.

Сдача лабораторной работы происходит в два этапа:

  1. Демонстрация загрузки карты уровня, отрисовка и разбиение ее на блоки, пригодные к обработке

  2. Добавление движения фишки и поиска пути от старта к финишу

Ключевые точки

Алгоритм

Ключевые точки

Алгоритм

Старт – верхний левый угол.

Финиш – нижний правый

Алгоритм Дейкстры

Старт – верхний правый

Финиш – верхний левый угол.

Алгоритм Дейкстры

Старт – верхний правый

Финиш – верхний левый угол.

Волновой алгоритм

Старт – слева по центру.

Финиш – верхний правый угол.

Волновой алгоритм

Старт – слева по центру.

Финиш – верхний правый угол.

Алгоритм A*

Старт - нижний правый.

Финиш – справа по центру.

Алгоритм A*

Старт - нижний правый.

Финиш – справа по центру.

Алгоритм Дейкстры

Старт – верхний левый угол.

Финиш – нижний правый

Алгоритм Дейкстры

Старт – верхний левый угол.

Финиш – нижний правый

Волновой алгоритм

Старт – верхний правый

Финиш – верхний левый угол.

Волновой алгоритм

Старт – верхний правый

Финиш – верхний левый угол.

Алгоритм A*

Старт – слева по центру.

Финиш – верхний правый угол.

Алгоритм A*

Старт – слева по центру.

Финиш – верхний правый угол.

Алгоритм Дейкстры

Старт - нижний правый.

Финиш – справа по центру.

Алгоритм Дейкстры

Старт - нижний правый.

Финиш – справа по центру.

Волновой алгоритм

Старт – верхний левый угол.

Финиш – нижний правый

Волновой алгоритм

Старт – верхний левый угол.

Финиш – нижний правый

Алгоритм A*

Старт – верхний правый

Финиш – верхний левый угол.

Алгоритм A*