PRÁCTICA 2: SATISFACCIÓN DE RESTRICCIONES

Anuncio
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/)
Descargar