Материал: АиСД. Проектная работа

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Федеральное агентство связи

Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования «Санкт-Петербургский государственный университет телекоммуникаций

им. проф. М. А. Бонч-Бруевича»

ГЕНЕРАЦИЯ И ПОИСК КРАТЧАЙШЕГО ПУТИ В 2D ЛАБИРИНТАХ

Проектная работа по дисциплине «Алгоритмы и структуры данных»

Студенты: Коваленко Л. А. Курс: 2 Группа: ИКПИ-81 Преподаватель: Дагаев А. В.

Санкт-Петербург

2020

 

ОГЛАВЛЕНИЕ

 

1. ГЕНЕРАЦИЯ ЛАБИРИНТОВ ...........................................................................................

3

1.1

Алгоритмы генерации идеальных лабиринтов ........................................................

3

 

1.1.1 Алгоритм Олдоса – Бродера .............................................................................

6

 

1.1.2 Алгоритм Уилсона .............................................................................................

7

 

1.1.3 Алгоритм двоичного дерева..............................................................................

9

 

1.1.4 Алгоритм Recursive Backtracking ...................................................................

11

 

1.1.5 Алгоритм рекурсивного деления....................................................................

13

 

1.1.6 Алгоритм Эллера..............................................................................................

15

 

1.1.7 Алгоритм растущего дерева............................................................................

17

 

1.1.8 Алгоритм Краскала ..........................................................................................

19

 

1.1.9 Алгоритм Прима (упрощенный).....................................................................

21

 

1.1.10 Алгоритм Прима (модифицированный) ......................................................

21

 

1.1.11 Алгоритм Sidewinder......................................................................................

23

 

1.1.12 Примеры лабиринтов.....................................................................................

27

1.2

Алгоритмы генерации неидеальных лабиринтов ..................................................

29

 

1.2.1 Алгоритм змеевидного лабиринта .................................................................

29

 

1.2.2 Алгоритм маленьких комнат ..........................................................................

29

 

1.2.3 Алгоритм спирального лабиринта .................................................................

30

 

1.2.4 Примеры лабиринтов.......................................................................................

31

2. ПОИСК КРАТЧАЙШЕГО ПУТИ В ЛАБИРИНТАХ....................................................

32

2.1

Алгоритм итеративного поиска в ширину..............................................................

32

2.2

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

32

2.3

Алгоритм A* ..............................................................................................................

33

2.4

Примеры поиска ........................................................................................................

36

3. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ..................................................................................

42

4. ВЫВОДЫ ...........................................................................................................................

45

5. КОД ПРОГРАММЫ..........................................................................................................

46

СПИСОК ЛИТЕРАТУРЫ.....................................................................................................

62

2

1.ГЕНЕРАЦИЯ ЛАБИРИНТОВ

1.1Алгоритмы генерации идеальных лабиринтов

Идеальный лабиринт – такой лабиринт, в котором одна клетка связана с другой одним единственным путём. Иначе говоря, остовное дерево.

Для создания стандартного идеального лабиринта обычно необходимо «выращивать» его, обеспечив отсутствие петель и изолированных областей.

Следующие алгоритмы генерируют идеальные лабиринты либо методом добавления стен, либо методом вырезания проходов.

Таблица 1. Алгоритмы генерации идеальных лабиринтов

Алгоритм

%

Тип

Фокус

Отсутствует

Однородн

Память

тупиков

смещенность

ость

 

 

 

 

Алгоритм

 

 

 

 

 

 

Олдоса–

14

Дерево

Оба

Да

Да

0

Бродера

 

 

 

 

 

 

Решение: 13%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Уилсона

24

Дерево

Оба

Да

Да

N2

Решение: 5%

 

 

 

 

 

 

Двоичное

 

 

 

 

 

 

дерево

24

Множество

Оба

Нет

Никогда

0

Решение: 3%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Recursive

13

Дерево

Проходы

Да

Никогда

N2

Backtracking

 

 

 

 

 

 

Решение: 22%

 

 

 

 

 

 

Рекурсивное

 

 

 

 

 

 

деление

24

Дерево

Стены

Да

Никогда

N

Решение: 7%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Эллера

24

Множество

Оба

Нет

Нет

N

Решение: 6%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

растущего

 

 

 

 

 

 

дерева

2/13/23

Дерево

Оба

Да

Нет

N2

Решение:

 

 

 

 

 

 

3/20/4%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Краскала

25

Множество

Оба

Да

Нет

N2

Решение: 5%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Прима

26

Дерево

Оба

Да

Нет

N2

(упрощ.)

 

 

 

 

 

 

Решение: 4%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Прима (мод.)

28

Дерево

Оба

Да

Нет

N2

Решение: 4%

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

Sidewinder

24

Множество

Оба

Нет

Никогда

0*

Решение: 4%

 

 

 

 

 

 

3

Решение. Это процент ячеек лабиринта, по которым проходит его решение для типичного лабиринта, создаваемого алгоритмом. Здесь предполагается, что лабиринт состоит из 100×100 проходов, а начало и конец находятся в противоположных углах. Этот параметр является показателем «извилистости» пути решения. Максимальную извилистость имеют одномаршрутные лабиринты, потому что решение проходит по всему лабиринту. Минимально возможную извилистость имеет двоичное дерево, у которого решение просто пересекает лабиринт и никогда не отклоняется и не приостанавливает движение по направлению к концу. Обычно генерация добавлением стен имеет те же свойства, что и вырезание проходов, но если значения сильно отличаются, то в скобках указывается процент в случае добавления стен.

Тупики. Это приблизительный процент ячеек, являющихся тупиками в лабиринте. Обычно при добавлении стен процент такой же, как и при вырезании проходов, но если они значительно отличаются, то в скобках указан процент при добавлении стен. Значение для алгоритма выращивания дерева на самом деле варьируется от 10% (если всегда выбирается самая новая ячейка) до 49% (если всегда выбирается самая старая ячейка). При достаточно высоком показателе проходов количество тупиков Recursive Backtracking может становиться ниже 1%. Наибольший вероятный процент тупиков в двухмерном ортогональном идеальном лабиринте равен 66% — это одномаршрутный проход с кучей тупиков единичной длины по обеим сторонам от него.

Тип. Существует два типа алгоритмов создания идеальных лабиринтов:

Алгоритм на основе дерева выращивает лабиринт подобно дереву, всегда добавляя к тому, что уже есть, и на каждом этапе имея правильный идеальный лабиринт.

Алгоритм на основе множеств выполняет построения там, где ему хочется, отслеживая части лабиринта, соединённые друг с другом, чтобы соединить всё и создать правильный лабиринт на момент завершения.

Фокус. Большинство алгоритмов можно реализовать или как вырезание проходов, или как добавление стен. Очень немногие можно реализовать только как один или другой подход. В одномаршрутных лабиринтах всегда используется добавление стен, потому что в них задействуется разбиение проходов стенами на две части, однако базовый лабиринт можно создать любым способом. Recursive Backtracking нельзя реализовать с добавлением стен, потому что в этом случае он склонен создавать путь решения, который следует вдоль внешнего края, где вся внутренняя часть лабиринта соединена с границей единственным проходом. Рекурсивное деление нельзя использовать для вырезания проходов, потому что это приводит к созданию очевидного решения, которое или следует вдоль внешнего края, или иначе напрямую пересекает внутреннюю часть.

Отсутствие смещенности. Одинаково ли воспринимает алгоритм все направления и стороны лабиринта так, что последующий анализ лабиринта не может обнаружить никакой смещенности проходов. Алгоритм двоичного дерева чрезвычайно смещён, в нём легко перемещаться в один угол и сложно в противоположный. Sidewinder тоже смещён, в нём легко перемещаться к одному краю и сложно к противоположному. Алгоритм Эллера склонен к созданию проходов, приблизительно синхронизируя начальные или конечные края.

Однородность. Генерирует ли алгоритм все возможные лабиринты с равной вероятностью. «Да» означает, что алгоритм полностью однороден. «Нет» означает, что

4

алгоритм потенциально может генерировать все возможные лабиринты в пределах любого пространства, но не с равной вероятностью. «Никогда» означает, что существуют возможные лабиринты, которые алгоритм никогда не сможет сгенерировать. Учтите, что только алгоритмы с полным отсутствием смещенности могут быть полностью однородными.

Память. Объём дополнительной памяти или стека, необходимый для реализации алгоритма. Эффективные алгоритмы требуют только битовой карты самого лабиринта, в то время как другие требуют объёма памяти, пропорционального одной строке (N), или пропорционального количеству ячеек (N2). Некоторым алгоритмам даже не нужно иметь в памяти весь лабиринт, и они могут добавлять части лабиринта бесконечно (такие алгоритмы помечены звёздочкой). Алгоритму Эллера нужен объём памяти для хранения строки, но большего ему не требуется, потому что достаточно хранить только одну строку лабиринта. Алгоритму Sidewinder тоже нужно хранить только одну строку лабиринта, в то время как двоичному дереву нужно отслеживать только текущую ячейку. Для рекурсивного деления требуется стек объёмом вплоть до размера строки, но ему не нужно смотреть на битовую карту лабиринта.

5

Источник: https://studfile.net/preview/16380301/