2011-01-07 22 views
12

Descargo de responsabilidad: Tengo poca formación en Java, dado que soy predominantemente un desarrollador de C#.Implementación de un algoritmo Star (A *) en Java

Me gustaría tener la implementación java del algoritmo A *.
Sí, vi muchas versiones del mismo en línea y no puedo elegir entre ellas.

Estoy buscando una implementación de algoritmo A * que use todas las características nuevas de java que hace que el algoritmo sea más rápido (aunque sea un poco). La razón es que estamos implementando eso para buscar rutas en un MMO y, por lo tanto, el rendimiento es la principal prioridad.

¿Alguna sugerencia (al menos dónde mirar)?

+4

¿Puede darnos enlaces a las versiones que ya encontró? Y, por cierto, usar "nuevas características de Java" no hará que un algoritmo sea más rápido. – darioo

+2

El enlace expiró de nuevo, aquí está lo más nuevo para alguien como yo que encuentre esto: https://github.com/graphhopper/graphhopper/blob/master/core/src/main/java/com/graphhopper/routing/AStar.java –

+0

@BattleBarnes el A * bidireccional incluido es incluso más rápido – Karussell

Respuesta

22

Pruebe varias, mida, elija la más rápida, adáptese a sus necesidades. El rendimiento está principalmente determinado por la elección de la función heurística, que es independiente de A * propiamente dicha.

Si la heurística es fija, es probable que la implementación de la cola de prioridad se convierta en el cuello de botella, así que intente pairing heaps. Estas son algunas de las estructuras de datos de montón más rápidas en la práctica, y tienen la ventaja sobre los montones binarios que permiten O (1) tiempo de inserción + O amortiguado (log n) pop-min. Esto es importante en el caso esperado de muchos bucles A *, donde se llena la cola, pero nunca se vacía por completo, es decir, el número de inserciones es mucho mayor que el número de estallidos.

Si la memoria se convierte en un problema, cambie a la profundización iterativa A * (IDA *) o la búsqueda recursiva de la mejor primera búsqueda (RBFS).

Si nada funciona, considere usar un algoritmo de aproximación (búsqueda codiciosa). Simplemente optimizando un bucle A * decentemente escrito no se obtendrán tremendas aceleraciones.

Consulte los algoritmos para obtener una buena discusión de los problemas y Russell and Norvig.

+0

¿Qué estructura de datos se debe utilizar para el 'closedList'? – st0le

+0

Una tabla hash. O un árbol rojo-negro. O un árbol splay. O lo que sea que sea más rápido. @ st0le, tiene razón en que esto es importante, pero en mi experiencia, los conjuntos rápidos son más fáciles de obtener que las colas de prioridad rápida. –

+0

@ sk0le: si se necesita un conjunto cerrado, eso es. –

9

Si el rendimiento es su principal prioridad, A * probablemente no sea su mejor opción. A * proporciona una solución exacta, y como resultado seguirá procesando hasta que encuentre la respuesta correcta. Existen otras soluciones livianas que brindan soluciones lo suficientemente buenas en tiempos mucho más rápidos: por ejemplo, la escalada montada o la mejor primero, incluso una simple profundidad primero.

+1

+1. Optimizar el código A * no le dará al OP un trofeo de rendimiento. –

+0

-0, como sí, A * probablemente no sea tan eficiente, pero las alternativas que necesita son técnicas de aceleración específicas para buscar rutas, como jerarquías de contracción y similares. – Karussell

Cuestiones relacionadas