|
Нужен алгоритм прохождения лабиринта | ☑ | ||
---|---|---|---|---|
0
poi
16.09.14
✎
16:19
|
Нужен алгоритм прохождения лабиринта.
Классический алгоритм дает решение для одного проходящего. В итоге имеем карту лабиринта. А мне нужен такой, когда проходящих несколько (как-бы распараллеливание процесса составление карты лабиринта). |
|||
1
1cVandal
16.09.14
✎
16:31
|
один идет левой рукой стену касается, другой правой(в разные стороны по одной стене) можно по разным стенам
|
|||
2
Fram
16.09.14
✎
16:34
|
не знаю как работает классический, в школе решал через рекурсию
|
|||
3
18plus
16.09.14
✎
16:36
|
(1) + на каждом ветвлении можно добавлять нового проходящего с другой рукой.
|
|||
4
RomanYS
16.09.14
✎
16:38
|
(0) это программная задача или жизненная
в любом случае интересны детали |
|||
5
18plus
16.09.14
✎
16:39
|
(4) жизненная конечно, потерялся чувак :)
|
|||
6
anatoly
16.09.14
✎
16:41
|
...проходящих несколько...
а сколько входов/выходов? |
|||
7
aka AMIGO
16.09.14
✎
16:41
|
классическая схема прохождения лабиринта - скользить одной рукой по стене, не прерывая контакт
|
|||
8
Кай066
16.09.14
✎
16:45
|
(3) нельзя, круги может начать внутри лабиринта нарезать
|
|||
9
Kamas
16.09.14
✎
16:48
|
(7) есть еще алгоритм Заполнения или поиска в ширину
|
|||
10
Asmody
16.09.14
✎
16:48
|
Если "ходок" может себя "клонировать", то на каждом перекрестке клонируем по количеству доступных путей - 1, отмечаем перекресток как посещенный и каждый идет своим путем до следующего перекрестка. Там операцию повторяем. Кто-то найдет выход, остальные либо упрутся в тупик, либо будут ходить по кругу.
|
|||
11
Asmody
16.09.14
✎
16:50
|
Точнее не так: если один из клонов попал в тупик или на посещенный перекресток, то он аннигилируется.
|
|||
12
Крошка Ру
16.09.14
✎
16:52
|
(10) Как отличить ходящего по кругу от не ходящего, но пока не дошедшего до выхода?
|
|||
13
13_Mult
16.09.14
✎
16:56
|
||||
14
Asmody
16.09.14
✎
16:57
|
(12) из (11) следует, что в "живых" останется только нашедший выход
|
|||
15
13_Mult
16.09.14
✎
17:00
|
||||
16
poi
16.09.14
✎
17:07
|
(13) (13) это все для одного проходящего.
процесс последовательный. когда проходящих несколько, то надо как-то координировать их усилия по прохождению, чтобы по нескольку раз не ходили уже хожденные тупики/кольца. Асмоди хорошо придумал с клонированием, но задача для ограниченного количества проходящих. Хотя, если развить мысль, то момент уничтожения очередного клона можно отождествлять с рождением нового в новой точке. Осталось только оптимизировать путь, который проходит нечто с момента смерти по момент рождения. |
|||
17
Asmody
16.09.14
✎
17:18
|
(16) тогда раздать всем маркеры - красный и цветной каждому свой. Коридор по еоторому вошли отмечаем красным, коридор куда уходим отмечаем своим цветом. Если попали в тупик, то возвращаемся назад на шаг. Если есть незакрашенные коридоры, идем туда, если нет - садимся и плачем.
|
|||
18
ws_mason
16.09.14
✎
17:19
|
А мне бы наоборот. Алгоритм создания лабиринта, с тонкими стенками, не по клеточкам.
|
|||
19
18plus
16.09.14
✎
17:22
|
(16) деление идущих на развилках + отмечать уже топтанные дорожки, если текущий идущий наткнулся на хоженную дорожку - его дезинтегрируем и двигаем остальных.
|
|||
20
Asmody
16.09.14
✎
17:22
|
Не, не плачем, идем еще на шаг назад. Кто-то выйдет из лабиринта, остальные врнутся ко входу.
|
|||
21
Asmody
16.09.14
✎
17:25
|
Это же задача поиска путей в графе :-)
|
|||
22
Ёпрст
16.09.14
✎
17:29
|
(0) волновой алгоритм поиска пути подойдёт ?
|
|||
23
poi
16.09.14
✎
17:29
|
(21) ну так "лабиринт" сказано - чтоб не распугать публику.
|
|||
24
poi
16.09.14
✎
17:29
|
(22) сейчас посмотрю
|
|||
25
Ёпрст
16.09.14
✎
17:30
|
в школе заставляли его писать
|
|||
26
Ёпрст
16.09.14
✎
17:30
|
был еще какой-то алгоритм, тоже простецкий, не помню.
|
|||
27
Asmody
16.09.14
✎
17:35
|
(22) а как его распараллелить?
|
|||
28
Ёпрст
16.09.14
✎
17:41
|
(27) ну, запускать несколько волн с разных точек, только зачем ? Когда он один сам всё найдёт (выход, т.е)
|
|||
29
Ёпрст
16.09.14
✎
17:41
|
ну, а если дырку (выход) заткнуть - "заполнит" весь лабиринт
|
|||
30
Зойч
16.09.14
✎
18:18
|
Ищи многопоточный обход дерева
|
|||
31
Зойч
16.09.14
✎
18:20
|
Кстати правило правой руки не всегда решает лабиринт
|
|||
32
Зойч
16.09.14
✎
18:21
|
||||
33
DrZombi
гуру
17.09.14
✎
08:41
|
(7) А если Лабиринт зациклен? :)
|
|||
34
Эмбеддер
17.09.14
✎
08:44
|
на самом деле если зайти в лабиринт и идти вдоль любой стены, постоянно поворачивая в ее сторону, мы никогда не зациклимся. исходное расположение -у в входа, сама площадь лабиринта - прямоугольная. кто не согласен - нарисуйте свой вариант в качестве примера
|
|||
35
Эмбеддер
17.09.14
✎
08:45
|
(34) + т.е. я имею в виду, что вариант (7) полностью правильный и зациклиться не получится)))
|
|||
36
Лодырь
17.09.14
✎
08:50
|
А волновой алгоритм не проще сюда присобачить?
|
|||
37
aka AMIGO
17.09.14
✎
08:55
|
(33) вообще-то - да..
(35) неее.. я переумничал.. :) представь себе столб, любой толщины, скользим по одной стене, совершаем бесконечный цикл.. а если весь лабиринт состоит из таких "столбов", то проблема может статься длиною в жизнь :) Вот пример трех таких (стобовых :) ) образований, как решить проблему - выше моего сознания :) http://gyazo.com/fde8fb26c3b9ece2aa6d0bd871f4248f |
|||
38
aka AMIGO
17.09.14
✎
08:56
|
стобовых = "столбовых"
|
|||
39
aka AMIGO
17.09.14
✎
08:58
|
+37 ну, разве что оставить заметный след, чтоб не повторять путь
|
|||
40
Mefistophel
17.09.14
✎
09:03
|
(37) если идти срого по стене то на такие "столбовые" "островки" ты никогда не попадешь. Если речь про клонов на ответвлениях то там же идея с маркировкой есть, которая решает эту проблему.
|
|||
41
Эмбеддер
17.09.14
✎
09:03
|
(37) если скользить например вдоль правой стены, то мы до столба никогда не дотронемся. ну, только если страртовали возле столба, так мы и выйдем сразу же из лабиринта)))
|
|||
42
aka AMIGO
17.09.14
✎
09:08
|
(40) (41) это зависит от того, когда человек, вошедший в лабиринт, опроблемился выходом :)
если зашел глубоко - замучится искать стенку :) |
|||
43
anatoly
17.09.14
✎
09:09
|
(32) проходится и по левой руке и по правой.
|
|||
44
Mefistophel
17.09.14
✎
09:10
|
(42) а, если точка "входа" в лабиринт произвольная - то только маркировка
|
|||
45
Wasya
17.09.14
✎
09:26
|
Алгоритмов обхода лабиринта в общем случае всего два
1) Поиск в ширину; 2) Поиск в глубину. Если иследователи лабиринта могут телепоритроваться в любую точку лабиринта, то поиск в ширину вполне подходит. В противном случае, придется использовать поиск в глубину. Но в этом случае, придется мириться, что на исследователей выпадет различная нагрузка. кто то быстро закончит свою часть исследований, а кто то будет долго блуждать по лабиринту. |
|||
46
aka AMIGO
17.09.14
✎
09:36
|
(45) куда этому горемыке податься? :) http://gyazo.com/33e3db803e8e295a7f28fc0be41d4d9b
|
|||
47
Asmody
17.09.14
✎
10:34
|
(46) вот так он пойдет по правой руке с раскраской https://drive.google.com/file/d/0Bx2wnhT98YCeVmY3cDFmS0dzc1k/edit?usp=sharing
|
|||
48
Chai Nic
17.09.14
✎
10:50
|
(34) Ну да, но обычно задача ставится не пройти лабиринт, а выйти из него. То есть, исходная точка может где угодно оказаться, в том числе и возле "цикла" по правую/левую руку.
|
|||
49
Лодырь
17.09.14
✎
10:51
|
(27) Кстати, распараллелить можно простейшим способом на два потока, используя метод встречной волны. А если есть waypoint'ы то и на большее количество потоков.
|
|||
50
an-korot
17.09.14
✎
11:59
|
Еще для разнообразия добавить условие, на какое расстояние видит поисковик или можно видеть на несколько клеток? )))
|
|||
51
1Сергей
17.09.14
✎
12:04
|
алгоритм построения лабиринта куда интереснее, имхо
|
|||
52
Domovoi
17.09.14
✎
13:37
|
Что-то не догоняю в чем проблема? Ищем путь через рекурсию с сохранением координат прохода, когда наткнулись на тупик или на место где уже были прекращаем итерацию рекурсии. В итоге или найдем выход или определим что выхода нет. (естественно если лабиринт без телепортов и постоянен во времени)
Проход по левую руку, это повыпендриваться перед 5 летним ребенком:) Реально этот метод не работает. |
|||
53
Domovoi
17.09.14
✎
13:43
|
+(52)(и если одноэтажный лабиринт)
|
|||
54
Ёпрст
17.09.14
✎
14:26
|
(51) такие тоже есть, даже с реализацией..
|
|||
55
Ёпрст
17.09.14
✎
14:26
|
||||
56
vmlspb
17.09.14
✎
14:28
|
Алгоритм A*
|
|||
57
Ник второй
17.09.14
✎
17:10
|
(55) Киньте на другой файлообменник, а то инфостарт не удобный.
|
|||
58
Torquader
17.09.14
✎
17:59
|
Решение задачи с алгоритмом прохождения лабиринта нужно начинать с вопроса о хранении лабиринта в памяти компьютера.
|
|||
59
Torquader
17.09.14
✎
18:13
|
Если мы применяем правило правой или левой руки при выходе из лабиринта (когда мы неизвестно как попали в какую-то точку), то в случае наличия в лабиринте циклов правило может не позволит выйти.
Если же мы применяем правило на входе в лабиринт, то даже если в нём и есть циклы и несвязные области, то мы всегда останемся в той области, которая выходит на границу - другими словами - всегда выйдем наружу снова, но или через данный вход или через другой. |
|||
60
Torquader
17.09.14
✎
18:22
|
Если мы можем запоминать координаты лабиринта и "возвращаться" в нужную точку, то можно хоть построчно его анализировать - такая задача ничего общего с прохождением лабиринта не имеет.
P.S. конечно, следует понимать, что лабиринт плоский и не имеет ходов на разных уровнях по высоте - задача прохождения трёхмерного лабиринта кардинально отличается о прохождения двухмерного (хотя, в случае, с возможностью "запоминания" маршрута можно делать что угодно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |