Имя: Пароль:
IT
 
Нужен алгоритм прохождения лабиринта
,
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. конечно, следует понимать, что лабиринт плоский и не имеет ходов на разных уровнях по высоте - задача прохождения трёхмерного лабиринта кардинально отличается о  прохождения двухмерного (хотя, в случае, с возможностью "запоминания" маршрута можно делать что угодно.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан