Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Algoritmo de backtracking
recursivo y no recursivo
para la resolucin de un
laberinto y su aplicacin en
SDL
Autor
Diaz Ariel Ivan
arielivandiaz@ieee.org
Ctedra
Informtica II
Segundo Ao Ingeniera Electrnica
Profesor: Friedrich Guillermo
Universidad Tecnolgica Nacional Facultad Regional Baha Blanca
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
1 Resumen
En este proyecto se plante como problema la resolucin de un laberinto mediante un
programa en el cual se apliquen los conocimientos obtenidos en la catedra de
Informtica II. Para cumplir este objetivo se tuvo en cuenta hacer nfasis en temas
desarrollados en clase, como el uso de rboles, dispositivos perifricos, programacin
orientada a objetes e interfaz grfica.
Con el fin de darle un contexto a este problema, se procedi a darle una interfaz
grfica para poder visualizar y percibir la resolucin 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 Introduccin
El algoritmo de backtracking es utilizado para resolver problemas en los que la
solucin consta de una serie de decisiones adecuadas hasta un objetivo. De esta forma
genera todas las secuenciadas de forma sistemtica 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 solucin queda presente en el rbol almacenado y puede ser
usada posteriormente. Adems de esto, el mapeo permite procesar el rbol para
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
Con los algoritmos funcionando, se us SDL como interfaz grfica para una
aplicacin de estos, se agreg el atractivo de que el usuario pueda competir contra la
PC para ver quin puede resolver el laberinto ms rpido. Si bien la resolucin del
laberinto, por cualquiera de los 2 algoritmos, es casi instantnea, 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 cronmetros que miden el tiempo de
resolucin.
geometra del camino del laberinto y lo sacamos de su estructura podemos ver que
este es anlogo a un rbol.
Esta definicin deja bien en claro que la aplicacin de este algoritmo para la
resolucin de un problema como el laberinto es ms que correcta. En esta
implementacin tenemos que recorrer un laberinto, que como ya vimos antes puede
ser anlogamente representado como un rbol, en el cual debemos explorar los
caminos y volver hacia atrs 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.
Dnde:
En los casos planteados se toma como posicin 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 funcin se deja de llamarse recursivamente y
retorna el ultimo nodo.
La funcin cargar_posibles_caminos es vital para el funcionamiento del programa,
esta se encarga de verificar en qu direccin se puede seguir caminando en base a la
posicin actual y al paso anterior que realizamos. Cada vez que una celda vecina esta
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
libre y se puede avanzar hacia ella, esta funcin asigna memoria y crea un nuevo nodo
en funcin 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 evalan una a una mediante la misma funcin de
backtracking.
El hecho que la funcin 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 dems nodos que
no pertenecen a la solucin.
usar el arreglo de laberinto como parmetro para orientarnos y escribir el camino, sino
que tambin lo debemos usar y modificar para controlar de no volver demasiado hacia
atrs y empezar a recorrer camino ya recorrido.
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
Ventajas de la Recursin:
Desventajas de la Recursin:
7 Anlisis de optimizacin
Si bien a simple vista los algoritmos implementados pueden tener un grado de
dificultad, a la hora de su ejecucin, esta es realmente muy rpida y efectiva. El
backtracking siempre garantiza llegar a la solucin, aunque este conlleve recorrer al
100% el laberinto. A la hora de optimizar el algoritmo se busca llegar a la solucin
recorriendo lo menos posible, pero esto realmente resulta complicado dada la
naturaleza aleatoria de cada laberinto. Si bien podramos tomar decisiones en base a la
ubicacin actual y la ubicacin del objetivo, pero estas podran tener consecuencias
peores, dado que aunque estemos cerca del objetivo, esto no significa que el camino
que nos quede por recorrer sea corto.
En conclusin no hay posibilidades de tomar decisiones para optimizar el recorrido,
dada la aleatoriedad del problema.
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
8 Aplicacin en SDL
8.1 Introduccin
Al ejecutar el programa, el usuario introduce por teclado el tamao del laberinto que
desea, en base a esto, se crea una ventana adecuada al tamao del laberinto solicitado.
Al inicializar los componentes de SDL se lee la cantidad de joystick disponibles en el
ordenador y se toma que este nmero ser igual al nmero de jugadores. Entonces el
programa crea varios laberintos y situaciones en base a esto y se implementa de la
Diaz Ariel Ivan
Trabajo Final Informtica 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
resolucin 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 adems 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 construccin 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 funcin 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 funcin 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 Informtica 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 imgenes que se cargaron previamente y se van
mostrando gracias a la librera SDL_image.
Diaz Ariel Ivan
Trabajo Final Informtica II
UTN FRBB 2013
9 Conclusin
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 pequeos para el ordenador, no se pudo obtener una
comparacin de rendimiento real entre estos algoritmos. La utilizacin del tipo de
rboles que se us para almacenar el laberinto, resulto ser anloga a la de los arboles
binarios vistos en clase, a pesar de que su geometra es ms 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>