que suponiendo que no tienen ningún heuristic function acerca de la distancia al objetivo, la mejor solución que sea válida es bi-directionalBFS:
Algoritmo idea: hacer una búsqueda BFS simultáneamente desde el origen y el destino: [BFS hasta la profundidad 1 en ambos, hasta la profundidad 2 en ambos, ....].
El algoritmo finalizará cuando encuentre un vértice v, que está en el frente de ambos BFS.
Comportamiento del algoritmo: El vértice v que finaliza la ejecución del algoritmo estará exactamente en el medio entre la fuente y el objetivo.
Este algoritmo arrojará resultados mucho mejores en la mayoría de los casos, luego BFS de la fuente [explicación de por qué es mejor que BFS], y seguramente proporcionará una respuesta, si existe.
¿por qué es mejor que BFS desde la fuente?
suponga que la distancia entre el origen y el destino es k
, y el factor de bifurcación es B
[cada vértice tiene bordes B].
BFS se abrirá: 1 + B + B^2 + ... + B^k
vértices.
BFS bidireccional se abrirá: 2 + 2B + 2B^2 + 2B^3 + .. + 2B^(k/2)
vértices.
para grandes B y K, el segundo es obviamente mucho mejor que el primero.
EDIT:
NOTA, que esta solución no requiere almacenar todo el gráfico en la memoria, que sólo requiere la aplicación de una función: successor(v)
que devuelve todos los sucesores de un vértice [todos los vértices se puede llegar a, dentro de 1 paso de v]. Con esto, solo se deben almacenar los nodos que abra [2 + 2B + ... + 2B^(k/2)
como se explicó anteriormente]. Para ahorrar aún más memoria, puede usar Iterative Deepening DFS desde una dirección, en lugar de BFS, pero consumirá más tiempo.
¿Puede proporcionar un ejemplo de captura de pantalla y datos o algo para aquellos que no tienen LinkedIn? – Zirak
¿Te refieres a distancias de círculo grandes? http://en.wikipedia.org/wiki/Great-circle_distance –
@Zirak puedes ver mi ejemplo, edité la publicación – JohnJohnGa