Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Búsqueda en Amplitud
Objetivo
El objetivo de este documento es proporcionar una explicación
clara del algoritmo de Búsqueda en Amplitud y su implementación
en Python. El documento tiene como objetivo ilustrar la utilidad
del algoritmo en la resolución de problemas que involucren
encontrar el camino más corto entre dos nodos en un grafo.
Además, busca demostrar cómo funciona el algoritmo y
proporcionar una guía paso a paso para implementarlo en Python.
Problema
Solución
La solución para poder resolver el problema es con el algoritmo
de búsqueda en amplitud, para ello hay que tener en cuenta el
espacio de los estados, los estados del puzzle (inicial y final)
y cuáles son las operaciones permite pasar de un estado a otro.
Herramientas
Para la implementación de los algoritmos, sin importar el tamaño
de los elementos, tiene código que no afecta directamente en el
funcionamiento.
Clase: Nodo
Es un objeto que permite relacionar jerárquicamente con otros
elementos similares
class Nodo:
self.datos = datos
self.hijos = None
self.padre = None
self.coste= None
self.set_hijos(hijos)
self.hijos=hijos
if self.hijos != None:
for h in self.hijos:
h.padre = self
def get_hijos(self):
return self.hijos
def get_padre(self):
return self.padre
self.padre = padre
self.datos = datos
def get_datos(self):
return self.datos
self.coste = coste
def get_coste(self):
return self.coste
if self.get_datos() == nodo.get_datos():
return True
else:
return False
en_la_lista=False
for n in lista_nodos:
if self.igual(n):
en_la_lista=True
return en_la_lista
def __str__(self):
return str(self.get_datos())
# Desencapsulando la matriz
[estado_inicial] = crear_estado(4, 1)
matriz = []
contador = 0
return matriz
Función promedio
Es una función para promediar los pasos de cada tipo de puzzle
def promedio(elementos):
suma = 0
Implementación
Lineal
solucionado=False
nodos_visitados=[]
nodos_frontera=[]
nodoInicial = Nodo(estado_inicial)
nodos_frontera.append(nodoInicial)
nodo=nodos_frontera.pop(0)
nodos_visitados.append(nodo)
if nodo.get_datos() == solucion:
# solucion encontrada
solucionado=True
return nodo
else:
dato_nodo = nodo.get_datos()
# operador izquierdo
hijo_izquierdo = Nodo(hijo)
if not hijo_izquierdo.en_lista(nodos_visitados) \
and not hijo_izquierdo.en_lista(nodos_frontera):
nodos_frontera.append(hijo_izquierdo)
# operador central
hijo_central = Nodo(hijo)
if not hijo_central.en_lista(nodos_visitados) \
and not hijo_central.en_lista(nodos_frontera):
nodos_frontera.append(hijo_central)
# operador derecho
hijo_derecho = Nodo(hijo)
if not hijo_derecho.en_lista(nodos_visitados) \
and not hijo_derecho.en_lista(nodos_frontera):
nodos_frontera.append(hijo_derecho)
Ampliado
solucionado=False
nodos_visitados=[]
nodos_frontera=[]
nodoInicial = Nodo(estado_inicial)
nodos_frontera.append(nodoInicial)
nodo=nodos_frontera.pop(0)
nodos_visitados.append(nodo)
if nodo.get_datos() == solucion:
# solucion encontrada
solucionado=True
else:
dato_nodo = nodo.get_datos()
hijo_izquierdo_externo = Nodo(hijo)
if not hijo_izquierdo_externo.en_lista(nodos_visitados) \
and not hijo_izquierdo_externo.en_lista(nodos_frontera):
nodos_frontera.append(hijo_izquierdo_externo)
hijo_izquierdo_interno = Nodo(hijo)
if not hijo_izquierdo_interno.en_lista(nodos_visitados) \
and not hijo_izquierdo_interno.en_lista(nodos_frontera):
nodos_frontera.append(hijo_izquierdo_interno)
# operador central
hijo_central = Nodo(hijo)
if not hijo_central.en_lista(nodos_visitados) \
and not hijo_central.en_lista(nodos_frontera):
nodos_frontera.append(hijo_central)
hijo_derecho_interno = Nodo(hijo)
if not hijo_derecho_interno.en_lista(nodos_visitados) \
and not hijo_derecho_interno.en_lista(nodos_frontera):
hijo_derecho_externo = Nodo(hijo)
if not hijo_derecho_externo.en_lista(nodos_visitados) \
and not hijo_derecho_externo.en_lista(nodos_frontera):
nodos_frontera.append(hijo_derecho_externo)
Bidimensional
solucionado=False
nodos_visitados=[]
nodos_frontera=[]
nodoInicial = Nodo(estado_inicial)
nodos_frontera.append(nodoInicial)
nodo=nodos_frontera.pop(0)
nodos_visitados.append(nodo)
if nodo.get_datos() == solucion:
# solucion encontrada
solucionado=True
return nodo
else:
# operador 1
hijo=[[dato_nodo[0][1], dato_nodo[0][0]], [dato_nodo[1][0], dato_nodo[1][1]], [dato_
nodo[2][0], dato_nodo[2][1]]]
hijo_1 = Nodo(hijo)
if not hijo_1.en_lista(nodos_visitados) \
and not hijo_1.en_lista(nodos_frontera):
nodos_frontera.append(hijo_1)
# operador 2
hijo_2 = Nodo(hijo)
if not hijo_2.en_lista(nodos_visitados) \
and not hijo_2.en_lista(nodos_frontera):
nodos_frontera.append(hijo_2)
# operador 3
hijo_3 = Nodo(hijo)
if not hijo_3.en_lista(nodos_visitados) \
and not hijo_3.en_lista(nodos_frontera):
nodos_frontera.append(hijo_3)
# operador 4
hijo_4 = Nodo(hijo)
if not hijo_4.en_lista(nodos_visitados) \
and not hijo_4.en_lista(nodos_frontera):
nodos_frontera.append(hijo_4)
# operador 5
hijo_5 = Nodo(hijo)
if not hijo_5.en_lista(nodos_visitados) \
and not hijo_5.en_lista(nodos_frontera):
nodos_frontera.append(hijo_5)
Resultados