¿Qué k-mejor algoritmo de ruta más corta debo considerar?

13

Estoy resolviendo un problema de optimización de búsqueda de gráficos. Necesito encontrar las k mejores rutas acíclicas más cortas a través de un gráfico ponderado dirigido.

Sé que hay una serie de algoritmos k-best exactos y aproximados, pero la mayor parte de la investigación reciente parece estar orientada hacia gráficos muy grandes y muy poco conectados (por ejemplo, enrutamiento y direcciones de carreteras), y mi gráfico no lo es.

Aspectos distintivos de mi problema:

  • El gráfico consta de aproximadamente 160 vértices.

  • El gráfico está casi completamente conectado (bidireccionalmente, entonces ~ 160 ^ 2 ~ = 25k bordes)

  • k será bastante pequeño (probablemente menos de 10)

  • La longitud máxima de la ruta probablemente será limitada y también muy pequeña (por ejemplo, 3-5 bordes)

  • Dije "acíclico" arriba, pero solo para reiterar: las soluciones no deben incluir ciclos. Este no es un problema para la mejor ruta más corta, pero se convierte en un problema para k-mejor; por ejemplo, considere una ruta de ruta: la segunda ruta más corta de A a B podría ser la misma que la 1 mejor, con un viaje rápido alrededor de una cuadra en alguna parte. Eso podría ser matemáticamente óptimo, pero no es una solución muy útil. ;-)

  • Es posible que necesitemos volver a pesar los bordes sobre la marcha para cada cálculo. Un costo de borde consiste en una suma ponderada de varios factores, y los requisitos finales (siempre que los obtengamos) pueden permitir que un usuario especifique su propia priorización de esos factores de ponderación, alterando los pesos de borde. Este es un gráfico relativamente pequeño (deberíamos poder representarlo en unos pocos cientos de KB), por lo que probablemente sea razonable clonar el gráfico en la memoria, aplicar la nueva ponderación y luego ejecutar la búsqueda en el gráfico clonado. Pero si hay un método más efectivo para realizar la búsqueda mientras se calculan los pesos sobre la marcha, me interesa.

Estoy viendo los algoritmos descritos en Santos (K algoritmos de ruta más corta), Eppstein 1997 (Encontrar las k rutas más cortas) y otros. El algoritmo de Yen es de interés, principalmente debido a la implementación de Java existente . No tengo miedo de leer los trabajos de investigación, pero pensé que valía la pena tirar los detalles de mi problema y pedir consejos para ahorrar algo de tiempo de lectura.

Y si tiene punteros a las implementaciones de Java, aún mejor.

AaronD
fuente
+1, porque estoy interesado en las sugerencias que tiene la gente, y este parece ser el tipo exacto de pregunta para la que se hizo este sitio.
KChaloux
¿Su condición acíclica no significa que CUALQUIER otra ruta desde el principio hasta el objetivo crearía un ciclo con la primera ruta? Y si tanto el inicio como el gol están en un callejón sin salida, cada camino debe usar estos dos bordes.
user470365
Quizás no estaba claro. La restricción acíclica se aplica solo a una sola ruta; naturalmente, cualquier 2 rutas distintas de A a B formarán un ciclo.
AaronD
@AaronD: entonces, ¿cuál usaste al final?
Dagnelies
@arnaud: No estoy seguro de que haya decidido utilizar un algoritmo todavía; Agregaré una actualización a esta pregunta cuando la tenga. Eliminé Eppstein porque no garantiza soluciones acíclicas (también conocidas como 'simples'). Actualmente estoy trabajando con el algoritmo de Yen, pero aún no he llegado a la creación de perfiles u optimización detallada, por lo que es posible que deba reemplazarlo por otro. Actualizaré en la próxima semana o dos.
AaronD

Respuestas:

2

Para responder parcialmente mi propia pregunta:

Desde que publiqué esta pregunta, descubrí que necesitamos manejar pesos de borde negativos y positivos (la limitación a las rutas acíclicas / simples / sin bucle significa que la mejor solución está definida, mientras que sin esa limitación la ruta más corta a través de un gráfico con negativo- los ciclos de costos no están definidos).

El algoritmo de Yen, y la mayoría de los otros que examiné, dependen de una serie de 1 mejores búsquedas; la mayoría usa Dijkstra para esas búsquedas intermedias. Dijkstra no admite pesos de borde negativos, pero podemos sustituir a Bellman-Ford en su lugar (al menos en yenes; presumiblemente también en Lawler o Eppstein). Desarrollé una modificación de Bellman-Ford con una limitación de longitud de ruta (en bordes) y verificación de ciclo explícita durante la búsqueda (en lugar de la detección estándar del ciclo posterior a la búsqueda). La complejidad computacional es peor, pero aún manejable para mis requerimientos. Editaré esta respuesta y vincularé a un informe técnico si obtengo permiso para publicarlo.

AaronD
fuente
1

Yo diría que esta pregunta se puede buscar fácilmente en Google y también es un duplicado:

Dicho esto, ya usé e implementé Eppstein y lo recomiendo. Lo encontré bastante elegante. Si recuerdo bien, también puede ser óptimo, y el siguiente artículo lo explica muy bien:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf

dagnelies
fuente
Primero, gracias por la recomendación de Eppstein. Buscaré más allí. Yo diría que este no es un duplicado exacto, ni es fácil de google; es fácil encontrar un algoritmo k-best, pero no es tan fácil elegir con sensatez entre ellos. Espero que quisiera un algoritmo muy diferente para un gráfico de millones de vértices escasamente conectado del que necesitaría para este problema. Me gustaría mucho más sobre la complejidad en k si quisiera el mejor 1000 en lugar de 10 mejores. Y, aunque los factores constantes no son tan importantes cuando se publican artículos, sí lo son al enviar el código de producción.
AaronD
@AaronD: solo para su información, creo que el algoritmo es muy eficiente en cualquier caso. Tal vez hay casos especiales en los que las búsquedas impulsadas por la heurística lo superan, pero para el caso general, creo que funciona muy bien. El rendimiento exacto probablemente dependerá más de cómo exactamente lo implemente, la eficiencia de sus estructuras de datos y qué tan adaptado esté a su problema.
Dagnelies
@arnaud Hola, ¿es posible que compartas la implementación de tu eppstein? Tengo una pregunta similar publicada aquí: math.stackexchange.com/questions/1661737/…
Tina J