Вы находитесь на странице: 1из 15

Trabajo Final de Ctedra

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

Algoritmo de backtracking recursivo y no recursivo para


la resolucin de un laberinto y su aplicacin en SDL
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.
Para la resolucin del laberinto se desarroll una funcin en base al algoritmo de
backtracking, agregndole la construccin de un rbol para mapear y almacenar la
solucin del laberinto. Dada la eficacia y simpleza de este algoritmo recursivo, se
opt por desarrollar una funcin alternativa de backtracking usando iteracin en lugar
de recursividad. Se probaron ambas funciones para medir su rendimiento, y se
estudiaron los beneficios de usar una o la otra.
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.
Palabas clave: Backtracking, SDL, Recursividad, 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

obtener un nico y mejor camino, as como tambin reproducirlo de forma grfica


para poder visualizar mejor la solucin.
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.

3 Creacin del laberinto


Para crear el laberinto se implement un algoritmo de backtracking recursivo [1], el
cual parte de un arreglo con forma de cuadricula, en donde las celdas individuales
representan parte del camino y la cuadricula representa las paredes. El algoritmo
empieza en un extremo y va saltando de una celda a la vez, abriendo y cerrando
paredes de forma aleatoria, generando un sinuoso camino, cada vez que se llega a un
punto en que no se puede seguir abriendo camino, ya sea porque se est en un
extremo, o porque se alterara el camino ya dibujado, se vuelve hacia atrs hasta una
nueva celda que permita abrir nuevos caminos. Este algoritmo es muy rpido, pero su
interpretacin es demasiado compleja y no es tan fcil de visualizar el proceso de
construccin.
El algoritmo resulta muy efectivo y el resultado es bastante agradable dado que el
camino es muy sinuoso. Entre sus desventajas esta que usa N2 de memoria, solo un
camino llega hasta el final del laberinto. En laberintos amplios empieza a aumentar la
cantidad y el tamao de zonas muertas (zonas sin recorrer).

4 Representacin del laberinto


En el caso estudiado de un laberinto cuadrado es ms que evidente que una
representacin matricial es acertada. Pero cuando queremos recorrer el laberinto esta
representacin no es de utilidad, en base a esto surge la necesidad de ver otra
representacin para el anlisis del problema. Si observamos con atencin la

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

geometra del camino del laberinto y lo sacamos de su estructura podemos ver que
este es anlogo a un rbol.

Figura 1 Representacin como rbol de un laberinto.

El algoritmo de backtracking no especifica una forma de representar o almacenar el


camino que se est recorriendo dado que la utilidad de este es encontrar la salida
solamente. Para este caso, se consider que es importante tener una representacin
almacenada del resultado de la funcin que resuelve el laberinto, dado que esto nos
permitir recorrer una y otra vez el laberinto sin volver a ejecutar la funcin. Para ello
se utiliz un rbol multicamino, el cual permite 3 grados de libertad, que van a
permitir movernos en 3 direcciones a partir de la posicin en la que estamos parados.
La estructura del nodo del rbol est compuesta por las coordenadas X e Y las cuales
representa el nodo en el laberinto, un puntero al nodo padre el cual permitir recorrer
el camino de forma inversa, y 3 punteros a los posibles nodos hijos.
En el programa el tipo nodo se define como:

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

5 Implementacin del Algoritmo


5.1 Backtracking recursivo
Este algoritmo es usado en muchos mbitos de programacin, por ejemplo, para el
clculo de expresiones reguladores o para tareas de reconocimiento de texto y sintaxis
en lenguajes regulares y tambin como soporte para muchos algoritmos de
inteligencia artificial. El backtracking est relacionada con la bsqueda combinatoria,
donde el orden de los elementos no importa, donde se generan secuencias completas
hasta llegar al objetivo deseado. Podemos decir que forma ms exacta que engloba
dos tipos de problemas:
1.
2.

Problemas de Decisin: Bsqueda de las soluciones que satisfacen ciertas


restricciones.
Problemas de Optimizacin: Bsqueda de la mejor solucin en base a una
funcin objetivo.

A continuacin se cita la definicin de este algoritmo:


Encontrar una solucin intentndolo con una de varias opciones. Si la eleccin es
incorrecta, el computo retrocede o vuelve a comenzad desde el punto de decisin
anterior y lo intenta con otra opcin.
Nota: Conceptualmente, un algoritmo de backtracking realiza una bsqueda en
profundidad de un rbol de soluciones posibles (parcial). Cada eleccin es
un nodo en el rbol. [2]
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.
Pseudocodigo algoritmo de backtracking:
Backtracking (A[], k){
Si Es_Solucion(A[], k)
Entonces Procesar_Solucion(A[], k)
Sino
Por cada Encontrar_Sucesores(A[], k) hacer
Backtracking(A[], k+1)
Si terminar=true
Entonces return
}

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

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

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.

Figura 2 Diagrama de mtodo para simplificar el rbol.

5.2 Backtracking iterativo


El principio de funcionamiento del algoritmo de backtracking desarrollado de forma
no recursiva es anlogo al backtracking original, pero resulta mucho ms complicado
de interpretar y un agregado de ms cdigo dentro del programa. El problema
principal resulta en que una vez que llegamos a un punto sin salida no se puede
simplemente retornar la funcin determinadas veces hasta llegar a un nuevo nodo que
nos permita optar por otro camino alternativo. Sino que una vez que llegamos a esta
situacin se debe recorrer el camino hasta llegar a dicho nodo y reconocer que este
nodo y su camino alternativo no fueron anteriormente recorridos. Para esto ltimo
vamos dibujando en el arreglo que representa el laberinto (anteriormente
inicializado con 0=PATH/CAMINO o 1=PARED) el camino asignndole a cada
celda recorrida un nuevo estado (2=POINT). El arreglo original que representa el
laberinto va a ser alterado por este nuevo estado POINT que es un nuevo valor en las
celdas del arreglo, pero esto se soluciona con un simple recorrido del arreglo que
reemplace este valor por el original (PATH). Es decir que debemos recurrir a no solo

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

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

6 Recursividad versus iteracin


La razn fundamental es que existen numerosos problemas complejos sin fcil
solucin iterativa, y con una naturaleza recursiva, que en consecuencia, son ms
fciles de implementar con algoritmos de este tipo. Tal es el caso del algoritmo de
backtracking de dems alternativas a la resolucin de un laberinto que usan
recursividad. Pero tambin existen casos que el planteo de una solucin recursiva
representa un mecanismo muy eficiente de programacin que facilitan el diseo de las
mismas funciones.
Sin embargo, en condiciones crticas de tiempo y de memoria, es decir, cuando el
consumo de tiempo y memoria sean decisivos o concluyentes para la resolucin del
problema, la solucin a elegir debe ser, normalmente la iterativa.
Ventajas de la Recursin:
-Soluciones simples, claras
-Soluciones elegantes.
-Soluciones a problemas complejos.
Desventajas de la Recursin:
-Sobrecarga asociada con las llamadas a funciones, una simple ejecucin
puede requerir un gran nmero de llamadas a funciones. (Ej.: !n conlleva a n
llamadas recursivas, ).
-Mayor uso de memoria

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
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.

En este caso SDL hace uso de los perifricos


(joysticks) simplificando la tarea al
encargarse la misma librera de hacer las
complicadas llamadas instrucciones de
DirectInput[4] (Librera de DirectX),
En cuanto a la creacin de la interfaz grfica,
esta se crea de una forma muy simple con
unas simples llamadas a funciones y es
independiente del sistema operativo que
usemos.

Figura 3 Diagrama de SDL[3]

8.2 Descripcin del programa


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:

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.

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

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.

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

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

8.4 Capturas de pantalla

Figura 4 Captura de pantalla laberinto con n=20

Figura 5 Captura de pantalla laberinto con n=10

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.

Diaz Ariel Ivan


Trabajo Final Informtica II
UTN FRBB 2013

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>

[2] Paul E. Black, "backtracking", in Dictionary of Algorithms and Data


Structures [online], Paul E. Black, ed., U.S. National Institute of Standards and
Technology.
<http://www.nist.gov/dads/HTML/backtrack.html>

[3] Wikipedia the free Encyclopedia, Simple MediaDirect Layer.


<http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer>
[4] Microsoft Develop Center - Desktop, - Microsoft.DirectX.DirectInput.
<http://msdn.microsoft.com/en-us/library/windows/desktop/ms805653.aspx>

[5] C. Casas, M. Prez, J. Garca, El esquema algortmico del backtracking


Lgica y computabilidad.
<http://www.uls.edu.sv/index.php?option=com_phocadownload&view=category&download=103:el-esq>

[7] Mg. Oscar Adolfo Vallejos - Tema VII. Recursividad FaCENA UNNER.
<http://exa.unne.edu.ar/informatica/programacion1/public_html/archivos/recursividad_1.pdf>

[8] Lazy Foo' Productions Beginning Game Programming


<http://lazyfoo.net/SDL_tutorials/index.php>

[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>

[10] Alberto Garca Serrano, - Programacin de Videojuegos con SDL


<http://www.albertogarcia.info/libros/sdl/%5Bebook%5DProgramacion%20de%20videojuegos%20con%2
0SDL.pdf>

[11] Javier Martnez Baen, -Introduccin a SDL Universidad de Granada Dpto.


Ciencias de la computacin e Inteligencia Artificial.

Вам также может понравиться