Desde un punto de vista conceptual, imagine tirar una piedra en un estanque y observar las ondas. Las rutas representarían el estanque y la piedra su posición inicial.
Por supuesto, el algoritmo debería buscar alguna proporción de n^2 rutas a medida que aumenta la distancia n. Usted tomaría la posición inicial y verificaría todos los caminos disponibles desde ese punto. Luego, recursivamente, pida los puntos al final de esos caminos, etc.
Puede aumentar el rendimiento, al no hacer doble respaldo en una ruta, al no volver a verificar las rutas en un punto si ya se ha cubierto y al renunciar a las rutas que llevan demasiado tiempo.
Una forma alternativa es utilizar el enfoque de feromonas de hormigas, donde las hormigas se arrastran aleatoriamente desde un punto de inicio y dejan un rastro de olor, que acumula el mayor número de hormigas que cruzan una ruta determinada. Si envía (suficientes) hormigas desde el punto de inicio y el punto final, finalmente la ruta con el aroma más fuerte será la más corta. Esto se debe a que el camino más corto se habrá visitado más veces en un período de tiempo determinado, dado que las hormigas caminan a un ritmo uniforme.
EDITAR @ Spikie
Como explicación más detallada de cómo implementar el algoritmo de estanque - estructuras de datos necesarios potenciales se destacan:
Tendrá que guardar el mapa como una red. Esto es simplemente un conjunto de nodes
y edges
entre ellos. Un conjunto de nodes
constituye un route
. Un borde une dos nodos (posiblemente ambos del mismo nodo) y tiene un cost
asociado, como distance
o time
para atravesar el borde. Un borde puede ser bidireccional o unidireccional. Probablemente, lo más simple es tener unidireccionales y duplicar para un viaje de dos vías entre nodos (es decir, un borde de A a B y uno diferente para B y A).
Por ejemplo, imagine tres estaciones de ferrocarril dispuestas en un triángulo equilátero apuntando hacia arriba. También hay otras tres estaciones a medio camino entre ellos. Los bordes unen todas las estaciones adyacentes, el diagrama final tendrá un triángulo invertido dentro del triángulo más grande.
Nodos de etiquetas comenzando desde la esquina inferior izquierda, yendo de izquierda a derecha y arriba, como A, B, C, D, E, F (F en la parte superior).
Supongamos que los bordes se pueden atravesar en cualquier dirección. Cada borde tiene un costo de 1 km.
Ok, por lo que deseamos pasar de la parte inferior izquierda A a la estación superior F. Hay muchas rutas posibles, incluidas las que se duplican, p. Ej. ABCEBDEF.
Tenemos una rutina decir, NextNode
, que acepta un node
y un cost
y se llama a sí mismo para cada nodo que puede viajar.
Claramente, si permitimos que esta rutina se ejecute, eventualmente descubrirá todas las rutas, incluidas las que son potencialmente de una longitud infinita (por ejemplo, ABABABAB, etc.). Detendemos que esto suceda al verificar en el cost
. Cada vez que visitamos un nodo que no ha sido visitado anteriormente, colocamos tanto el costo como el nodo del que venimos contra ese nodo. Si se ha visitado un nodo antes de verificar el costo existente y si somos más baratos, actualizamos el nodo y continuamos (recursión). Si somos más caros, salteamos el nodo. Si se omiten todos los nodos, salimos de la rutina.
Si alcanzamos nuestro nodo objetivo, también salimos de la rutina.
De esta manera se verifican todas las rutas viables, pero crucialmente solo las de menor costo. Al final del proceso, cada nodo tendrá el costo más bajo para llegar a ese nodo, incluido nuestro nodo objetivo.
Para obtener la ruta trabajamos hacia atrás desde nuestro nodo de destino. Como almacenamos el nodo del que venimos junto con el costo, simplemente saltamos hacia atrás para construir la ruta. Para nuestro ejemplo podríamos terminar con algo como:
nodo A - (Total) Costo 0 - Desde el nodo Ninguno
Nodo B - Costo 1 - Desde el nodo A
nodo C - Costo 2 - Desde el Nodo B
Nodo D - Coste 1 - Del nodo A
Nodo E - Costo 2 - Desde el nodo D/Costo 2 - Desde el nodo B (esta es una excepción ya que hay un costo igual)
Nodo F - Costo 2 - Desde el nodo D
Así que la ruta más corta es ADF.
Los mapas son generalmente demasiado grandes para permitir los algoritmos estándar de ruta más corta, tendrás que construir algunas heurísticas para seleccionar un subgráfico. Además, puede utilizar enfoques heurísticos completamente diferentes (por ejemplo, autopistas primero ...) para encontrar una ruta. –