¿Cuál es la mejor manera de procesar consultas de accesibilidad en un DAG con restricciones?

Si el gráfico es escaso, es probable que desee algún tipo de representación de lista de borde como su estructura de datos principal en lugar de una solución de matriz basada en matriz, que es cómo funciona Floyd-Warshall.

Este problema ha sido atacado anteriormente de varias maneras (http://www.w3.org/TR/rdf-sparql-…), pero creo que sería un gran proyecto de investigación simple. Mis sugerencias:

  1. Primero descubra la semántica y la sintaxis de su lenguaje de consulta y manténgalo básico. Analizar un lenguaje de consulta puede no ser trivial en sí mismo, y probablemente no quiera pasar la mayor parte de su tiempo en él.
  2. Recuerda el wazoo. Una implementación clásica de Dijkstra implica hacer de cada nodo un montón, con los miembros del montón como los bordes y sus pesos en el gráfico original. En esencia, comienza con el montón del nodo en el que comienza, hace estallar su raíz, luego se une con el montón de la raíz anterior, vuelve a apilar y luego continúa hasta llegar al destino. Esto encuentra su camino más corto (o más largo) muy rápidamente – O (| E | log | V |), de hecho.
  3. Almacene los resultados de los cálculos intermedios lo mejor que pueda en un tipo de caché o DP. Las soluciones recursivas ingenuas en un gráfico disperso no trivial serán enormemente costosas en términos de tiempo, por lo que cualquier cosa que pueda hacer para optimizarlo será útil.
  4. Puede valer la pena mantener una representación basada en matriz para ciertas operaciones que desea hacer. Por ejemplo, puede encontrar fácilmente todas las rutas de longitud N desde cualquier fila R a cualquier columna C exponiendo la matriz N veces.

1. Si sabe que va a realizar consultas de manera uniforme sobre todos los vértices, entonces una forma sería ejecutar Floyd-Warshall sobre el gráfico y utilizar esos resultados en (lo que creo que debería ser) una estructura de datos bastante estándar para rango / consultas booleanas. De lo contrario, si su gráfico es enorme y no necesita información para todos los vértices de inmediato, crear un camino más corto a pedido sería un mejor enfoque. Si su gráfico es prohibitivamente grande, también podría buscar algoritmos de ruta más corta aproximada.