Минимальное расстояние между началом и концом при прохождении обязательных точек в лабиринте

Итак, предположим, у меня есть лабиринт, у которого есть начальная и конечная точки, отмеченные оранжевым и красным соответственно, и моя цель — найти минимальное расстояние между ними. Заблокированный путь представлен черным цветом, а открытый путь представлен белым цветом. Однако есть две модификации, сделанные в этом.

  1. Есть несколько обязательных для посещения ячеек, отмеченных серым цветом.
  2. Любая ячейка может быть посещена любое количество раз (даже точки старта, финиша и обязательного посещения)

например: B=черный, W=белый, G=серый, R=красный, O=оранжевый

         BBBBBB                 BBBBB
         BBGBBB                 BWGGB
MAZE1 => BOWGRB     MAZE2  =>   BOBBB
         BBGBBB                 BWWRB
         BBBBBB                 BBBBB

Вот в этом случае и будет

MAZE1 => M[2][1] => [2][2] => [1][2] => [2][2] => [3][2] => [2][2] => [2][3] => [2][4]  = 7
MAZE2 => M[1][1] => [1][2] => [2][2] => [3][2] => [3][3] => [3][2] => [2][2]            = 6

Как видите, узлы появляются несколько раз.

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

Поэтому я подумал об использовании этого способа.

  1. Я буду отслеживать все координаты обязательных к посещению точек, начальные и конечные точки
  2. Найдите расстояние между каждым узлом (как и в сортировке выбором, мы сравниваем каждый термин, точно так же мы получаем минимальное расстояние между каждым узлом (используя BFS))
  3. Затем примените некоторый алгоритм минимального расстояния. Я подумал о TSP, но он говорит, что узлы должны быть посещены ровно один раз. Здесь это может быть несколько раз. Я нашел проблему китайского почтальона, но не знаю, можно ли ее применить здесь. Алгоритм Флойда Варшалла есть, но он не включает все точки

Как мне поступить, есть идеи?


person zero infinity    schedule 22.08.2014    source источник
comment
Этот вопрос, кажется, известен в наши дни, я видел как минимум 3 вопроса об этом. Могу я узнать, откуда у вас этот вопрос?   -  person Pham Trung    schedule 22.08.2014
comment
Это известно? Я только что скопировал оригинальный вопрос о лабиринте. Но теперь, когда я думаю об этом, это может быть очень полезно в робототехнике. Были ли ответы на эти вопросы раньше? Не могли бы вы поделиться ссылкой :)   -  person zero infinity    schedule 22.08.2014
comment
Например, это и это должно быть той же проблемой, что и у вас   -  person Pham Trung    schedule 22.08.2014
comment
Итак, я был на правильном пути, на самом деле это плагиат TSP   -  person zero infinity    schedule 22.08.2014
comment
Так что на самом деле это происходит так: начало-›перестановка всех обязательных пунктов-›конец. И сумма всех этих расстояний должна быть равна минимальной. Так что это будет как S-›должен указатьA-›должен указать B -> должен указать C... ->Цель не так ли??   -  person zero infinity    schedule 22.08.2014
comment
Добавил свой ответ, пожалуйста, посмотрите :)   -  person Pham Trung    schedule 22.08.2014
comment
И другой два Очень похожи недавно заданные вопросы.   -  person tobias_k    schedule 22.08.2014
comment
@tobias_k вау, внезапно это напомнило мне о моем старом школьном проекте, выглядишь подозрительно!   -  person Pham Trung    schedule 22.08.2014


Ответы (1)


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

Во-первых, предположим, что сумма начального, конечного и серого узла равна N, а начало равно 0, конец равен N-1, а серый узел равен от 1 до N-2.

Мы видим, что мы можем представить state в любой момент времени как (mask, index), где индекс представляет текущий узел, в котором мы находимся, а маска представляет все узлы, которые мы уже посетили (0 ‹ маска ‹ 2^N).

Сначала состояние равно (1,0) или (00000 ... 1,0), что означает, что посещается только город 0, наша цель - достичь состояния (2^N - 1, N - 1), что означает все узлы посещаются, и мы заканчиваем путешествие на узле N - 1.

Итак, на данный момент мы можем легко увидеть, что мы преобразовали исходную задачу в граф состояний, и наша цель — найти кратчайший путь из состояния 0 (1,0) в конец состояния (2^N — 1). , N - 1), поэтому, применяя алгоритм поиска кратчайшего пути Дейкстры для этого нового графа, мы получаем ответ.

Примечание: ответ сделан на основе одного предположения, что N ‹= 17

Еще одно замечание: для робототехники кратчайший путь может не обязательно быть лучшим путем, поскольку скорость робота различна при повороте и при движении по прямой.

person Pham Trung    schedule 22.08.2014
comment
Джикстрас не жадный и, возможно, не лучший. Я не понял даже всей этой маски. Я предполагаю, что маска будет представлена ​​целым числом, а целое число - 32 бита. Значит, должно быть 2^32, верно? У вас есть ссылка, на которую я могу сослаться или может быть, если вы можете решить maze2. Там N равно 4. Матрица расстояний в этом случае {{0,2,3,3}, {2,0,1,5}, {3,1,0,6}, {3,5,6, 0}}. Спасибо :) - person zero infinity; 23.08.2014
comment
@zeroinfinity вы должны сначала изучить технику битовой маски, например, если вы уже посетили города 0 и 2, поэтому маска равна 3, или двоичный код равен 0101 (установлены только биты 0 и 2), аналогично, если все города посещены, маска равна 15, что равно 1111 в двоичном формате (установлены все 4 бита). Дейкстрас жадный, но в этом случае он всегда возвращает лучшее значение. Обратите внимание, что график для Дейкстры представляет собой не просто город к городу, а (маска, город) к (маска, город). - person Pham Trung; 23.08.2014
comment
И какой будет вес между узлами (маска,город) и (маска,город). Расстояние между городами, верно? И в приведенной выше проблеме изначально у нас было бы 4 узла, все инициализированные с маской 0, за исключением (начальный узел, который равен 1). Затем мы находим минимальное расстояние, переходим в это состояние и обновляем его значение маски и минимальное расстояние (или значение узла или значение вершины, как бы мы это ни говорили), и мы делаем это, пока не достигнем (2 ^ (N-1), Н-1). Я правильно понимаю или должно быть что-то другое - person zero infinity; 23.08.2014
comment
@zeroinfinity правильно, это идея :) рад, что вы это понимаете! Остальная часть работы заключается в реализации правильного алгоритма Дейкстры. - person Pham Trung; 23.08.2014
comment
@zeroinfinity вы можете легко сохранить расстояние, используя двумерный массив dist[1<<N][N] (1‹‹N — бит сдвига, эквивалентный 2^N), во-первых, последнее состояние ((2^N) — 1, N — 1), а не (2^(N-1), N-1) - person Pham Trung; 23.08.2014