Подтвердить что ты не робот

Существуют ли полезные библиотеки для поиска путей для python?

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

Я удовлетворен результатами моего алгоритма - они дают иллюзию некоторого интеллекта, будучи детерминированным, и согласуются в любом направлении, так что два символа, нацеленные на места друг друга, будут сталкиваться посередине.

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

Я наткнулся на python-pathfinding, но это, кажется, медленнее, чем то, что я создал для моего использования.


Мой прецедент:

Мои карты строятся из уровней, которые окружены стенами (видимыми или невидимыми) и должны быть связаны дверями (видимыми или невидимыми).

Мой текущий подход состоит в том, чтобы иметь два разных алгоритма:

  • Внутри комнаты я просматриваю отдельные плитки как узлы с каждой границей как край с равной стоимостью, используя первую глубину в направлении целевого местоположения

  • Между комнатами, где каждая дверь node. Самый короткий путь через комнату (от двери до двери) вычисляется с использованием первого алгоритма и сохраняется в хеш-таблице в качестве стоимости края между этими узлами. Затем вычисляются наборы ребер, которые могут пересекаться, чтобы получить от одного node к другому, и также сохраняются в хэш-таблице, и не разрешено включать один и тот же ребро более одного раза в один и тот же путь.

Я запускаю отдельный процесс при запуске, который генерирует график для второго алгоритма с использованием первого, и это решает многие из моих проблем, комнаты, как правило, относительно малы и поэтому наказание "на лету" - поиск остается ниже, чем в противном случае, а затем на большие расстояния:

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

Ответ 1

Прежде всего, я знаю довольно эффективную и универсальную библиотеку для обработки алгоритма поиска A *. Это lib2dp. Вы можете легко подключить свой python-сгенерированный граф в эту библиотеку и получить быстрый ответ.

Во-вторых, A * по существу хорош для нахождения оптимального пути в соответствии с этим:

  • У вас есть полная и полная информация о вашем окружении.
  • Ваше окружение считается "статическим".

Если вы нарушите одно из этих правил, вы можете рассмотреть альтернативный алгоритм, называемый D* '.

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

Ответ 2

Если вы можете уменьшить свою игровую среду в графике, то http://networkx.lanl.gov/ имеет много хороших встроенных алгоритмов для такого рода вещей.

Ответ 3

Если у вас уже есть версия python, вы довольны, то почему бы не запустить ее через py2cmod? Это должно дать вам большую часть пути к версии вашего текущего алгоритма.

Другой альтернативой является psyco, хотя у него высокие накладные расходы.

Ответ 4

Вы можете проверить libtcod и обертку libtcodpy Python. Лично, однако, мне не очень нравится, как обертка не очень Pythonic, будучи излишне монолитной script с чрезмерным использованием префиксов имени функции (по крайней мере, в последний раз, когда я ее использовал). Я реорганизовал обертку в один момент и исправил ее для Python 3, но это было год назад, и поэтому с тех пор все может измениться.