Академический Документы
Профессиональный Документы
Культура Документы
Nombres:
Maestro(a):
Facultad de ingeniería
Ingeniería de sistemas
Nombres:
Maestro:
Ingeniería de sistemas
2019
INTRODUCCIÓN
OBJETIVOS ESPECÍFICOS
Hacer uso del backtracking para encontrar la mejor combinación de variables para solucionar
un problema
Analizar cómo funciona el backtraking en el problema planteado
Explicar cómo funciona el algoritmo y sus tipos de evaluación
¿QUÉ ES BÚSQUEDA EN PROFUNDIDAD?
Es un algoritmo de búsqueda no informada utilizado para recorrer todos los nodos de un grafo
(o árbol) de manera ordenada pero no uniforme. Se expande todos los nodos que se van
localizando en un camino correcto, cuando ya no queden más nodos por recorrer en ese camino
se regresa (Back tracking) de modo que repite el mismo proceso con cada uno de los hermanos
del nodo ya procesado.
EVALUACIÓN (CARACTERÍSTICAS)
Completitud: DFS es completo si y solo si usamos búsqueda basada en grafos en espacios de
estado finitos, pues todos los nodos serán expandidos, también existirá una solución dentro de
ese estado finito.
Optimalidad: DFS en ningún caso asegura la optimalidad, pues puede encontrar una solución
más profunda que otra en una rama que todavía no ha sido expandida.
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas
completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten
en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las
restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos
para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se
puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el tiempo
de ejecución.
Ahora vemos cada consulta, la primera nos indica que impulsaré el domino numero 1, entonces al
hacer ello los dominos que caerán serán 1 -> 2 -> 5 ->3, debo retornar 4 la cantidad de dominos
caidos. Para la segunda consulta caéran solamente 4->3, y finalmente para 6 caerán 6->7->8
laberinto.actualizarPosicion(filaInicio, columnaInicio)
if laberinto[filaInicio][columnaInicio] == OBSTACULO :
return False
if laberinto[filaInicio][columnaInicio] == INTENTADO:
return False
if laberinto.esSalida(filaInicio,columnaInicio):
laberinto.actualizarPosicion(filaInicio, columnaInicio, \
PARTE_DEL_CAMINO)
return True
if encontrado:
laberinto.actualizarPosicion(filaInicio, columnaInicio, \
PARTE_DEL_CAMINO)
else:
laberinto.actualizarPosicion(filaInicio, columnaInicio, \
CAJELLON_SIN_SALIDA)
return encontrado
[ ['+','+','+','+',...,'+','+','+','+','+','+','+'],
['+',' ',' ',' ',...,' ',' ',' ','+',' ',' ',' '],
['+','+','+','+',...,'+','+','+','+','+',' ','+'],
['+','+','+','+',...,'+','+','+',' ','+','+','+']]
class Laberinto:
def __init__(self,nombreArchivoLaberinto):
filasEnLaberinto = 0
columnasEnLaberinto = 0
self.listaLaberinto = []
archivoLaberinto = open(nombreArchivoLaberinto,'r')
filasEnLaberinto = 0
columna = 0
listaFila.append(caracter)
if caracter == 'S':
self.filaInicio = filasEnLaberinto
self.columnaInicio = columna
columna = columna + 1
filasEnLaberinto = filasEnLaberinto + 1
self.listaLaberinto.append(listaFila)
columnasEnLaberinto = len(listaFila)
self.filasEnLaberinto = filasEnLaberinto
self.columnasEnLaberinto = columnasEnLaberinto
self.xTranslate = -columnasEnLaberinto/2
self.yTranslate = filasEnLaberinto/2
self.t = Turtle(shape='turtle')
setup(width=600,height=600)
setworldcoordinates(-(columnasEnLaberinto-1)/2-.5,
-(filasEnLaberinto-1)/2-.5,
(columnasEnLaberinto-1)/2+.5,
(filasEnLaberinto-1)/2+.5)
def dibujarLaberinto(self):
for y in range(self.filasEnLaberinto):
for x in range(self.columnasEnLaberinto):
if self.listaLaberinto[y][x] == OBSTACULO:
self.dibujarCajaCentrada(x+self.xTranslate,
-y+self.yTranslate,
'tan')
self.t.color('black','blue')
def dibujarCajaCentrada(self,x,y,color):
tracer(0)
self.t.up()
self.t.goto(x-.5,y-.5)
self.t.color('black',color)
self.t.setheading(90)
self.t.down()
self.t.begin_fill()
for i in range(4):
self.t.forward(1)
self.t.right(90)
self.t.end_fill()
update()
tracer(1)
def moverTortuga(self,x,y):
self.t.up()
self.t.setheading(self.t.towards(x+self.xTranslate,
-y+self.yTranslate))
self.t.goto(x+self.xTranslate,-y+self.yTranslate)
def tirarMigaDePan(self,color):
self.t.dot(color)
def actualizarPosicion(self,fila,columna,val=None):
if val:
self.listaLaberinto[fila][columna] = val
self.moverTortuga(columna,fila)
if val == PARTE_DEL_CAMINO:
color = 'green'
color = 'red'
color = 'black'
color = 'red'
else:
color = None
if color:
self.tirarMigaDePan(color)
def esSalida(self,fila,columna):
return (fila == 0 or
fila == self.filasEnLaberinto-1 or
columna == 0 or
columna == self.columnasEnLaberinto-1 )
def __getitem__(self,indice):
return self.listaLaberinto[indice]
JUSTIFICACIÓN
Buscamos darle solución a estos problemas con el uso de búsqueda en profundidad y back
tracking (éste último es muy importante ya que para poder hacerlo posible tenemos que hacer
una vuelta atrás para encontrar el camino factible que estamos buscando, en caso dado de que no
se pueda, el algoritmo fallará y no se dará solución al problema), buscando una solución a los
dos problemas planteados en donde la solución sea la más factible para solucionar el dilema que
nos plantea los ejercicios anteriores con los métodos anteriormente nombrados.
BIBLIOGRAFÍA
https://es.wikipedia.org/wiki/B%C3%BAsqueda_en_profundidad
https://prezi.com/txb6khxu50ps/algoritmo-de-busqueda-en-profundidad/
https://es.wikipedia.org/wiki/Vuelta_atr%C3%A1s
https://www.microsiervos.com/archivo/ordenadores/algoritmos-vuelta-atras-backtracking.html
http://programandoandojs.blogspot.com/2013/08/recorrido-en-anchura-y-en-profundidad.html