Реализация: Если вы ищете обзор кода, разместите рабочий код на CodeReview.StackExchange.com. Вероятно, они могут дать вам советы по оптимизации.
Алгоритм: Вот несколько соображений с алгоритмической точки зрения.
Прежде всего, взгляните на свою эвристику. Если эвристические оценки слишком малы, A * вырождается до алгоритма Дикстры. Если эвристические оценки слишком высоки, A * вырождается в жадный лучший первый поиск. A * с допустимой эвристикой находится где-то посередине: он создает оптимальный путь, но поддержание оптимальности требует дополнительного времени вычисления. Если вы готовы пожертвовать оптимальностью, вы можете выбрать эвристику, которая иногда переоценивает расстояние до цели. Таким образом, пути не гарантируются как оптимальные, но жадность алгоритма может сократить время выполнения.
Кроме того, если мир статичен (то есть макет известен a priori), вы можете предварительно вычислить много информации, чтобы ускорить поиск. Для выполнения этой задачи существует несколько алгоритмов. Swamps - это подход, который предварительно вычисляет области, которые обычно искажаются без необходимости (то есть болота). Если вы не путешествуете в болото или выходите из него, регионы не нужно искать во время работы. Ускорение, связанное с болотами, сильно зависит от топографии в мире; более обманчивые карты (т. е. те, которые ведут к поиску болот) могут принести много пользы.
Другим подходом является использование иерархического подхода к поиску путей, такого как HPA*. Это может значительно увеличить производительность на карте размером с ваш (8000x8000, yikes). HPA * работает, группируя регионы в связанные локальные кластеры и вычисляя затраты на пересечение границ кластера a priori. Затем поиск выполняется на нескольких уровнях: высокоуровневое усилие фокусирует поиск, используя заранее рассчитанные затраты, а низкоуровневое усилие определяет точный путь, который будет использоваться.
Кроме того, существуют алгоритмы для уменьшения числа узлов, исследованных A *, используя характеристики среды во время выполнения. Например, Jump Point Search (JPS) использует тот факт, что сетчатые графы (например, тот, который вы используете) часто демонстрируют симметрии. Если движение в вашем мире имеет постоянные затраты, JPS может «пропустить» множество узлов в поиске и сократить время поиска на значительную сумму. Я видел, что он сократил время поиска A * на 24x, другие видели более 30-кратное улучшение.
Последнее замечание: из того, что я могу сказать, вы используете пути L1 (т. Е. 4-кардинальные направления).У вас может быть много шансов получить путем предварительной обработки путей между путевыми точками и использования дифференциальной эвристики. См. this article для демонстрации и обсуждения реализации JavaScript here.
Дополнительные ссылки:
Большое вам спасибо за предоставленную мне всю информацию. Я буду читать и попробовать все это, надеюсь, что это поможет мне решить мои проблемы. – FrancisOrb