Найдите путь от точки A до B за X шагов. (A * ish) - PullRequest
4 голосов
/ 19 ноября 2011

В настоящее время я ищу способ визуализации данных, и часть алгоритма требует чего-то на 99% такого же, как A * Path Finding, но я не могу полностью обернуть его вокруг. Я знаю, что это будет довольно простая модификация. (удельная стоимость вместо наименьшей стоимости)

По сути, мне нужно построить путь (2D Grid, без диагоналей) из точки A в точку B за количество шагов X.

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

Есть ли известное имя для этого алгоритма, или его использование настолько редко, что это редкость?

В настоящее время я смотрю на этот AS3 Librbay для модификации, поскольку он, по-видимому, очень быстрый и кажется мне чистым и простым: http://www.dauntless.be/astar/

Любой совет / помощь с благодарностью ...

John

Ответы [ 3 ]

3 голосов
/ 19 ноября 2011

Мне нравится этот вопрос - это интересно.

Я не уверен, как бы я это написал, но это всего лишь мысли из головы.

По сути, вы имеете дело с Манхэттенским расстоянием здесь, поскольку вы не используете диагонали. Таким образом, вам нужно знать кратчайший путь и извлечь из него. Если ваша конкретная стоимость меньше расстояния до Манхэттена, путь невозможен. Если он равен, идеальный путь - это ваш кратчайший путь.

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

Также обратите внимание, что для некоторых ситуаций не будет решения, потому что вы используете расстояние Манхэттен! Например, если у вас есть сетка 6x6 с начальной точкой в ​​одном углу и конечной точкой в ​​противоположном углу, вы можете закончить конечную точку за 10 шагов, но не за 11 (потому что вам нужно удвоиться на себя). Уверен, в этом есть правило, но я должен его вывести. (Опять же, в макушке моей головы.) ( РЕДАКТИРОВАТЬ: Я понял это - это на самом деле не правило как таковое, но ваши конкретные затраты не могут находиться между кратчайшим расстоянием пути и вторым кратчайшим расстояние пути. Второй кратчайший путь в манхэттенской сетке должен быть n + 2, я полагаю.)

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

Впрочем, попробуйте. Звучит довольно интересно!

ВТОРОЕ РЕДАКТИРОВАНИЕ: Я только что понял ... Ваши затраты на путь всегда будут увеличиваться на два (опять же, из-за расстояния Манхэттена). Это означает, что вы можете оптимизировать немного больше, если вы знаете свое кратчайшее расстояние; Ваша конкретная стоимость должна быть кратна 2 плюс кратчайшее расстояние. В алгоритмическом выражении у вас будет определенная стоимость = 2n + кратчайшее расстояние.

Однако после этого вам придется перебрать его.

Надеюсь, это поможет.

ТРЕТЬЕ РЕДАКТИРОВАНИЕ (и, надеюсь, последнее): Я, наверное, немного педантичен здесь (и я, наверное, выясняю, что другие разобрались со мной до меня), но вот сделка. Если вы знаете свою конкретную стоимость и знаете кратчайшее расстояние пути, вы можете фактически взять разницу между ними и разделить на два, чтобы выяснить, сколько петель вам нужно на вашем пути. Циклы могут «складываться» (и я имею в виду, что вы можете запустить цикл и продолжить его на расстоянии; это «удвоение назад»), поэтому вы можете оптимизировать даже дальше , проверяя только пути, которые иметь определенное количество петель. Однако к этому времени вы в значительной степени нашли возможный путь к конечному узлу (при условии, что препятствия не блокируют все возможные пути, которые вы нашли). Таким образом, грубое принуждение будет необходимо только для того, чтобы избежать каких-либо препятствий. Я надеюсь, что это имело смысл.

0 голосов
/ 19 ноября 2011

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

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

Ваш вопрос нуждается в уточнении, но я дам ответы на обе возможности, которые я нашел:

Путь без повторяющихся пятен :

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

Путь с повторяющимися пятнами

Найдите кратчайший путь с базовым A *, затем, если он меньше, чем требуемая стоимость, увеличьте стоимость, перемещаясь назад и вперед (вы добавляете +2 к стоимости, возвращаясь назад) к своему пути или преобразовывая простой шаг в цикле (вы добавляете +2 к стоимости с каждым циклом).

0 голосов
/ 19 ноября 2011

A * по замыслу не может этого сделать. Я бы использовал алгоритм Дейкстры и перебрал все возможные пути (начиная с самого короткого), пока вы не найдете тот, который соответствует вашим критериям. Я не могу придумать более простой способ, так как может быть любое количество путей, которые удовлетворяют этим критериям (включая 0).

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