Vous êtes sur la page 1sur 25

UNED

Ingeniera Tcnica de sistemas Curso 2012/2013

Programacin III
Prcticas obligatorias

Realizado por: Alfonso Martn Murillo DNI: 11.820.406-Q e-mail: alfonsomartinmurillo@gmail.com Centro Asociado: Las Tablas Telfono mvil: 601058048

Programacin III Prctica Obligatoria 2012 - 2013

INDICE
Introduccin ___________________________________________________________ 3 Entorno de desarrollo, trabajo y ejecucin ___________________________________ 3 Contenido del ZIP y ejecucin de la aplicacin ________________________________ 3 Respuesta a las cuestiones planteadas en el enunciado de la prctica ____________ 4
Descripcin del algoritmo utilizado y aplicacin en el problema _____________________ 4
Representacin de los datos del problema ____________________________________________ 4 Recorrido en profundidad, recorrido en anchura y vuelta atrs ____________________________ 6 Estructuras de Datos ______________________________________________________________ 7 Particularizar el esquema de vuelta atrs _____________________________________________ 8

Coste computacional de la prctica ____________________________________________ 9 Anlisis de alternativas al esquema utilizado ____________________________________ 9 Datos de prueba utilizados y resultados obtenidos _______________________________ 11

Ejemplo de ejecucin para distintos tamaos del problema ____________________ 12


Saltocaballo5x5.sh _________________________________________________________ 12 Saltocaballo6x6.sh _________________________________________________________ 13 Saltocaballo7x7.sh _________________________________________________________ 15

Listado de cdigo fuente completo ________________________________________ 15


SaltoCaballo.JAVA _________________________________________________________ 15 EstadoPartida.JAVA ________________________________________________________ 19

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 2 de 2

Programacin III Prctica Obligatoria 2012 - 2013 Introduccin


Este documento representa la memoria a elaborar en la prctica de Programacin III de la carrera de Ingeniera de Sistemas.

Entorno de desarrollo, trabajo y ejecucin


Los datos de ejecucin mostrados en esta memoria, as como el cdigo desarrollado y la elaboracin de la memoria se han realizado sobre un ordenador MACBOOK PRO INTEL CORE 2 DUO 2,4 GHZ modelo 2008, con 4 GB de memoria RAM.

Contenido del ZIP y ejecucin de la aplicacin


El contenido de la prctica se encuentra empaquetado en un fichero ZIP de nombre 11820406.zip. A continuacin se detalla el contenido de dicho fichero: SaltoCaballo.jar Fichero JAR para la ejecucin del programa. Dentro del fichero JAR se encuentran dos clases java, EstadoPartida.class y SaltoCaballo.class. SaltoCaballo.class contiene la funcin main a la que invoca el programa Documento PDF que representa la memoria asociada a la prctica Directorio donde estn alojados los 2 ficheros fuentes JAVA. EstadoPartida.java y SaltoCaballo.java. En el proceso de comprobacin del programa se han ido elaborando ficheros de salida de diferentes ejecuciones. Se adjuntan soluciones para tableros 5x5, 6x6 y 7x7.

UNED-PROGIII-Practica-v01.pdf Directorio SRC Directorio Output

Ejecucin del programa Para ejecutar el programa se deben de seguir los siguientes pasos: 1. Acceder al terminal (UNIX o MAC) o consola (Windows). Situarse en el directorio raiz generado por el proceso de descompresin del fichero ZIP. 2. Ejecutar desde la lnea de comandos la sentencia JAVA JAR SaltoCaballo.jar estableciendo los parmetros establecidos en el enunciado de la prctica. A continuacin se establecen a modo de ejemplo unas cuantas ejecuciones que ilustran el tratamiento de los parmetros: Java jar SaltoCaballo.jar n 6 Java jar SaltoCaballo.jar n 6 x 2 y 2 Java jar SaltoCaballo.jar n 6 -t Ejecucin del programa para un tablero de 6x6 con las coordenadas de inicio por defecto (x=1, y=1) Ejecucin del programa para un tablero de 6x6 estableciendo las coordenadas de inicio (x=2, y=2). Ejecucin del programa para un tablero de 6x6 invocando al modo traza, que va mostrando los diferentes estados por los que va pasando el tablero en su bsqueda de la solucin. Ejecucin del programa para un tablero de 6x6 y la obtencin de todas las soluciones existentes desde las coordenadas de partida. (No solicitado). Para la realizacin de pruebas se ha implementado el parmetro f, no obligatorio, y Pgina 3 de 3

Java jar SaltoCaballo.jar n 6 -a

Java jar SaltoCaballo.jar n 6 f output.txt

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Programacin III Prctica Obligatoria 2012 - 2013


que permite establecer la salida a un fichero, en vez de por pantalla.

Respuesta a las cuestiones planteadas en el enunciado de la prctica


Descripcin del algoritmo utilizado y aplicacin en el problema


A continuacin se resumen los tres esquemas algortmicos bsicos, con el tipo de problema al cual se aplican. Esquema algortmico Algoritmos voraces Divide y vencers Aplicacin Construccin de una solucin paso a paso, donde no es necesario reconsiderar decisiones ya tomadas (no hay vuelta atrs). Abordar el problema como un conjunto de subproblemas mas pequeos, a los cuales damos solucin, y posteriormente combinamos dichas soluciones parciales para obtener la solucin completa. La informacin tratada por el problema est estructurada en forma de uno o mas grafos, y mediante estos algoritmos podemos recorrer de forma eficiente dichos grafos en busca de la solucin.

Exploracin de grafos

Representacin de los datos del problema Analizando el problema podemos identificar los siguientes componentes: Un tablero. Representado como una matriz cuadrada de N filas y N columnas. Una posicin de inicio. Unas coordenadas x e y de las cuales parte nuestro caballo. Un conjunto de posibles movimientos o desplazamientos que puede hacer el caballo. Un camino o ruta. El recorrido que realiza el caballo en su bsqueda para recorrer todas las casillas del tablero.

La estructura que mas fielmente nos puede representar los caminos posibles o imposibles que realiza el caballo desde una posicin de partida es un rbol. El nodo inicial correspondera a la situacin de partida (Tablero, posicin inicial, longitud actual del camino). Cada nodo tiene tantos hijos como posibles movimientos pueda hacer el caballo en el tablero. Para ilustrar la estructura de rbol vamos a analizar un ejemplo sobre un tablero de 5x5 basado en una situacin en la cual el caballo comienza en las coordenadas 1,1. Inicialmente la situacin del tablero es que est ocupada la posicin 1,1. Podramos decir que tenemos una longitud de camino de 1.

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 4 de 4

Programacin III Prctica Obligatoria 2012 - 2013

una vez analizadas las posibles posiciones a las que puede saltar el caballo nos encontraramos con 2 hijos:

Es decir, existen dos posibles alternativas para obtener un camino de longitud 2. A su vez cada una de estas alternativas generan nuevos hijos y nuevos caminos alternativos. Primera posibilidad de camino de longitud 3

Segunda posibilidad de camino de longitud 3

El rbol entero desplegado nos ofrecera la visin de todos los caminos posibles existentes. Llegados a este punto tomamos nuestra primera decisin, utilizar algoritmos de exploracin de grafos.

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 5 de 5

Programacin III Prctica Obligatoria 2012 - 2013


Recorrido en profundidad, recorrido en anchura y vuelta atrs Una vez tomada la decisin de usar algoritmos de exploracin de grafos tenemos varios esquemas con los que trabajar. Tomando en cuenta el tamao que puede tener el grafo, que en este caso es un rbol, podemos valorar si nos interesa construir o no el rbol. Si tomamos en cuenta que cada nodo puede tener hasta 8 nodos hijos, partiendo de una determinada situacin de partida nos encontramos que cada nivel del rbol puede tener el siguiente nmero terico de nodos:
Nivel del arbol 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Nmero de nodos en el nivel 1 8 64 512 4.096 32.768 262.144 2.097.152 16.777.216 134.217.728 1.073.741.824 8.589.934.592 68.719.476.736 549.755.813.888 4.398.046.511.104 35.184.372.088.832 281.474.976.710.656 2.251.799.813.685.250 18.014.398.509.482.000 144.115.188.075.856.000 1.152.921.504.606.850.000 9.223.372.036.854.780.000 73.786.976.294.838.200.000 590.295.810.358.706.000.000 4.722.366.482.869.650.000.000 37.778.931.862.957.200.000.000 302.231.454.903.657.000.000.000 2.417.851.639.229.260.000.000.000 19.342.813.113.834.100.000.000.000 154.742.504.910.673.000.000.000.000 1.237.940.039.285.380.000.000.000.000 9.903.520.314.283.040.000.000.000.000 79.228.162.514.264.300.000.000.000.000

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 6 de 6

Programacin III Prctica Obligatoria 2012 - 2013


34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 633.825.300.114.115.000.000.000.000.000 5.070.602.400.912.920.000.000.000.000.000 40.564.819.207.303.300.000.000.000.000.000 324.518.553.658.427.000.000.000.000.000.000 2.596.148.429.267.410.000.000.000.000.000.000 20.769.187.434.139.300.000.000.000.000.000.000 166.153.499.473.114.000.000.000.000.000.000.000 1.329.227.995.784.920.000.000.000.000.000.000.000 10.633.823.966.279.300.000.000.000.000.000.000.000 85.070.591.730.234.600.000.000.000.000.000.000.000 680.564.733.841.877.000.000.000.000.000.000.000.000 5.444.517.870.735.020.000.000.000.000.000.000.000.000 43.556.142.965.880.100.000.000.000.000.000.000.000.000 348.449.143.727.041.000.000.000.000.000.000.000.000.000 2.787.593.149.816.330.000.000.000.000.000.000.000.000.000 22.300.745.198.530.600.000.000.000.000.000.000.000.000.000

El nmero obtenido correspondera al caso peor, ya que no siempre todas las posiciones son correctas, como hemos podido comprobar en el ejemplo partiendo de la posicin 1,1, donde nicamente existen 2 posiciones vlidas y no 8. Se han marcado en verde los niveles 25, 36 y 49. Estos niveles corresponderan a los que sera necesario llegar en el caso de un tablero de longitud 5, 6 y 7 respectivamente. Como podemos comprobar el nmero de posibles nodos es tan grande que no nos podemos permitir construir el rbol de forma explcita para aplicar posteriormente tcnicas de bsqueda. Nuestra estrategia va a consistir trabajar con un grafo implcito, es decir, conocemos como tienen que ser los nodos, cual es la mecnica para ir generando nodos hijos, cuando hemos obtenido una solucin, y por tanto vamos a aplicar un algoritmo de vuelta atrs. El algoritmo de vuelta atrs se justifica ya que a medida que vamos recorriendo niveles hacia abajo, si llegamos a un punto en el cual no obtenemos mas hijos, pero la longitud del camino no corresponde con el nmero de casillas del tablero, deberemos de corregir la situacin, volviendo hacia atrs en nuestro recorrido y probando un nuevo camino. Estructuras de Datos Necesitamos manejar los siguientes elementos: dimTablero. La dimensin que va a tener el tablero. Tablero[][]. Una matriz bidimensional que va a representar el tablero, con todas las posiciones, en funcin de la dimensin establecida al inicio. lCamino. La longitud del camino que est realizando el caballo en sus sucesivos movimientos. xActual. Posicin x actual del caballo. yActual. Posicin y actual del caballo. Pgina 7 de 7

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Programacin III Prctica Obligatoria 2012 - 2013


Xdesp e YDesp. Utilizamos 2 estructuras de datos de tipo vector o array unidimensional para almacenar los 8 posibles movimientos que un caballo puede recorrer en un tablero de ajedrez. A continuacin se exponen los valores de dichos vectores, que se corresponden con los diferentes movimientos del caballo.

xDesp=new int[8] yDesp=new int[8] xDesp[0]=2;xDesp[1]=1;xDesp[2]=2;xDesp[3]=1;xDesp[4]=2;xDesp[5]=1;xDesp[6]=2;xDesp[7]=1 yDesp[0]=1;yDesp[1]=2;yDesp[2]=1;yDesp[3]=2;yDesp[4]=1;yDesp[5]=2;yDesp[6]=1;yDesp[7]=2

Particularizar el esquema de vuelta atrs A continuacin se expone el esquema general de vuelta atrs: Fun vuelta-atrs (ensayo) Si vlido (ensayo) entonces Dev ensayo Si no Para cada hijo E compleciones (ensayo) Si condicionesdepoda (hijo) entonces vuelta-atrs (hijo) Fin para Fin si Fin Fun Un algoritmo de vuelta atrs acaba bien por haber encontrado la solucin, o bien porque no hay mas nodos hijos a explorar. En la siguiente tabla se particularizan cada uno de los componentes del esquema algortmico en relacin a nuestro problema concreto.: Componente Valido(ensayo) Particularizacin Esta funcin nos valida si hemos encontrado una solucin. En este caso si la longitud del camino recorrido es igual al cuadrado de la dimensin del tablero. Fun Valido (Ensayo) ffun Compleciones(ensayo) Esta funcin nos obtiene la lista de nodos hijos (siguientes casillas) que cumplen las reglas del juego. Fun compleciones (ensayo) Lista <- lista vaca; Para x de 0 a 7 hacer Despx=ensayo.xactual+xdesp[x] Despy=ensayo.yactual+ydesp[x] Si (despx > 0) y despx<=ensayo.dimtablero Pgina 8 de 8 Dev (ensayo.lcamino==dimtablero*dimtablero

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Programacin III Prctica Obligatoria 2012 - 2013


Y (despy > 0) y despy<=ensayo.dimtablero y ensayo.tablero[despx][despy]=0 entonces nuevo-Ensayo <- Ensayo nuevo-Ensayo.lcamino=nuevo-ensayo.lcamino+1; nuevo-Ensayo.xactual=Despx; nuevo-Ensayo.yactual=Despy; nuevo-Ensayo.tablero <-ensayo.tablero nuevo-Ensayo.Tablero[despx][despy]=ensayo.lcamino+1 lista <- aadir (lista, nuevo-ensayo); Fsi fpara Ffun Condicionesdepoda (hijo) nicamente vamos a generar nodos hijos que representen casillas alcanzables, por lo tanto no hay ninguna condicin de poda que aadir. No se ha entrado en cuestiones mas operativas del programa, como puedan ser el paso de parmetros a la aplicacin, la impresin en pantalla, control de trazas y dems cuestiones que son reflejadas en el cdigo fuente de la aplicacin y en los comentarios anexos.

Coste computacional de la prctica


Lo que vamos a ofrecer es una cota superior al tamao de la bsqueda. Si nos fijamos en la tabla que se ha elaborado con los hijos obtenidos en cada uno de los niveles, podemos ver que crece en el orden de 8. El coste del algoritmo es exponencial, siendo del orden . Como podemos observar en la tabla de hijos, para tamaos pequeos de N (5, 6) hemos observado que los tiempos son asumibles. Hasta n=7 los tiempos son mas o menos aceptables, pero a partir de N=8 el coste se dispara de forma espectacular, en concordancia con el nmero de hijos que lgicamente se deben de evaluar, para un rbol de 49 niveles con 8 posibles ramificaciones en cada nivel.

Anlisis de alternativas al esquema utilizado


En este epgrafe vamos a realizar un repaso del resto de esquemas algortmicos que se ven en la asignatura para justificar el porqu no son idneos para el problema que se plantea. Esquema voraz

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 9 de 9

Programacin III Prctica Obligatoria 2012 - 2013


Este esquema construye paso a paso la solucin sin necesidad de reconsiderar decisiones ya tomadas. Esto no aplica en nuestro problema, ya que a la hora de construir un camino debemos tener la posibilidad de corregir nuestra direccin cuando nos encontremos con un camino sin retorno. Otro problema que nos encontramos es la funcin Seleccionar, que escoge el candidato mas prometedor. En nuestro caso sera complicado decidir cual es el candidato mas prometedor, ya que lo que nos puede parecer prometedor en el estado 3 o 4 de nuestra partida puede no serlo tanto en un estado posterior. Cuando se incorporar un candidato a la solucin, o bien se rechaza, son decisiones que se mantienen hasta el final. En nuestro caso necesitamos la posibilidad de corregir nuestra situacin.

Divide y Vencers No es factible construir una solucin mediante la aplicacin a subproblemas mas pequeos.

Recorrido en profundidad Debemos de marcar todos los nodos del grafo como no visitados, por lo que debemos previamente disponer del grafo. Tal como hemos dicho, vamos a trabajar con un grafo implcito, que se va a construir a medida que se va construyendo la solucin, por lo que no podemos aplicar un algoritmo de Recorrido en Profundidad. Lo que si utilizamos es el concepto de que a la hora de recorrer el grafo primero recorremos a nivel hijo, y luego el resto de nodos adyacentes, es decir, buscamos la profundidad, ya que llegar a una solucin significa llegar al nivel mas profundo del rbol.

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 10 de 10

Programacin III Prctica Obligatoria 2012 - 2013

Recorrido en Anchura En un recorrido en anchura el orden de visita es diferente. Cuando se llega a un nodo N se visitan en primer lugar todos los vecinos de N. No nos interesa aplicar este esquema algortmico, ya que nuestra solucin se basa en llegar lo antes posible al ltimo nivel (mas profundo) del rbol.

Datos de prueba utilizados y resultados obtenidos


Se han realizado pruebas exhaustivas para los siguientes tamaos de tableros, obteniendo los siguientes resultados: Tamao N=5 Observaciones Primera solucin Para ejecuciones de bsqueda de la primera solucin, los resultados han sido instantneos para cualquier casilla inicial, tanto encontrando una solucin como no encontrando ninguna, con tiempos inferiores al segundo. Todas las soluciones (parmetro a) Resultados instantneos para cualquier casilla inicial. Es de destacar que el algoritmo no encuentra soluciones para casillas iniciales cuya suma de la posicin x con la posicin y sea impar, p.ej x=1, y=2. Primera solucin Pgina 11 de 11

N=6

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Programacin III Prctica Obligatoria 2012 - 2013


Para ejecuciones de bsqueda de la primera solucin, los resultados han sido instantneos para cualquier casilla inicial, con tiempos inferiores al segundo. Todas las soluciones (parmetro a) En el caso de la casilla inicial 1,1 el algoritmo encuentra mas de 500.000 soluciones en un tiempo inferior a 2 horas. Es decir, en menos de 2 horas encuentra todas las soluciones para una configuracin de casilla inicial que se le indique. Primera solucin Para ejecuciones de bsqueda de la primera solucin, los resultados han sido instantneos para algunas casillas iniciales, como 1-1 pero tardando horas en otros casos. Todas las soluciones (parmetro a) La obtencin de soluciones se demora a horas y horas. Primera solucin Para ejecuciones de bsqueda de la primera solucin, el ordenador debe trabajar mas de 1 da, para la configuracin de casilla inicial 1-1. Todas las soluciones (parmetro a) La obtencin de soluciones se demora a das y das.

N=7

N=8

Ejemplo de ejecucin para distintos tamaos del problema


Para el anlisis y ejecucin en bloque de pruebas he elaborado unos scripts UNIX (sh) que me permiten ejecutar de forma secuencial el algoritmo, y obtener ficheros con los resultados obtenidos. Para ello se ha implementado el parmetro f (no solicitado) , que permite redirigir la salida a un fichero de texto.

Saltocaballo5x5.sh
#SCRIPT PARA EJECUTAR java SaltoCaballo -n 5 -x 1 -y 1 -f 5x5-1_1.txt java SaltoCaballo -n 5 -x 1 -y 2 -f 5x5-1_2.txt java SaltoCaballo -n 5 -x 1 -y 3 -f 5x5-1_3.txt java SaltoCaballo -n 5 -x 1 -y 4 -f 5x5-1_4.txt java SaltoCaballo -n 5 -x 1 -y 5 -f 5x5-1_5.txt

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 12 de 12

Programacin III Prctica Obligatoria 2012 - 2013


java SaltoCaballo -n 5 -x 2 -y 1 -f 5x5-2_1.txt java SaltoCaballo -n 5 -x 2 -y 2 -f 5x5-2_2.txt java SaltoCaballo -n 5 -x 2 -y 3 -f 5x5-2_3.txt java SaltoCaballo -n 5 -x 2 -y 4 -f 5x5-2_4.txt java SaltoCaballo -n 5 -x 2 -y 5 -f 5x5-2_5.txt java SaltoCaballo -n 5 -x 3 -y 1 -f 5x5-3_1.txt java SaltoCaballo -n 5 -x 3 -y 2 -f 5x5-3_2.txt java SaltoCaballo -n 5 -x 3 -y 3 -f 5x5-3_3.txt java SaltoCaballo -n 5 -x 3 -y 4 -f 5x5-3_4.txt java SaltoCaballo -n 5 -x 3 -y 5 -f 5x5-3_5.txt java SaltoCaballo -n 5 -x 4 -y 1 -f 5x5-4_1.txt java SaltoCaballo -n 5 -x 4 -y 2 -f 5x5-4_2.txt java SaltoCaballo -n 5 -x 4 -y 3 -f 5x5-4_3.txt java SaltoCaballo -n 5 -x 4 -y 4 -f 5x5-4_4.txt java SaltoCaballo -n 5 -x 4 -y 5 -f 5x5-4_5.txt java SaltoCaballo -n 5 -x 5 -y 1 -f 5x5-5_1.txt java SaltoCaballo -n 5 -x 5 -y 2 -f 5x5-5_2.txt java SaltoCaballo -n 5 -x 5 -y 3 -f 5x5-5_3.txt java SaltoCaballo -n 5 -x 5 -y 4 -f 5x5-5_4.txt java SaltoCaballo -n 5 -x 5 -y 5 -f 5x5-5_5.txt

Saltocaballo6x6.sh
#SCRIPT PARA EJECUTAR java SaltoCaballo -n 6 -x 1 -y 1 -f 6x6-1_1.txt java SaltoCaballo -n 6 -x 1 -y 2 -f 6x6-1_2.txt java SaltoCaballo -n 6 -x 1 -y 3 -f 6x6-1_3.txt java SaltoCaballo -n 6 -x 1 -y 4 -f 6x6-1_4.txt Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com) Pgina 13 de 13

Programacin III Prctica Obligatoria 2012 - 2013


java SaltoCaballo -n 6 -x 1 -y 5 -f 6x6-1_5.txt java SaltoCaballo -n 6 -x 1 -y 6 -f 6x6-1_6.txt java SaltoCaballo -n 6 -x 2 -y 1 -f 6x6-2_1.txt java SaltoCaballo -n 6 -x 2 -y 2 -f 6x6-2_2.txt java SaltoCaballo -n 6 -x 2 -y 3 -f 6x6-2_3.txt java SaltoCaballo -n 6 -x 2 -y 4 -f 6x6-2_4.txt java SaltoCaballo -n 6 -x 2 -y 5 -f 6x6-2_5.txt java SaltoCaballo -n 6 -x 2 -y 6 -f 6x6-2_6.txt java SaltoCaballo -n 6 -x 3 -y 1 -f 6x6-3_1.txt java SaltoCaballo -n 6 -x 3 -y 2 -f 6x6-3_2.txt java SaltoCaballo -n 6 -x 3 -y 3 -f 6x6-3_3.txt java SaltoCaballo -n 6 -x 3 -y 4 -f 6x6-3_4.txt java SaltoCaballo -n 6 -x 3 -y 5 -f 6x6-3_5.txt java SaltoCaballo -n 6 -x 3 -y 6 -f 6x6-3_6.txt java SaltoCaballo -n 6 -x 4 -y 1 -f 6x6-4_1.txt java SaltoCaballo -n 6 -x 4 -y 2 -f 6x6-4_2.txt java SaltoCaballo -n 6 -x 4 -y 3 -f 6x6-4_3.txt java SaltoCaballo -n 6 -x 4 -y 4 -f 6x6-4_4.txt java SaltoCaballo -n 6 -x 4 -y 5 -f 6x6-4_5.txt java SaltoCaballo -n 6 -x 4 -y 6 -f 6x6-4_6.txt java SaltoCaballo -n 6 -x 5 -y 1 -f 6x6-5_1.txt java SaltoCaballo -n 6 -x 5 -y 2 -f 6x6-5_2.txt java SaltoCaballo -n 6 -x 5 -y 3 -f 6x6-5_3.txt java SaltoCaballo -n 6 -x 5 -y 4 -f 6x6-5_4.txt java SaltoCaballo -n 6 -x 5 -y 5 -f 6x6-5_5.txt java SaltoCaballo -n 6 -x 5 -y 6 -f 6x6-5_6.txt java SaltoCaballo -n 6 -x 6 -y 1 -f 6x6-6_1.txt Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com) Pgina 14 de 14

Programacin III Prctica Obligatoria 2012 - 2013


java SaltoCaballo -n 6 -x 6 -y 2 -f 6x6-6_2.txt java SaltoCaballo -n 6 -x 6 -y 3 -f 6x6-6_3.txt java SaltoCaballo -n 6 -x 6 -y 4 -f 6x6-6_4.txt java SaltoCaballo -n 6 -x 6 -y 5 -f 6x6-6_5.txt java SaltoCaballo -n 6 -x 6 -y 6 -f 6x6-6_6.txt

Saltocaballo7x7.sh
Debido al tiempo de proceso que supone la ejecucin de cada prueba nicamente se han generado 7 casos de prueba. #SCRIPT PARA EJECUTAR java SaltoCaballo -n 7 -x 1 -y 1 -f 7x7-1_1.txt java SaltoCaballo -n 7 -x 1 -y 2 -f 7x7-1_2.txt java SaltoCaballo -n 7 -x 1 -y 3 -f 7x7-1_3.txt java SaltoCaballo -n 7 -x 1 -y 4 -f 7x7-1_4.txt java SaltoCaballo -n 7 -x 1 -y 5 -f 7x7-1_5.txt java SaltoCaballo -n 7 -x 1 -y 6 -f 7x7-1_6.txt java SaltoCaballo -n 7 -x 1 -y 7 -f 7x7-1_7.txt La salida de los diferentes casos de prueba pueden encontrarse en el directorio OUTPUT. Debido a la cantidad de informacin generada me ha parecido mas adecuado mantener en ficheros separados los resultados de las pruebas, en vez de incorporarlos a este documento.

Listado de cdigo fuente completo


El software lo conforman 2 ficheros fuentes, SaltoCaballo.java y EstadoPartida.Java. SaltoCaballo.JAVA. Contiene la funcin MAIN principal y el control y evaluacin de parmetros de entrada. EstadoPartida.JAVA. Contiene la funcin de BackTracking y de pintado de Tablero.

SaltoCaballo.JAVA

//PAQUETES JAVA UTILIZADOS import java.io.*; import java.util.Date;;

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 15 de 15

Programacin III Prctica Obligatoria 2012 - 2013

public class SaltoCaballo {

//LISTA DE VARIABLES UTILIZADAS static Integer N; //Dimensin del tablero de Ajedrez. static Integer xInicio; //Posicin x inicial static Integer yInicio; //Posicin y inicial static Boolean modoTraza; //Establece si tenemos que imprimir todos los estados por los que pasa el tablero. static Boolean modoTodasSoluciones; //Establece si debemos de obtener todas las soluciones o nicamente la primera. static String nomFicheroSalida; //DE USO INTERNO PARA LA OBTENCIN DE FICHEROS DE SALIDA static int paramSalida; //Otras variables static PrintStream miConsola; //TODO Limpiar y Comentar public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException { //variables temporales //CONFIGURACIONES POR DEFECTO DE LA APLICACIN N=8; xInicio=1; yInicio=1; modoTraza=false; modoTodasSoluciones=false; nomFicheroSalida=new String("salida.txt"); paramSalida=0; //POR DEFECTO LA SALIDA ES POR CONSOLA. 0 CONSOLA 1 - FICHERO. //OBJETO FECHAHORA PARA IR GRABANDO LOS EVENTOS DE LA APLICACIN Date fechaHora=new Date(); // 1 - Evaluar que los parmetros enviados son los correctos. if (evalParametros(args)==false) { System.out.println("Los parametros suministrados no son correctos"); System.out.println("El programa finalizar su ejecucin"); System.exit(0); }

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 16 de 16

Programacin III Prctica Obligatoria 2012 - 2013

//CONFIGURACIN DE CONSOLA DE SALIDA if (paramSalida==0) { miConsola=new PrintStream(System.out,true,"UTF-8"); } else { File file = new File(nomFicheroSalida); FileOutputStream fos = new FileOutputStream(file); miConsola=new PrintStream(fos,true,"UTF-8"); }

//CREACIN DE LA PARTIDA //listaSoluciones= new ArrayList<EstadoPartida>(); //COMIENZA MI PARTIDA EstadoPartida estadoInicial=new EstadoPartida(xInicio,yInicio,N,modoTraza,modoTodasSoluciones,miConsol a); miConsola.println(fechaHora.toString() + " Inicio del Proceso de generacin de soluciones: "); estadoInicial.evalPartida(); //MUESTRO UN MENSAJE EN AQUELLAS SITUACIONES EN LAS QUE NBO SE ENCUENTRE SOLUCIN if (estadoInicial.esSolucion==false) miConsola.println("No se ha encontrado un camino que satisfaga las condiciones de partida"); miConsola.println(fechaHora.toString() + " Finalizacin del Proceso de generacin de soluciones"); //FINALIZACIN DEL PROGRAMA } public static Boolean evalParametros(String[] args) { //FIXME -n 5 -x 3 y 3 no funciona. controlarlo. //FIXME -p 5 -x 3 y 3 no funciona. controlarlo.

//VARIABLES TEMPORALES int x=0; //RECORREMOS EL ARRAY DE PARMETROS Y EVALUAMOS try { //RECORRIDO DEL TOTAL DE PARMETROS INCORPORADOS while (x<args.length)

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 17 de 17

Programacin III Prctica Obligatoria 2012 - 2013

{ //SI CAPTO -N LEO LA SIGUIENTE POSICIN QUE DEBE DE SER NUMRICA. EN CASO CONTRARIO SE OBTENDR UNA EXCEPCIN if (args[x].toString().toLowerCase().equals("n")) //CAPTO LA DIMENSIN DEL TABLERO QUE SER LA SIGUIENTE POSICIN { N=Integer.parseInt(args[x+1]); x++; } else { if (args[x].toString().toLowerCase().equals("-x")) //CAPTO LA X {

xInicio=Integer.parseInt(args[x+1]); x++; } else { if (args[x].toString().toLowerCase().equals("-y")) //CAPTO LA y { yInicio=Integer.parseInt(args[x+1]); x++; } else { //OBTENDO SI TRABAJO O NO EN MODO TRAZA if (args[x].toString().toLowerCase().equals("-t")) modoTraza=true; else { //OBTENGO SI DESEO TODAS LAS SOLUCIONES O NO if (args[x].toString().toLowerCase().equals("-a")) modoTodasSoluciones=true; else { if (args[x].toString().toLowerCase().equals("-f")) //CAPTO EL NOMBRE DEL FICHERO { paramSalida=1; //DESEO LA SALIDA POR FICHERO

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 18 de 18

Programacin III Prctica Obligatoria 2012 - 2013


nomFicheroSalida=args[x+1];
x++; } } }

} }

} x++; } //SALIDA CORRECTA return true; } catch(Exception miExcepcion) { //SALIDA INCORRECTA return false; //ha habido algn tipo de error, por lo que debemos devolver false } }

EstadoPartida.JAVA

import java.io.FileNotFoundException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; public class EstadoPartida {

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 19 de 19

Programacin III Prctica Obligatoria 2012 - 2013

//PROPIEDADES PBLICAS DE LA CLASE public int Tablero[][]; //MATRIZ BIDIMENSIONAL QUE REPRESENTA EL TABLERO public int lCamino;//LONGITUD DEL CAMINO. public int xActual; //POSICIN X EN LA QUE NOS ENCONTRAMOS public int yActual; //POSICIN Y EN LA QUE NOS ENCONTRAMOS public boolean modoTraza; public long numTrazas; //PARA CONOCER EL NMERO DE EVALUACIONES QUE LLEVAMOS REALIZADAS public boolean modotodasSoluciones; public int dimTablero; //INDICA LA DIMENSIN DEL TABLERO COMENZANDO POR 1 public int dimTableroidx0;//INDICA LA DIMENSIN DEL TABLERO COMENZANDO POR 0 public boolean esSolucion; //VARIABLE BOOLEANA QUE INDICA SI HEMOS OBTENIDO COMO MNIMO UNA SOLUCIN. public PrintStream miConsola; //VARIABLE QUE REPRESENTA LA CONSOLA DE SALIDA public int xDesp[]; //VECTOR QUE ALMACENA LOS POSIBLES DESPLAZAMIENTOS POR EL EJE X public int yDesp[]; //VECTOR QUE ALMACENA LOS POSIBLES DESPLAZAMIENTOS POR EL EJE Y public int numSoluciones; //VARIABLE QUE ALMACENA EL NMERO DE SOLUCIONES OBTENIDAS public int dimTableroQ2; //PARA QUE NO TENGA QUE HACER LA MULTIPLICACIN EN CADA LLAMADA RECURSIVA

//CONSTRUCTOR POR DEFECTO. public EstadoPartida() { try { initEstadoPartida(); } catch (UnsupportedEncodingException exc) { System.out.println(exc.toString()); } catch (FileNotFoundException exc) { System.out.println(exc.toString()); } } //CONSTRUCTOR DE LA CLASE DE TIPO ESTADOPARTIDA EN BASE A

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 20 de 20

Programacin III Prctica Obligatoria 2012 - 2013


PARMETROS NECESARIOS public EstadoPartida(int xIni,int yIni, int dim, Boolean mTraza, Boolean tSoluciones,PrintStream miConsola) { //VARIABLES TEMPORALES //CUERPO //CONVERSIN DE COORDENADAS A NDICE 0 xActual=xIni-1; //Posicin x de partida. Resto -1 para adaptarlo a matriz con ndice que empieza en 0. yActual=yIni-1; //Posicin y de partida. Resto -1 para adaptarlo a matriz con ndice que empieza en 0. modoTraza=mTraza; modotodasSoluciones=tSoluciones; this.miConsola=miConsola; Tablero=new int[dim][dim]; //Creacin de la matriz que representa el tablero; //Establezco la primera posicin del caballo en el tablero Tablero[xActual][yActual]=1; dimTablero=dim; //Establezco la dimensin del Tablero lCamino=1; //llamada al constructor por defecto try { initEstadoPartida(); } catch (UnsupportedEncodingException exc) { miConsola.println(exc.toString()); } catch (FileNotFoundException exc) { miConsola.println(exc.toString()); } }

//Funcin que focaliza todo lo comn a los diferentes constructores public void initEstadoPartida() throws UnsupportedEncodingException, FileNotFoundException { //Funcin que focaliza todo lo comn a los diferentes constructores esSolucion=false; numSoluciones=0;

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 21 de 21

Programacin III Prctica Obligatoria 2012 - 2013

numTrazas=0; xDesp=new int[8]; yDesp=new int[8]; xDesp[0]=-2;xDesp[1]=-1;xDesp[2]=-2;xDesp[3]=1;xDesp[4]=2;xDesp[5]=1;xDesp[6]=2;xDesp[7]=1; yDesp[0]=-1;yDesp[1]=-2;yDesp[2]=1;yDesp[3]=2;yDesp[4]=1;yDesp[5]=-2;yDesp[6]=1;yDesp[7]=2; dimTableroidx0=dimTablero-1; dimTableroQ2=dimTablero*dimTablero;

} //FUNCIN PRINCIPAL DE CARACTER RECURSIVO QUE REALIZA LA BSQUEDA EN PROFUNDIDAD POR EL ARBOL public EstadoPartida evalPartida() { //VARIALBES UTILIZADAS. int x; //PARA MOVERNOS POR LOS POSIBLES 8 MOVIMIENTOS int xdesptemp; int ydesptemp; int xActualAnt; int yActualAnt;

//SI ESTOY EN MODO TRAZA SIEMPRE IMPRIMO TABLERO, INDEPENDIENTEMENTE DE QUE ME ENCUENTRE CON UNA SOLUCIN O NO if (modoTraza) { numTrazas++; miConsola.println("Traza: " + Long.toString(numTrazas)); miConsola.println("-----------------------------------------------------------------"); PintarTablero(); miConsola.println(); }

//ENCONTRAMOS UNA SOLUCIN if (lCamino==dimTableroQ2) { numSoluciones++; miConsola.println("Solucin encontrada nmero: "+ Integer.toString(numSoluciones)); //IMPRIMO EL TABLERO NICAMENTE SI NO ESTOY EN MODO TRAZA, YA QUE SI NO YA LO TENDRA EN PANTALLA if (modoTraza==false) {

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 22 de 22

Programacin III Prctica Obligatoria 2012 - 2013

miConsola.println("Nmero de soluciones encontradas: "+ Integer.toString(numSoluciones)); miConsola.println("-----------------------------------------------------------------"); PintarTablero(); miConsola.println(); } esSolucion=true; } //OBTENCIN DE NUEVAS SOLUCIONES else { for (x=0;x<8;x++) { //COMPROBAR SI HAY QUE SEGUIR GENERANDO //GENERAREMOS SIEMPRE QUE, O BIEN NO HAYAMOS ENCONTRADO UNA SOLUCIN, O BIEN TENGAMOS QUE ENCONTRAR //TODAS LAS SOLUCIONES if (((modotodasSoluciones==false) && (esSolucion==true))==false) { xdesptemp=xActual+xDesp[x]; ydesptemp=yActual+yDesp[x]; //COMPROBAR QUE LA NUEVA POSICIN EST EN RANGO Y QUE ES UNA CASILLA NO VISITADA if (xdesptemp>=0) { if (xdesptemp<=dimTableroidx0) { if (ydesptemp>=0) { if (ydesptemp<=dimTableroidx0) { //COMPROBAR QUE LA CASILLA NO HA SIDO VISITADA AN if (Tablero[xdesptemp][ydesptemp]==0) { //TENGO UNA CASILLA VLIDA //ACTUALIZO TABLERO Y BAJO EN PROFUNDIDAD xActualAnt=xActual; yActualAnt=yActual;

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 23 de 23

Programacin III Prctica Obligatoria 2012 - 2013


xActual=xdesptemp; yActual=ydesptemp; lCamino++; Tablero[xActual][yActual]=lCamino; //BAJO EN PROFUNDIDAD evalPartida(); //VUELVO DE ABAJO //PONER EL TABLERO A SU SITUACIN ANTERIOR Tablero[xdesptemp][ydesptemp]=0; xActual=xActualAnt; yActual=yActualAnt; lCamino--;

} //CIERRE IF } //CIERRE IF } //CIERRE IF } //CIERRE IF } //CIERRE IF } //CIERRE IF } //CIERRE FOR } //CIERRE ELSE return this; } //CIERRE FUNCIN //FUNCIN QUE PINTA EL TABLERO EN PANTALLA public void PintarTablero() { //VARIABLES TEMPORALES int x,y; for (y=dimTableroidx0;y>=0;y--) ////lo recorro al revs para representar que el eje X crece de abajo a arriba y no de arriba a abajo { for (x=0;x<dimTablero;x++) { if (Tablero[x][y]>9)

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 24 de 24

Programacin III Prctica Obligatoria 2012 - 2013

{ miConsola.print(Integer.toString(Tablero[x][y])); } else { miConsola.print(" " + Integer.toString(Tablero[x][y])); } if (y!=dimTablero) { miConsola.print("\t"); } } miConsola.println(); //SALTO DE LINEA } }

Alfonso Martn Murillo (alfonsomartinmurillo@gmail.com)

Pgina 25 de 25