Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmo de Backtracking Recursivo y No
Algoritmo de Backtracking Recursivo y No
Algoritmo de backtracking
recursivo y no recursivo
para la resolución de un
laberinto y su aplicación en
SDL
Autor
Diaz Ariel Ivan
arielivandiaz@ieee.org
Cátedra
Informática II
Segundo Año Ingeniería Electrónica
Profesor: Friedrich Guillermo
Universidad Tecnológica Nacional Facultad Regional Bahía Blanca
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
1 Resumen
En este proyecto se planteó como problema la resolución de un laberinto mediante un
programa en el cual se apliquen los conocimientos obtenidos en la catedra de
Informática II. Para cumplir este objetivo se tuvo en cuenta hacer énfasis en temas
desarrollados en clase, como el uso de árboles, dispositivos periféricos, programación
orientada a objetes e interfaz gráfica.
Con el fin de darle un contexto a este problema, se procedió a darle una interfaz
gráfica para poder visualizar y percibir la resolución del laberinto. Se escogió para
este fin, usar las bibliotecas SDL, y para aprovechar estas, se desarrolló un juego entre
la computadora ejecutando los algoritmos estudiados y el o los usuarios usando un
joystick para moverse dentro del laberinto.
2 Introducción
El algoritmo de backtracking es utilizado para resolver problemas en los que la
solución consta de una serie de decisiones adecuadas hasta un objetivo. De esta forma
genera todas las secuenciadas de forma sistemática y organizada hasta encontrar la
correcta. En una primer medida se utilizó un algoritmo de backtracking para generar
un laberinto aleatorio, posteriormente se desarrolló en un algoritmo de backtracking
recursivo para el problema del laberinto planteado y luego se buscó desarrollar el
mismo algoritmo pero de forma no recursiva.
Se modificó el contexto del problema del algoritmo para generar un árbol, que mapea
el laberinto, y con este la solución queda presente en el árbol almacenado y puede ser
usada posteriormente. Además de esto, el mapeo permite procesar el árbol para
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
obtener un único y mejor camino, así como también reproducirlo de forma gráfica
para poder visualizar mejor la solución.
Con los algoritmos funcionando, se usó SDL como interfaz gráfica para una
aplicación de estos, se agregó el atractivo de que el usuario pueda competir contra la
PC para ver quién puede resolver el laberinto más rápido. Si bien la resolución del
laberinto, por cualquiera de los 2 algoritmos, es casi instantánea, gracias a que está
almacenado, se puede ir leyendo y dibujando a una velocidad coherente para competir
con el usuario. Este último mueve su puntero, que representa a un caminante dentro
del laberinto, por medio de un joystick. Usando las posibilidades que nos brinda SDL,
se agregaron atractivos visuales, texto y cronómetros que miden el tiempo de
resolución.
geometría del camino del laberinto y lo sacamos de su estructura podemos ver que
este es análogo a un árbol.
Esta definición deja bien en claro que la aplicación de este algoritmo para la
resolución de un problema como el laberinto es más que correcta. En esta
implementación tenemos que recorrer un laberinto, que como ya vimos antes puede
ser análogamente representado como un árbol, en el cual debemos explorar los
caminos y volver hacia atrás cuando nos encontramos sin salida, hasta llegar a un
punto en que podamos tomar un camino alternativo aun no explorado y recorrer este;
este proceso se repite sucesivamente hasta llegar al punto deseado.
Dónde:
En los casos planteados se toma como posición inicial las coordenadas (1,1) siendo
esta la que representa al inicio del laberinto, por ende se toma como final del laberinto
a la esquina opuesta, al llegar a esta la función se deja de llamarse recursivamente y
retorna el ultimo nodo.
La función cargar_posibles_caminos es vital para el funcionamiento del programa,
esta se encarga de verificar en qué dirección se puede seguir caminando en base a la
posición actual y al paso anterior que realizamos. Cada vez que una celda vecina esta
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
libre y se puede avanzar hacia ella, esta función asigna memoria y crea un nuevo nodo
en función de los datos actuales y lo almacena en una de las ramas del nodo actual.
Una vez cargados los caminos posibles, cada rama del nodo actual representa un
camino que seguir, entonces se evalúan una a una mediante la misma función de
backtracking.
El hecho que la función retorne el último elemento del árbol, el cual representa el fin
del laberinto hace posible que a partir de este se recorra el árbol de forma inversa y se
pueda construir un nuevo árbol de forma muy simple eliminando los demás nodos que
no pertenecen a la solución.
usar el arreglo de laberinto como parámetro para orientarnos y escribir el camino, sino
que también lo debemos usar y modificar para controlar de no volver demasiado hacia
atrás y empezar a recorrer camino ya recorrido.
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
Ventajas de la Recursión:
Desventajas de la Recursión:
7 Análisis de optimización
Si bien a simple vista los algoritmos implementados pueden tener un grado de
dificultad, a la hora de su ejecución, esta es realmente muy rápida y efectiva. El
backtracking siempre garantiza llegar a la solución, aunque este conlleve recorrer al
100% el laberinto. A la hora de optimizar el algoritmo se busca llegar a la solución
recorriendo lo menos posible, pero esto realmente resulta complicado dada la
naturaleza aleatoria de cada laberinto. Si bien podríamos tomar decisiones en base a la
ubicación actual y la ubicación del objetivo, pero estas podrían tener consecuencias
peores, dado que aunque estemos cerca del objetivo, esto no significa que el camino
que nos quede por recorrer sea corto.
En conclusión no hay posibilidades de tomar decisiones para optimizar el recorrido,
dada la aleatoriedad del problema.
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
8 Aplicación en SDL
8.1 Introducción
Al ejecutar el programa, el usuario introduce por teclado el tamaño del laberinto que
desea, en base a esto, se crea una ventana adecuada al tamaño del laberinto solicitado.
Al inicializar los componentes de SDL se lee la cantidad de joystick disponibles en el
ordenador y se toma que este número será igual al número de jugadores. Entonces el
programa crea varios laberintos y situaciones en base a esto y se implementa de la
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
siguiente forma:
Los punteros que representan el caminante del laberinto, son dibujados y son
manipulados por un algoritmo que recorre los arboles creados por los algoritmos de
resolución o por el usuario por medio del joystick. Estos punteros van dejando una
traza de puntos, que indica el camino por el cual ya circularon y además hay un
cronometro por cada laberinto que se detiene cuando se llega a la meta.
Clase Dot
Es la clase que representa el puntero (el caminante del laberinto), en esta se define
que este va a ser un circulo por medio de la estructura Circle donde se contiene la
maginitud del radio y las coordenadas X e y. Los distintos Dots se diferencian porque
a la hora de su construcción se define a que jugador van a pertenecer, para poder
diferenciarlos.
La funcion handle_input() lee el estado del joystick y en base a esto modifica los
valores de velocidad (xVel , yVel) que luego van a ser leidos por la función move; la
cual va a reubicar teniendo como referencia que ha esta se le pasa como parametro un
vector que representa el laberinto, y en base a esto va a checkear si existen colisiones
entre el puntero y la pared para prohibir que este se suba ensima de la pared o la
atravieze. De forma analoga la función handle_PC, mueve el puntero de forma
automatica al pasarle las coordenadas X e Y a las que queremos que se mueva.
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
Clase Timer
Clase Particle
Este es un agregado visual al programa, este objeto es usado por la clase Dot para
dejar una estela de particulas mientras el puntero se mueve. Estas particulas son
ubicadas de forma aleatoria y su vida dura un numero determinado de fotogramas.
Las particulas son archivos de imágenes que se cargaron previamente y se van
mostrando gracias a la librería SDL_image.
Diaz Ariel Ivan
Trabajo Final Informática II
UTN FRBB 2013
9 Conclusión
En este trabajo se desarrollaron y aplicaron dos funciones de backtracking, que
resultan equivalentes pero de diferente naturaleza. Dado que los laberintos son
relativamente sencillos y pequeños para el ordenador, no se pudo obtener una
comparación de rendimiento real entre estos algoritmos. La utilización del tipo de
árboles que se usó para almacenar el laberinto, resulto ser análoga a la de los arboles
binarios vistos en clase, a pesar de que su geometría es más complicada.
10 Referencias
[1] Wikibooks Open books for an open world – “Aros/Developer/Games
Programming/Basics”
<http://en.wikibooks.org/wiki/Aros/Developer/Games_Programming/Basics>
[7] Mg. Oscar Adolfo Vallejos - “Tema VII. Recursividad” FaCENA – UNNER.
<http://exa.unne.edu.ar/informatica/programacion1/public_html/archivos/recursividad_1.pdf>