Estimados compañeros programadores,
Estamos desarrollando software que simula el tráfico vehicular. Parte del proceso llamado "asignación" se refiere a la asignación de vehículos a sus rutas y tiene que usar algún tipo de algoritmo de búsqueda de ruta más corta.
Tradicionalmente, las personas hacen esto con Dijkstra, y cierta literatura científica parece indicar que A * y otras alternativas no ofrecen ninguna mejora significativa, tal vez debido a la naturaleza del gráfico.
Por lo tanto, también estamos usando Dijkstra. Surgió un pequeño problema porque, si trata los enlaces de tráfico (tramos de carreteras entre intersecciones) como bordes e intersecciones como nodos, no puede obtener un gráfico unidireccional clásico: al acercarse a una intersección, el lugar donde puede girar con frecuencia depende de de dónde vienes, mientras que en un gráfico tradicional puedes tomar cualquier ventaja de un nodo.
Resolvimos este problema con bastante facilidad al representar un par de enlace-intersección (llámelo "listón") como un nodo. Dado que necesitaría atravesar un enlace para llegar a cualquier "listón" o punto de elección subsiguiente, un borde se definiría como este recorrido y obtendrá un gráfico típico.
Los resultados se almacenan en una tabla simple, N x N, donde N es el número de "listones".
Aquí está el inconveniente (¿inevitable?). Si una red típica para nuestra simulación puede tener, digamos, 2000 intersecciones, tendrá alrededor de 6000 enlaces, es decir, N = 3V. Obviamente, si se cuenta en términos de intersecciones (V), ahora estamos hasta O (log (3V) * (3V + E)).
Podría argumentar que 3 (o 9) es un factor constante, pero desde el punto de vista práctico, ralentiza bastante las cosas y aumenta el espacio de almacenamiento a 3V x 3V.
¿Alguien tiene alguna idea de cómo podemos reestructurar esto para mejorar el rendimiento? ¿No es necesariamente un algoritmo alternativo, tal vez remodelar las estructuras de datos para que se ajusten a un gráfico de alguna otra manera?