Pull to refresh

Из пушек по воробьям. Генерация и решение лабиринта не самым обычным способом

Level of difficultyMedium
Reading time19 min
Views4.7K

На уходящей неделе мне попалась симпатичная, хоть и не новая мини‑серия статей на Дзен‑канале @zdgzdgzdg про процедурную генерацию лабиринта методом «коллапса волновой функции». Пока я читал эти статьи и знакомился с кодом, меня осенило: ведь это же вычисления в комонаде, погружённые в монаду! Я не издеваюсь, действительно, речь идёт о композиции двух паттернов функционального программирования: комонады Zipper, превращающей локальные правила в глобальное состояние, и монады Random, позволяющей генерировать случайные объекты.

И вот, в качестве баловства на выходных, я решил реализовать этот «квантовый» алгоритм генерации лабиринтов на Haskell, используя и комонады и монады, и вообще, ни в чëм себе не отказывая. И хотя язык программирования Haskell нужен не только для извращений, но именно для них он подходит идеально!

Читать далее
Total votes 38: ↑38 and ↓0+38
Comments7

Поиск пути в ВГД-лабиринте

Level of difficultyMedium
Reading time8 min
Views1K

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

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

Для поиска кратчайшего пути будет использоваться алгоритм Дейкстры.

Читать далее
Total votes 7: ↑7 and ↓0+7
Comments7

Лабиринты: классификация, генерирование, поиск решений

Reading time44 min
Views81K

В этом классическом посте подробно рассказывается о самых популярных способах создания и прохождения лабиринтов. Статья разделена на четыре части: классификация, алгоритмы генерации, алгоритмы решения лабиринтов и другие операции с лабиринтами.

Классификация лабиринтов


Лабиринты в целом (а значит, и алгоритмы для их создания) можно разбить по семи различным классификациям: размерности, гиперразмерности, топологии, тесселяции, маршрутизации, текстуре и приоритету. Лабиринт может использовать по одному элементу из каждого класса в любом сочетании.
Читать дальше →
Total votes 82: ↑82 and ↓0+82
Comments13

Алгоритмы поиска решений лабиринтов и их практическое применение в реальном мире — Кит Берроуз и Ванесса Клотцман

Reading time18 min
Views8.6K

Первое упоминание термина “maze” датируется тринадцатым веком, а “labyrinth” — к четырнадцатым. Сама концепция лабиринтов восходит к эпохе греческого мифологического героя Тесея — древнего героя, успешно прошедшего Кносский лабиринт и сразившего Минотавра.

Однако в более современном контексте лабиринты не имеют ничего общего с убийством мифологических существ. Теперь лабиринты чаще всего представляют из себя прямоугольную головоломку, состоящую из коридоров и поворотов, которые в конечном итоге ведут к выходу. И точно так же, как древний герой Тесей путешествовал по лабиринту, чтобы сразить Минотавра, современный человек решает задачу поиска пути в лабиринте не только для того, чтобы найти выход из лабиринта, но и для гораздо более широкого круга целей — решения связанных задач наиболее эффективным и доступным образом.

Читать далее
Total votes 7: ↑6 and ↓1+5
Comments0

Открытка-лабиринт. Подарок, который невозможно открыть, не разгадав головоломку

Reading time4 min
Views61K
Однажды я принёс другу на день рождения подарок, завёрнутый в бумагу с узором лабиринта. Друг пошутил, что было бы здорово, если бы надо было по-настоящему найти путь, чтобы открыть подарок. Мы принялись обсуждать, как можно построить механический лабиринт, причём без использования какой-либо электроники.
Так родилась идея к следующему празднику создать открытку-головоломку. В этой статье я расскажу, как её изготовить и какие тонкости нужно учесть.


Лабиринт в процессе прохождения.
Читать дальше →
Total votes 151: ↑151 and ↓0+151
Comments51

Как создавать уникальные лабиринты

Reading time11 min
Views14K

Лабиринты на сегодняшний день всё ещё важны в развлекательной сфере. И это не только зеркальный лабиринт в парках аттракционов, но и видеоигры, ведь если посмотреть на карты и уровни в различных играх, то это всё один большой и сложный лабиринт, построенный по некоторым правилам.

А что если мы хотим тоже сделать свой интересный и уникальный лабиринт? Очевидно, нужно создать эти самые правила. Далее я постараюсь кратко, понятно и без лишних непонятных букв рассказать о разработке своего подхода к генерации различного рода лабиринтов. Объясню, почему я этим занялся, с чего начинал и как всё развилось до вполне приличного алгоритма на основе подхода и почему каждый из вас может взять этот подход за основу и адаптировать его под свои желания.
Погрузиться в мир лабиринтов
Total votes 45: ↑45 and ↓0+45
Comments14

Гениальный алгоритм создания лабиринтов в игре Entombed, который до сих пор не могут разгадать

Reading time5 min
Views80K


В 2017 двое ученых, канадец John Aycock и британка Tara Copplestone, опубликовали анализ классической игры Entombed для игровой приставки Atari 2600. Механика этой игры, выпущенной в 1982, крайне проста: археолог, управляемый игроком, должен пробраться по прокручивающимся снизу вверх катакомбам, уворачиваясь от зомби.

У Atari 2600 было всего 128 байт ОЗУ; тем не менее, кажущийся бесконечным лабиринт при каждом запуске был новым, т.е. генерировался в памяти. Как же программистам это удалось? Вот комментарий Стивена Сидли — программиста, 38 лет назад создавшего эту игру:
Основную часть генератора лабиринтов написал какой-то уволившийся торчок. Я связался с ним, чтобы выяснить, как его алгоритм работал. Он ответил, что придумал этот алгоритм, когда был вусмерть накурен и вдобавок пьян, что написал его сразу на ассемблере прежде чем вырубился, а потом даже близко не мог вспомнить, в чем его алгоритм состоял.
Читать дальше →
Total votes 126: ↑116 and ↓10+106
Comments72

Система генерации ландшафта лабиринта с улучшенным визуальным реализмом [перевод статьи Jinmo Kim]

Reading time9 min
Views5.1K

Привет, Хабр!


В этой публикации я расскажу о статье автора Jinmo Kim: "Maze Terrain Authoring System in Immersive Virtual Reality for New Visual Realism". Она была опубликована 4.04.2019. Полный текст статьи можно посмотреть здесь.


Краткое описание системы


В статье предложена авторская система создания лабиринтных ландшафтов, с помощью которой пользователь может автоматически генерировать различные сложные узоры в простой и интуитивно понятной системе. С помощью информации о лабиринте, рассчитанной в программе, быстро и эффективно генерируется трехмерный ландшафт лабиринта.


Предложенная система генерации ландшафта лабиринта состоит из трех основных функций:


  • функция автоматической генерации сетки лабиринта различных размеров и узоров, реализованная с помощью классического алгоритма генерации лабиринта;
  • функция генерации кругового лабиринта;
  • функция преобразования лабиринта из ручного эскиза в 3D объект с помощью алгоритма обработки изображений.

С помощью предложенной системы, состоящей из этих трех функций, можно эффективно создавать различные лабиринты, от однородных до нерегулярных. Эта разработка позволит генерировать лабиринтные ландшафты различных концепций напрямую из расчетов, сделанных через эту же систему. Кроме того, в этой работе проведен анализ улучшения эффекта присутствия и погружения в виртуальную реальность, т.е. визуального реализма. Также, в этой работе был проведен анализ пригодности предложенной авторской системы с помощью опроса.

Читать дальше →
Total votes 22: ↑22 and ↓0+22
Comments3

Классические алгоритмы генерации лабиринтов. Часть 2: погружение в случайность

Reading time12 min
Views31K


Предисловие


Первая часть

Итак. Оценив отклик аудитории Хабра и разобравшись с делами, я принялся за написание второй статьи из цикла. Реакция публики оказалась значительно позитивнее моих предположений, а значит, мы продолжаем разговор на одну из любопытнейших тем процедурной генерации – создание лабиринтов.

В этой части мы поговорим о том, что же такое случайная и псевдослучайная генерации, какие алгоритмы могут дать нам равновероятно ничем не похожие друг на друга лабиринты и в чем их минусы. Героями нашего сегодняшнего приключения станут алгоритм Уилсона и алгоритм Олдоса-Бродера для создания случайного остовного дерева (Uniform Spanning Tree). ОСТОРОЖНО ТРАФИК.
Читать дальше →
Total votes 47: ↑47 and ↓0+47
Comments25

Процедурная генерация лабиринтов в Unity

Reading time18 min
Views36K
image

Примечание: этот туториал написан для Unity 2017.1.0 и предназначен для опытных пользователей. Подразумевается, что вы уже хорошо знакомы с программирование игр в Unity.

Вы, как Unity-разработчик, наверно, имеете достаточный опыт в создании уровней вручную. Но хотели ли вы когда-нибудь генерировать уровни на лету? Процедурная генерация мешей для полов и стен, в отличие от простого расположения заранее созданных моделей, обеспечивает гораздо большую гибкость и реиграбельность игры.

В этом туториале вы научитесь следующему:

  • Процедурно генерировать уровни на примере создания игры про бег в лабиринте.
  • Генерировать данные лабиринтов.
  • Использовать данные лабиринтов для построения меша.

Приступаем к работе


В большинстве алгоритмов (таких, например, как этот и этот) создаются «идеальные» плотные лабиринты, то есть такие, у которых есть только один верный путь и нет петель. Они похожи на лабиринты, публикуемые в газетных разделах «Головоломки».


Однако в большинство игр приятнее играть, когда лабиринты неидеальны и в них есть петли. Они должны быть обширными и состоящими их открытых пространств, а не из узких извилистых коридоров. Это особенно справедливо для жанра rogue-like, в котором процедурные уровни являются не столько «лабиринтами», а скорее подземельями.


В этом туториале мы реализуем один из простейших алгоритмов лабиринтов, описанный здесь. Я выбрал его для того, чтобы реализовать лабиринты в игре с минимальным количеством усилий. Такой простой подход хорошо работает в классических играх, перечисленных по ссылке, поэтому мы можем использовать его для создания лабиринтов в игре под названием Speedy Treasure Thief.
Читать дальше →
Total votes 16: ↑15 and ↓1+14
Comments4

Робот в лабиринте: обучаемая нейроморфная система

Reading time10 min
Views3.6K


Одним из фундаментальных столбов научной фантастики (по крайней мере, с точки зрения читателя/зрителя) является робототехника. Если космические корабли, преодолевающие ограничения классической физики, являются символом достижения неведомых научных высот, то роботы часто символизируют превращения человека в Творца. Робот это не просто набор аппаратного и программного обеспечения, это символ сотворения жизни. Но что есть жизнь? А точнее, что можно считать жизнью? Амеба является живым организмом, но люди не особо стремятся создавать роботов по ее подобию. Напротив, мы стремимся создать нечто, что смогло бы конкурировать с нами не только по уровню интеллекта, т.е. объема знаний, но и было способно на мыслительный процесс. Другими словами, многие ученые стремятся создать жизнь по своему образу и подобию, что неминуемо приводит к появлению теологических аналогий. Но, как бы ученый свет не старался на этом поприще, пока что мыслящих роботов нет. Мыслящих, как человек, нет. А вот мыслящих на уровне мыши уже есть. Ученые из Технического университета Эйндховена (Нидерланды) создали робота, который имитирует мыслительные процессы мыши, дабы преодолеть лабиринт. В чем заключается аналогия с мышиным мозгом, способен ли робот принимать полноценные решения, и удалось ли ему найти выход из лабиринта? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.
Читать дальше →
Total votes 15: ↑15 and ↓0+15
Comments19

Бегущий в лабиринте: роботы, нейроны и резервуарные вычисления

Reading time9 min
Views2.8K


Как бы сильно писатели или сценаристы не старались создать образ сверхумных и сверхсильных роботов, в реальности же до глобального доминирования им еще очень и очень далеко. В чем их проблема? А в том, что мыслят они совершенно не так, как люди. Можно даже сказать, что современные роботы не мыслят, а выполняют вычислительные процессы. Мозг человека также выполняет эту задачу, но на гораздо более высоком и сложном уровне. Еще одним важным отличием является наше умение обучаться чему-то новому посредством периодического повторения выполняемой задачи. Другими словами, практика и еще раз практика. В отличие от роботов, никто не вкладывает в наше сознание навыки, как это происходит в повести «Профессия» Айзека Азимова. Получается, чтобы сделать роботов умнее (если это хорошая идея), необходимо научить их учиться. Группа ученых из Американского института физики (США) придумали, как обучить маленького робота преодолевать лабиринт, используя при этом самые настоящие нервные клетки мозга человека. Какие принципы лежат в основе разработки, насколько быстро обучался робот и удалось ли ему в итоге преодолеть лабиринт? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.
Читать дальше →
Total votes 12: ↑11 and ↓1+10
Comments2

Неприлично простая реализация неприлично простого алгоритма генерации лабиринта

Reading time6 min
Views40K
Продолжение этой статьи об очень простом алгоритме генерации прямоугольных лабиринтов. В этой статье я приведу мою реализацию алгоритма на С++, а также покажу несколько дополнительных функций, которые породил мой скучающий мозг. Если осмелитесь продолжить читать, убедитесь, что ознакомились с моей предыдущей статьей. Глянули? Молодцы, продолжаем.
Читать дальше →
Total votes 51: ↑39 and ↓12+27
Comments54

Классические алгоритмы генерации лабиринтов. Часть 1: вступление

Reading time8 min
Views60K


Предисловие


На написание статьи меня сподвигло практически полное отсутствие материалов на русском языке про алгоритмы генерации лабиринтов. На Хабре, из того, что вообще есть по теме, можно отметить две статьи: раз и два. Ценность и пользу из которых несет лишь вторая. В первой – просто перевод формального алгоритма и небольшое его пояснение. Что, конечно, неплохо, но очень скудно и не вызывает желания изучать тему дальше.

Если моя статья Вам понравится, я продолжу писать о различных алгоритмах. Мы рассмотрим два самых примитивных и простых случая – генерация двоичного дерева и Сайдвиндер, который, по своей сути, просто чуть измененная версия двоичного дерева с одним заметным плюсом. ОСТОРОЖНО ТРАФИК.
Читать дальше →
Total votes 68: ↑68 and ↓0+68
Comments35

Выбираемся из лабиринта при помощи алгоритма «поиск в ширину» (BFS) на Python

Reading time8 min
Views15K

Учимся использовать и реализовывать на Python алгоритм поиска в ширину (BFS) для решения реальных задач.

Давайте поговорим о популярном алгоритме, который называется «Поиск в ширину» (BFS). Затем реализуем этот алгоритм, чтобы найти решение для реальной задачи: как выбраться из лабиринта.

Алгоритмы поиска применяются для решения таких задач, которые можно смоделировать как графы. Каждый узел графа – это экземпляр задачи. Каждый поисковый алгоритм начинается с узла (исходный экземпляр – состояние) и наращивает вслед за этим узлом новые (то есть, новые экземпляры задачи), решая задачу допустимыми способами. Этот процесс останавливается, как только алгоритм находит решение (успех – конечное состояние) или не может создать ни одного нового узла (провал). Среди самых популярных алгоритмов поиска – поиск в глубину (DFS), поиск в ширину (BFS), жадный алгоритм, поиск по критерию стоимости (UCS), A*-поиск, т.д. В этой статье речь пойдет о поиске в ширину.

Читать далее
Total votes 10: ↑10 and ↓0+10
Comments0

Micromouse — а ваша робомышь пройдёт лабиринт?

Level of difficultyEasy
Reading time3 min
Views6K

Возможно, вы слышали про Micromouse — конкурс для маленьких роботов-мышей, которые должны быстрее всех найти путь в центр лабиринта. Лабиринт не очень большой, его размер 32х32 квадрата (раньше было 16x16) с длиной грани 9 см. Высота стенок каждой ячейки 2,5 см, толщина — 0,6 см.

Если не слышали, Cloud4Y предлагает узнать чуть больше об этом увлекательном (без шуток!) хобби.

Читать далее
Total votes 21: ↑21 and ↓0+21
Comments16

Генерация и решение лабиринта с помощью метода поиска в глубину по графу

Reading time6 min
Views114K
image

В этой статье речь пойдет о самом простом в реализации алгоритме генерации «идеального» лабиринта и его применении для поиска пути.

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

Заинтересовавшихся — прошу под кат.
Читать дальше →
Total votes 37: ↑35 and ↓2+33
Comments26

Чтобы двигаться быстро, решатели квантовых лабиринтов должны забыть о прошлом

Level of difficultyMedium
Reading time9 min
Views2.3K

Квантовые алгоритмы могут находить выход из лабиринтов экспоненциально быстрее, чем классические, за счет забывания путей, по которым они шли. Новый результат предполагает, что компромисс может быть неизбежен.  

Представьте, что вы посещаете лабиринт с друзьями. Вы вышли из выхода вскоре после входа и ждёте несколько часов, прежде чем появятся ваши друзья. Естественно, они спрашивают о пути, по которому вы шли — вы ведь можете проследить свои шаги и показать им путь, верно?

Неверно в мире, где правят странные законы квантовой физики. Двадцать лет назад исследователи квантовых вычислений разработали алгоритм, который использовал эти законы для прохождения опредёленного вида математического лабиринта намного быстрее, чем любой алгоритм, работающий на обычном классическом компьютере. Но за это ускорение приходится платить: быстрый квантовый алгоритм находит выход, но понятия не имеет, как он туда попал.

Исследователи давно задавались вопросом, неизбежен ли этот компромисс. Неужели невозможно быстро найти выход, не забыв дорогу?

Читать далее
Total votes 8: ↑7 and ↓1+6
Comments1

Генерация Лабиринта | Алгоритм Эллера

Level of difficultyEasy
Reading time5 min
Views9.7K

Алгоритм Эллера - это алгоритм генерации идеального лабиринта. Лабиринт считается идеальным, если у него нет замкнутых и зацикленных участков, и от любой точки до любой другой точки существует ровно один путь.

Читать далее
Total votes 26: ↑26 and ↓0+26
Comments19
1
23 ...