Este documento presenta conceptos básicos sobre árboles y grafos, incluyendo definiciones, representaciones, recorridos y métodos de búsqueda como profundidad primero, anchura primero y heurística. Explica cómo reconstruir un árbol binario a partir de sus recorridos y cómo aplicar búsqueda en profundidad para recorrer un grafo de manera sistemática.
23. %Ejemplo de Búsqueda en Profundidad Clauses encuentra_ruta:- write(" Desde : "),readln(A), write(" con Destino a: "), readln(B), hay_vuelo (A,B,D), write("La distancia es: ",D),nl,not(muestra_ruta). % Ver si hay conexió n entre dos ciudades con ruta directa hay_vuelo(C1,C2,D): -v uelo(C1,C2,D),agrega_a_ruta(C1). % Búsqueda en Profundidad hay_vuelo(C1,C2,D):- vuelo(C1,X,D2), agrega_a_ruta(C1), hay_vuelo(X,C2,D3), D=D2+D3. % Indica si llegó a punto sin destino hay_vuelo(C1,_,D):-write(" Punto muerto en ",C1),nl,D=0,fail. agrega_a_ruta(C):-not(visitada(C)),assert(visitada(C)),!. agrega_a_ruta(_). muestra_ruta:- write(" La ruta es "),nl, visitada(A),write(A),nl,fail,!.
26. % Ejemplo de Búsqueda en Anchura % Ruta directa hay_vuelo(C1,C2,D):- v uelo(C1,C2,D), agrega_a_ruta(C1). % hacer primero en anchura hay_vuelo(C,C2,D):- vuelo(C,X,D2), vuelo(X,C2,D3), agrega_a_ruta(C), agrega_a_ruta(X), D= D2+D3. hay_vuelo(C,C2,D):- vuelo(C,X,D2), X<>C2, agrega_a_ruta(C), hay_vuelo(X,C2,D3), D=D2+D3. hay_vuelo(C1,_,D):- write("Punto muerto en ",C1), nl,D=0,fail.
27.
28.
29. % Ejemplo de Búsqueda Heurística Remonte de Colina hay_vuelo(T,T2,D):-vuelo(T,T2,D),agrega_a_ruta(T). % hacer primero en anchura hay_vuelo(T,T2,D):- encontrar _m a s_grande(T,X), agrega_a_ruta(T),vuelo(T,X,D2), hay _vuelo(X,T2,D3), D=D2+D3. hay_vuelo(T,T2,D):- vuelo(T,X,D2), X<>T2, agrega_a_ruta( T ),hay_vuelo(X, T 2,D3), D=D2+D3. hay_vuelo(C1,_,D):- write(" Punto muerto en ",C1), nl,D=0,fail. encontrar_mas_grande( A , B ):- vuelo(A,X,D), vuelo(A,Y,D2),X<>Y, D2>D, B=Y.
30. % Ejemplo de Búsqueda Heurística Menor Coste hay_vuelo(T,T2,D):-vuelo(T,T2,D),agrega_a_ruta(T). % hacer primero en anchura hay_vuelo(T,T2,D):- encontra r _m a s_corta(T,X), agrega_a_ruta(T),vuelo(T,X,D2), hay _vuelo(X,T2,D3), D=D2+D3. hay_vuelo(T,T2,D):- vuelo(T,X,D2), X<>T2, agrega_a_ruta( T ),hay_vuelo(X, T 2,D3), D=D2+D3. hay_vuelo(C1,_,D):- write(" Punto muerto en",C1), nl,D=0,fail. encontrar_mas_ corta ( A , B ):-vuelo(A,X,D), vuelo(A,Y,D2), X<>Y, D>D2, B=Y.
33. Búsqueda primero en profundidad. Muchos algoritmos de grafos necesitan visitar de un modo sistemático todos los vértices de un grafo. En la búsqueda en profundidad se avanza de vértice en vértice, marcando cada vértice visitado. La búsqueda siempre avanza hacia un vértice no marcado, internándose “profundamente” en el grafo sin repetir ningún vértice. Cuando se alcanza un vértice cuyos vecinos han sido marcados, se retrocede al anterior vértice visitado y se avanza desde éste.
34. Búsqueda primero en profundidad. .. Tema 4. Grafos. operación bpp (v: nodo) marca[v]:= visitado para cada nodo w adyacente a v hacer si marca[w] == noVisitado entonces bpp(w) finpara operación BúsquedaPrimeroEnProfundidad BorraMarcas para v:= 1, ..., n hacer si marca[v] == noVisitado entonces bpp(v) finpara
35.
36.
37. Ejemplo. Grafo no dirigido Búsqueda primero en profundidad: Equivalente al recorrido en preorden de un árbol.