Clasificaciones, modalidades y tendencias de investigación educativa.
Método de Vuelta Atrás (Backtracking)
1. El Método del Backtracking
(Vuelta Atrás)
Alejandro Salas
CI: 29.654.473
Estructuras de
Datos II,SAIA-A
2. Contenido:
Breve Historia
Concepto
Enfoque
Diseño e Implementación
Heurísticas
Ejemplos
Backtracking para Enumeración
Aplicaciones
“Branch & Bound”
3. Breve Historia:
El término de backtracking fue
mencionado por primera vez alrededor de
1950 por Derrick Henry Lehmer.
D.H. Lehmer fue un matemático
estadounidense , quien contribuyó varias e
importantes veces en la teoría de números
para enteros de precisión múltiple
El Backtracking como tal ha sido
visto como un algoritmo capaz de
aplicarse en la resolución de un
gran número de problemas, en
especial de optimización
4. Concepto:
El Backtracking es una técnica
recursiva cuya función es
básicamente encontrar soluciones a
problemas recorriendo sus distintas
alternativas
La idea del backtracking es
comúnmente aplicada en
recorridos de grafos,
especialmente árboles, que
representan las distintas
soluciones de un problema
Se dice que el recorrido es exitoso
cuando se puede definir una
solución por completo. De lo
contrario, se regresa hacia atrás
para luego volver a recorrer nodos
sin explorar
5. Enfoque:
El backtracking busca una solución a problemas completos,
es decir, problemas que satisfagan un determinado tipo de
restricciones
Los problemas consisten en un conjunto de “variables” con un
valor asignado sujeto a las restricciones
Por medio del backtracking se desarrollan todas las posibles
combinaciones de elementos para obtener una solución entre
todas las alternativas
6. Diseño e Implementación:
El algortimo está diseñado como una
búsqueda en profundidad en la que se
crea un árbol implícito de decisiones y
alternativas
La principal diferencia es que se
diseñan funciones de cota que limiten
los recorridos que no conducirán a
una solución óptima
La técnica se implementa como un
procedimiento recursivo
En cada llamada se selecciona una
variable y se le asignan sus posibles
valores, para luego llamar
nuevamente al procedimiento para
cada nuevo estado
7. Heurísticas:
Para el backtracking, es común el uso de
métodos de heurística para acelerar el proceso
del algoritmo:
Restricción de
primeras
variables:
Aprovecha la
flexibilidad del
orden del proceso
para aumentar la
eficiencia
restringiendo las
primeras
variables con el
menor valor
posible
“Forward
Checking”:
Verifica qué valor
restringirá el
menor número
posible de valores.
Se anticipa para
preservar una
posible solución o
hace que la
solución
encontrada no
tenga restricciones
Función de Cotas:
Examina si es
posible encontrar
una solución a
partir de una
solución parcial,
comprobando si
el fallo de
8. Ejemplos:
Situaciones de aplicación:
Problema de satisfacibilidad:
Supongamos que “A” contiene la expresión booleana que constituye el
problema. Elegimos un subproblema de A.
por ejemplo: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z').
Elegimos una cláusula con mínimo número de literales.
Elegimos una variable x, y, z dentro de la cláusula y crear 2
subproblemas reemplazando x=V y x=F.
En el caso x=V
Omitir las cláusulas donde aparece x.
Omitir x' en las cláusulas que aparece x'.
En el caso x=F
Omitir las cláusulas donde aparece x'.
Omitir x en las cláusulas que aparece x.
Si no quedan cláusulas. STOP. (solución encontrada).
Si hay una cláusula vacía. DROP.
En otro caso añadir a A
9. Ejemplos:
Situaciones de aplicación:
Problema de cobertura exacta (Exact Cover)
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U,
definimos una matriz A donde cada fila se corresponde con un
elemento ui de U y cada columna de A con un subconjunto Tj .
Ponemos aij=1 si ui U pertenece a Tj y aij=0 en caso contrario. Interpretamos
que xj=1 significa que elegimos Tj y 0 en caso contrario.
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y
las componentes de 1 son unos.
Dado S0= un vector de ceros (raíz del árbol), cada nodo S del árbol
es una sucesión x cuyas primeras k componentes le han sido
asignados un 1 o un 0 y el resto de componentes son ceros.
Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y
xk+1=0 respectivamente.
if Ax=1 STOP
if Ax>1 DROP Si
if Ax<1 add Si to A
10. Ejemplos:
Problemas
comunes con
aplicando
Backtracking en
C/C++
Problema de las N
damas:
Disponemos de
un tablero de
ajedrez de
tamaño NxN, y se
trata de colocar
en él N reinas de
manera que no
se amenacen
según las normas
del ajedrez.
12. Ejemplos:
Problemas
comunes con
aplicando
Backtracking en
C/C++
Problema del
caballo
Se trata de
colocar
inicialmente el
caballo en una
casilla de un
tablero de ajedrez
y moverlo hasta
haber pisado
todas las casillas
sin haber estado
más de una vez
en la misma
casilla
14. Ejemplos:
Problemas comunes
con aplicando
Backtracking en
C/C++
Problema del
laberinto
Se tiene una matriz
bidimensional de nxn
casillas para
representar un
laberinto cuadrado.
Cada casilla está
marcada como
visitada o no visitada.
Se debe ir desde la
casilla (1,1) a la (n,
n) haciendo
movimientos
horizontales y
verticales.
16. Backtracking para Enumeración
El problema de la enumeración consiste en
encontrar todas las soluciones del problema, es
por ello que tendremos que recorrer el árbol de
estados al completo.
17. Aplicaciones:
El backtracking es una
herramienta muy útil
para la búsqueda de
soluciones de forma
rápida y automática
Se aplica para el cálculo
de expresiones regulares
y reconocimiento de texto
y sintaxis
Es muy aplicado también
en el área de inteligencia
artificial gracias al uso de
árboles de búsqueda y
decisión
18. “Branch & Bound”
Es un método de búsqueda de soluciones como el
backtracking. Éste hace uso de ramificaciones (branch) y
acotaciones (bound)
Cada solución tiene asociado un costo y la solución buscada debe
ser óptima, es decir, de menor costo
Basado en esto, se evita considerar soluciones cuyo costo supera al
óptimo buscado