Вы находитесь на странице: 1из 20

Algoritmos de Busqueda

Qu es un Algoritmo de
Busqueda?

Algoritmos que buscan


propiedades especficas
coleccin de objetos.

un objeto
dentro de

con
una

Algoritmos que buscan un estado especfico en


un conjunto de estados.
Algoritmos que consiguen un camino entre un
punto A y un punto B (Pathfinding).

Qu es un Algoritmo de
Busqueda?
Existen muchos Algoritmos de Busqueda como:

BFS

DFS

IDFS

Dijkstra

A*

IDA*

Breadth First Search (BFS)

Conocido en espaol como busqueda en


anchura.
Inventado en 1950s por E. F. Moore.
Creado inicialmente para resolver el problema
del laberinto.
Se utiliza una cola (FIFO) para almacenar
resultados intermedios.
Se utiliza un grafo para representar el espacio
de soluciones.

Breadth First Search (BFS)

Breadth First Search (BFS)


Algoritmo:
1. Encola el primer nodo.
2. Desencola el tope de la cola.
3. Si el tope corresponde al estado que se desea
alcanzar se termina la busqueda y se retorna un
resultado
4. En caso contrario, se debe encolar todos los
estados adyacentes que no hayan sido visitados y
colocarlos como visitados.
5. Si la cola esta vaca, entonces ya se recorri el
espacio de busqueda y no se consigui el estado
que se deseaba alcanzar.
6. En caso contrario, regresar al paso 2.

Breadth First Search (BFS)


Pseudo - Codigo:
//G Grafo que representa el espacio de busqueda
//r Estado inicial del grafo
function BFS(G,r){
Queue Q;
Q.push(r);
r.visited= true;
while(!Q.isEmpty()){
t= Q.pop();
if(t == Solution)
return t;
for(v : t.neighbor()){
if(!v.visited){
v.visited= true;
Q.push(v);
}
}
}
return null;
}

Breadth First Search (BFS)


Algunas Aplicaciones:

Conseguir el camino ms corto entre dos puntos


de un grafo cuya aristas tienes el mismo costo.

Hallar componentes conexos de un grafo.

Verificar si un grafo es bipartito.

Depth First Search (DFS)

Conocido en espaol como busqueda en


profundidad.
La primera versin del DFS fue investigado en el
siglo 19 por el matemtico Charles Pierre
Trmaux como una estratregia para resolver
laberintos.
Se utiliza una pila (LIFO) para almacenar
resultados intermedios.
Se utiliza un grafo para representar el espacio
de soluciones.

Depth First Search (DFS)

Depth First Search (DFS)


Algoritmo:
1. Apila el primer nodo.
2. Desapila el tope de la pila.
3. Si el tope corresponde al estado que se desea
alcanzar se termina la busqueda y se retorna un
resultado
4. En caso contrario, se debe apilar todos los estados
adyacentes que no hayan sido visitados y
colocarlos como visitados.
5. Si la pila esta vaca, entonces ya se recorri el
espacio de busqueda y no se consigui el estado
que se deseaba alcanzar.
6. En caso contrario, regresar al paso 2.

Depth First Search (DFS)


Pseudo - Codigo:
//G Grafo que representa el espacio de busqueda
//r Estado inicial del grafo
function DFS(G,r){
Stack S;
S.push(r);
r.visited= true;
while(!S.isEmpty()){
t= S.pop();
if(t == Solution)
return t;
for(v : t.neighbor()){
if(!v.visited){
v.visited= true;
S.push(v);
}
}
}
return null;
}

Depth First Search (DFS)


Algunas Aplicaciones:

Conseguir un camino entre dos puntos de un


grafo.
Hallar componentes conexos de un grafo.
Generador
de
Laberintos
agregando
aleatoriedad en la eleccin de los vecinos.

BFS vs DFS
BFS

DFS

Si existe solucin asegura


conseguirla

No asegura conseguir una solucin.

Consumo de memoria aumenta de


manera exponencial.

El consumo de memoria est


reducido al camino que se est
recorriendo actualmente y los
diferentes desvos en dicho camino.

O(|V| + |E|)

O(|V| + |E|)

Consigue Mejor Solucin

Consigue una Solucin

Sera bueno que existiera un algoritmo que tomara


las mejores cosas de ambos algoritmos

Iterative Deepening First


Search (IDFS)

Mezcla la eficiencia en memoria del DFS con la


seguridad en conseguir un resultado del BFS.
Supone un DFS donde no se verifica si un nodo ya
fue visitado y se tiene un limite de profundidad.
Su nombre se debe a que si no logra conseguir una
solucin, aplica nuevamente el algoritmo con un
limite de profundidad mayor.

Iterative Deepening First


Search (IDFS)
Ejemplo:

Suponga el siguiente grafo

Si se aplica un DFS tradicional, el orden de visitados


quedara:
A,B,D,F,E,C,G

Iterative Deepening First


Search (IDFS)
Ejemplo:

Suponga el siguiente grafo

Si ahora se aplica un DFS sin recordar los nodos


visitados, el orden de visitados quedara:
A,B,D,F,E,A,B,D,F,E...

Iterative Deepening First


Search (IDFS)
IDFS previene los ciclos al limitar la profundidad de
busqueda en el grafo.
Profundidad

Recorrido

A,B,C,E

A,B,D,F,C,G,E,F

A,B,D,F,E,C,G,D,E,F,B

Iterative Deepening First


Search (IDFS)
Pseudo - Codigo:
function IDFS(G,r){
for(i=0; i<10; i++){
t= DLS(G,r,i);
if(t != null) return t;
}
}

function DLS(G, r, limit){


Stack S;
S.push(r);
r.steps= 0;
while(!S.isEmpty()){
t= S.pop();
if(t == Solution)
return t;
if(t.steps<limit)
for(v : t.neighbor()){
S.push(v);
v.steps= t.steps + 1;
}
}
return null;
}

Iterative Deepening First


Search (IDFS)

Como se debe recorrer mltiples veces los primeros


nodos puede parecer inutil.
Sin embargo, en arboles bien balanceados termina
no siendo tan costoso pues la mayora de los nodos
se encuentran en los niveles ms bajos del rbol.
Su complejidad en tiempo
balanceados es O(bd) donde:

en

arboles

bien

b es la cantidad mxima de hijos por nodo.

d es la profundidad mxima.

Se utiliza cuando el espacio de busqueda es muy


largo y no se conoce a que profundidad se
encuentra la solucin.

Вам также может понравиться