FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL Departamento de Ciencia de la Computación e Inteligencia Artificial Universidad de Alicante Curso 2010/2011 PRÁCTICA 2: SATISFACCIÓN DE RESTRICCIONES. CRUCIGRAMA Objetivos Implementar dos algoritmos básicos en satisfacción de restricciones: AC3 y Forward Checking Aplicar dichos algoritmos a un problema en concreto, en este caso la resolución de crucigramas Enunciado Resolver el problema del crucigrama: encontrar las palabras que se ajustan a los huecos del crucigrama, tanto en horizontal como en vertical. Además, cuando una palabra colocada en horizontal en el crucigrama se cruza con otra vertical, la posición en la que se cruzan debe contener el mismo carácter. Hay que tener en cuenta que en cada fila o columna del tablero puede haber más de una palabra dependiendo de las casillas negras que tenga el crucigrama. Se proporciona un entorno gráfico desarrollado en java en el cual es posible establecer tanto las casillas ocupadas como caracteres concretos en cualquier casilla. Al ejecutar el programa aparece un tablero vacío, tal y como se muestra en la imagen de la izquierda. Para introducir los cuadrados ocupados (que separan las palabras), tal y como se muestra en la imagen de la derecha, debemos hacer clic en el cuadrado con el botón izquierdo del ratón. Además, es posible obligar a que en un determinado cuadro haya una determinada letra, para ello debemos pulsar con el botón derecho del ratón sobre el cuadrado, aparecerá un dialogo donde debemos indicar el carácter. El código está distribuido en seis clases: • Para lanzar el entorno hay que ejecutar la clase Principal. Esta clase espera que le pasemos un fichero de texto con las palabras que vamos a considerar como diccionario de entrada. Este diccionario no es más que una lista de palabras separadas por espacios y sin signos de puntuación. Junto con el código fuente se os facilita un diccionario de ejemplo. Podéis crear más diccionarios que tendrán que estar ubicados en el directorio raiz del proyecto. • Las clases CspGUI y PanelTablero se ocupan de los componentes gráficos. En la clase PanelTablero se encuentran las constantes NFILAS Y NCOL. Cambiando el valor de estas constantes se puede cambiar el tamaño del crucigrama a resolver. • La clase Casilla representa la posición de una celda en el tablero. • La clase Diccionario mantiene la información de la lista de palabras que se usa como entrada. Las variables del CSP tomarán valores de dominio usando este diccionario. • En la clase Tablero se encuentra la representación interna del tablero: una matriz bidimensional de tipo char. Dentro de esta clase se encuentran los métodos resolverAC3() y resolverFC() que hay que completar con los algoritmos AC3 y Forward Checking respectivamente. • Cuando se termine de ejecutar el método resolverFC(), el tablero debe estar actualizado con los caracteres de las variables. Este método puede aplicarse tanto para un tablero con su configuración inicial como tras la ejecución de AC3. En este último caso los dominios de las variables al comenzar a ejecutar FC serán los devueltos por AC3. • Después de ejecutar el algoritmo AC3(), se debe mostrar por pantalla cómo queda el dominio de cada variable. Ejemplo: Horizontal(0,0): IDIOMAS, REDUCIR, ACCEDER, IMPULSO, DERECHO, LLAMADA Horizontal(1,0): DE, EN, LO, ES, YA, LA, SU, SE, UN, SI, NO, HA, NI Horizontal(1,3): EL, EN, AL, LO, ES, YA, LA, SU, SE Horizontal(1,6): O, I, U, E, A, Y, R, P, S, G, H, L, X, C, N Horizontal(2,0): AYER, ESTA, COMO, HACE, TRES, SEIS, TODA, VOTO Horizontal(2,5): DE, EL, EN, AL, LO, SU, SE, UN, SI, NO, NI, LE, CM Horizontal(3,0): O, I, E, A, R, D, P, S Horizontal(3,2): SALTO, GANEN, DESDE, SUELO, ALABO, RENTA Horizontal(4,1): UNOS, PARA, PLAN, TRES, TODA, PASE, ELLA Horizontal(4,6): O, E, A, R, S, L, N Vertical(0,0): AYER, ESTA, UNOS, WEBS, COMO, PLAN Vertical(0,1): LAS, DEL, LOS, POR, LEY, MES, UNA, MUY Vertical(4,1): I, U, E, A, R, D, P, S, T, G, K, L, Z, C, V, B, N, M Vertical(0,2): O, I, U, E, A, R, D, P, S, Q, T Vertical(2,2): LAS, DEL, LOS, POR, MES, UNA, CON, SER, VEA, DOS Vertical(0,3): SOBRE, SALTO, ENERO, GANEN, HASTA, EUROS Vertical(0,4): DE, EL, EN, AL, LO, ES, YA, LA, SU, SE, UN Vertical(3,4): DE, EL, EN, AL, LO, ES, LA, SE, UN, SI, NO, NI Vertical(0,5): O, I, E, A, R, D, S, W, T, H, J, L, Ñ, Z, C, V Vertical(2,5): DE, EL, EN, AL, LO, LA, SU, SE, UN, SI Vertical(0,6): SOBRE, ENERO, SUELO, ANTES, AYUDA, ENTRE, SACAR Detalles de implementación • El código de vuestros algoritmos, tanto forward checking como ac3, debe incluirse dentro de la clase Tablero. • Tened en cuenta que para la corrección de la práctica es posible que se utilicen tableros de distintos tamaños así como distintos ficheros de diccionario. Entrega de la práctica La fecha límite de entrega es el lunes 6 de diciembre de 2010 hasta las 12:00 de la noche. La entrega se realizará a través de Campus Virtual en el apartado de Evaluación>Controles. Para ello se seleccionará la asignatura FIA y el profesor correspondiente. La entrega constará de un fichero .ZIP que contendrá dos carpetas: • '/src' donde se encontrará la carpeta de proyecto de Netbeans. El nombre de proyecto debe ser “CrucigramaNombreApellido1Apellido2”. Un ejemplo sería “CrucigramaRaulMartinez Serra” Debéis aseguraros que la carpeta carga correctamente en este entorno. No se admitirán proyectos hechos con otras herramientas o entregar únicamente el código fuente. • '/doc' donde estará disponible la documentación en formato PDF explicando de forma detallada la implementación de los dos algoritmos con las pruebas realizadas. El nombre del fichero ZIP tendrá el siguiente formato: “NombreApellido1Apellido2.ZIP”. Un fichero de ejemplo sería RaulMartinezSerra.zip • IMPORTANTE!!! no cumplir cualquiera de las normas de formato/entrega anteriores puede suponer un suspenso en la práctica. Recordad que las prácticas son individuales y NO se pueden hacer en parejas o grupos. Cualquier código copiado supondrá un suspenso de la práctica para todas las personas implicadas en la copia. • IMPORTANTE!!! se recomienda que la implementación se realice dentro de la clase tablero. • IMPORTANTE!!! la documentación deberá incluir una sección de experimentación en la que se describan las pruebas realizada, dejando bien claro el objetivo de las pruebas, cómo se han llevado a cabo, qué información se ha recopilado a partir de las mismas, y qué conclusiones se han extraído. Una documentación sin este apartado se considerará suspensa. Se deberán tener las dos partes de la práctica (documentación y código) aprobadas por separado para poder aprobar la práctica. Software útil • Netbeans (www.netbeans.org/)