Professional Documents
Culture Documents
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
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
geometra del camino del laberinto y lo sacamos de su estructura podemos ver que
este es anlogo a un rbol.
Dnde:
k=En el seudocdigo, es el nmero de elemento del arreglo, en el caso del laberinto
caso va a representar la ubicacin en el rbol.
Es_Solucion() retorna verdadero o falso si el argumento es una solucin posible, en
nuestro caso solo ser verdadero cuando se llegue al fin del laberinto.
Procesar_Solucion(): depende del problema, en este caso sera terminar la bsqueda,
ya que se encontr la solucin.
Encontrar_Sucesores(): es una funcin que dado un candidato, genera todos los
candidatos que son extensiones de este, es decir los caminos que puedo tomar a partir
de esta celda.
terminar: es una variable global booleana inicialmente es falsa, que establece la
condicin de terminar la bsqueda dado determinados casos (ej.: Nmero mximo de
iteraciones).
Algoritmo implementado en el programa:
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
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.
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.
8 Aplicacin en SDL
8.1 Introduccin
Las siglas SDL significan Simple DirectMedia Layer, estn desarrolladas en C y
proporcionan funciones bsicas para realizar operaciones multimedia en espacios de
dos dimensiones y para ir ms all de estas dimensiones tambin ofrece una buena
vinculacin con OpenGL. Tambin nos ofrece la carga y gestin de sonido, imgenes,
tipografas, archivos y conexiones de red.
SDL fue desarrollada inicialmente por Sam Lantinga, un desarrollador
de videojuegos para la plataforma GNU/Linux, y pese a estar programado en C,
tiene adaptaciones a otros lenguajes de programacin
como C++, Ada, C#, BASIC, Erlang, Lua, Java,Python, etc. Una de sus grandes
virtudes es el tratarse de una biblioteca multiplataforma, siendo compatible
oficialmente con los sistemas Microsoft Windows, GNU/Linux,Mac OS y QNX,
adems de otras arquitecturas y sistemas como Sega Dreamcast, GP32, GP2X. La
biblioteca se distribuye bajo la licencia LGPL, que es la que ha provocado el gran
avance y evolucin de SDL.
siguiente forma:
Laberinto 1
Laberinto 2
Backtracking NO
Recursivo
Ningn
Joystick
Backtracking Recursivo
1 Joystick
Backtracking Recursivo
Jugador 1
2 Joystick
Backtracking Recursivo
Jugador 1
Laberinto 3
No se muestra
Backtracking NO
Recursivo
Jugador 2
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.
8.3 Clases utilizadas
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.
Clase Timer
El reloj es un elemento necesario en SDL, en caso el objeto creado se encarga de
regular los fotogramas por segundos, para producir una visualizacion correcta sin
utilizar demas los recursos. Como funcion del programa, se uso este objeto para
controlar los cronometros que miden los tiempos en los que cada laberinto fue
resuelto.
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.
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.
Si bien a la hora de desarrollar la aplicacin en SDL se utiliz solo un pequeo
porcentaje del total de esta librera, resulto gratificante la experiencia de aprender
desde cero y resolver los problemas en una nueva interfaz. Resulta una interfaz muy
sencilla para realizar aplicaciones rpidas e interactivas.
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>
[9] Jess Bermdez de Andrs, Diseo de algoritmos Algoritmos de Vuelta Atrs Universidad del Pas Vasco/Euskal Herriko Unibertsitatea (UPV/EHU)
<http://cvb.ehu.es/open_course_ware/castellano/tecnicas/diseno_alg/contenidos/algoritmos-de-vueltaatras.pdf>