Tarea 1

Anuncio
PONTIFICIA UNIVERSIDAD CATOLICA DE CHILE
ESCUELA DE INGENIERIA
DEPARTAMENTO DE CIENCIA DE LA COMPUTACION
Lógica para Ciencia de la Computación - IIC2213
Tarea 1
Entrega: Lunes 7 de Octubre
En esta tarea usted deberá utilizar un SAT solver para resolver el problema de planificar la asignación de
cursos a salas de clases en una universidad. En particular, debe encontrar como representar este problema en
lógica proposicional, y luego debe utilizar el SAT solver sobre esta representación para obtener una solución
al problema.
1.
Entrada del problema
La entrada del sistema a construir consiste de los archivos: cursos.txt, salas.txt, facultades.txt,
profesores.txt y fechas.txt. El archivo cursos.txt contiene un número arbitrario de lı́neas de la siguiente forma:
SIGLA
num_sección
PID
num_alumnos
num_clases
num_ayud
num_int
CID
a~
no_y_sem
En cada una de estas lı́neas, SIGLA es la sigla de un curso, num sección corresponde a un número de sección
para el curso, PID es el identificador del profesor que dicta el curso, num alumnos es el número de vacantes
para el curso, num clases y num ayud son los números de clases de cátedra y ayudantı́as del curso por
semana, respectivamente, num int es el número de interrogaciones a realizar en el periodo a planificar, CID
es el identificador de la carrera a la cual pertenece el curso y a~
no y sem es el año y semestre en el cual deberı́a
ser tomado el curso en la carrera con identificar CID, el cual es dado usando el formato (n, s) donde n es un
número entero mayor a 0 y s es 1 ó 2 (representando el primer o segundo semestre). El archivo salas.txt
contiene un número arbitrario de lı́neas de la siguiente forma:
SID
capacidad
FID
En cada una de estas lı́neas, SID es el identificador de una sala de clases, capacidad es la capacidad de esta
sala y FID es el identificador de la facultad a la que pertenece la sala. El archivo facultades.txt contiene
información sobre las facultades que pertenecen a la universidad y las carreras que son dictadas por ellas.
De manera precisa, por cada facultad se tiene una lı́nea de la forma:
FID
nombre_facultad
numero_carreras
donde FID es el identificador de la facultad, nombre facultad es su nombre y numero carreras es el número
de carreras impartidas por esta facultad. Además, suponiendo que la facultad imparte k carreras, después
de la linea FID nombre facultad numero carreras, se tiene k lı́neas de la siguiente forma:
CID
nombre_carrera
donde CID es el identificador de una carrera dictada en la facultad y nombre carrera es el nombre de esta
carrera. El archivo profesores.txt contiene información sobre los profesores de la universidad y los horarios
en los que no pueden hacer clases. De manera precisa, por cada profesor se tiene una lı́nea de la forma:
1
PID
nombre_prof
lista_horarios
donde PID es el identificador del profesor, nombre prof es su nombre (primer nombre y primer apellido,
separado por un espacio), lista horarios es la lista de horarios en las que el profesor no puede dictar
cursos ni tomar interrogaciones. Los horarios en los que se puede dictar cursos y tomar interrogaciones son L
(lunes), M (martes), W (miércoles), J (jueves) y V (viernes) en los módulos 1 (8:30 - 9:50), 2 (10:00 - 11:20), 3
(11:30 - 12:50), 4 (14:00 - 15:20), 5 (15:30 - 16:50), 6 (17:00 - 18:20), 7 (18:30 - 19:50) y 8 (20:00 - 21:20). Cada
horario posible es denotado usando la letra para el dı́a y el número del módulo. Para indicar los horarios en
los que un profesor no puede dictar cursos ni tomar interrogaciones se usa la notación [h1 , . . . , hk ], donde
cada hi es un horario posible. Por ejemplo, [L2,W2,V2] es una lista de posibles horarios. Finalmente, el
archivo fechas.txt contiene una lı́nea de la forma:
fecha_inicio
fecha_término
lista_feriados
donde fecha inicio es la fecha de inicio del semestre (en el formato DD/MM/AAAA), fecha término es la
fecha de término del semestre (en el formato DD/MM/AAAA) y lista feriados es la lista de feriados durante
el semestre, la cual es entregada usando el formato [f1 , . . . , fk ] donde cada fi es una fecha en el formato
DD/MM/AAAA.
2.
2.1.
Problemas a solucionar
Asignación de salas [3 puntos]
En la primera parte de esta tarea usted debe programar en Java un sistema que reciba como entrada los
cinco archivos descritos en la Sección 1, y que retorne un archivo plan.txt donde debe aparecer la asignación
de cursos a salas de clases. De manera precisa, por cada curso mencionado en el archivo cursos.txt, su
archivo debe contener las siguientes lı́neas:
SIGLA num_sección
lista_clases
lista_ayud
lista_int
nombre_prof
num_alumnos
En la primera lı́nea, SIGLA, num sección, nombre prof y num alumnos corresponden a la sigla del curso,
número de la sección del curso, nombre del profesor que dicta esta sección y el número de alumnos de esta
sección. En la segunda lı́nea, lista clases es una lista que indica a qué sala fue asignada cada clase del curso. Si un curso tiene k clases por semana, entonces lista clases debe tener el formato [(1, s1 ), . . . , (k, sk )],
donde cada i corresponde a una clase y si a la sala dónde fue asignada (esta sala es denotada por su identificador SID). En la tercera lı́nea, lista ayud es una lista que indica a qué sala fue asignada cada ayudantı́a
del curso, y que tiene el mismo formato que lista clases. Finalmente, en la cuarta lı́nea, lista int es una
lista que indica en qué fecha y a qué sala fue asignada cada interrogación del curso. Si un curso tiene ` interrogaciones, entonces lista int debe tener el formato [(1, f1 , s1 ), . . . , (`, f` , s` )], donde cada i corresponde
a una interrogación, fi es la fecha cuándo se debe realizar esta interrogación (en el formato DD/MM/AAAA) y
si es la sala dónde se realizará esta interrogación (al igual que en los casos anteriores, esta sala es denotada
por su identificador SID). Además, las fechas deben estar ordenadas de acuerdo a las interrogaciones, vale
decir, si 1 ≤ i < j ≤ `, entonces fi debe ser una fecha anterior a fj en [(1, f1 , s1 ), . . . , (`, f` , s` )].
Para realizar la asignación de salas para los distintos cursos en la universidad, usted debe tomar en cuenta
las siguientes restricciones:
Cada clase y ayudantı́a de un curso necesita de un módulo. Cada interrogación necesita de dos módulos
y debe ser asignada a dos horarios contiguos.
No puede haber topes en la asignación de horarios y salas entre las clases, ayudantı́as e interrogaciones
de cursos distintos.
2
No puede haber topes en la asignación de horarios y salas entre las clases, ayudantı́as e interrogaciones
de secciones distintas del mismo curso.
Dos clases distintas de la misma sección del mismo curso deben ser asignados a horarios distintos.
Un curso no puede tener asignada una sala con una capacidad menor que el número de vacantes del
curso.
No puede haber topes de horario (en clases, ayudantı́as e interrogaciones) entre dos cursos distintos
que están asignados al mismo año y semestre en la misma carrera.
Cada sección de un curso es dictado por un profesor.
Un profesor no puede dictar dos clases en el mismo horario (de dos cursos distintos, o de dos secciones
distintas del mismo curso).
Un profesor no puede hacer clases ni tomar interrogaciones en los horarios en qué declaro conflictos en
el archivo profesores.txt.
Las fechas de todas las interrogaciones deben estar en el rango especificado en el archivo fechas.txt,
y no pueden coincidir con algún dı́a feriado.
2.2.
Una mejor asignación de salas [3 puntos]
En muchas aplicaciones es posible mejorar la calidad de las soluciones entregadas por un SAT solver restringiendo el problema tratado. En la segunda parte de la tarea se pide que usted agregue restricciones al
problema planteado en la Sección 2.1, y las codifique en su sistema, de manera tal de obtener mejores soluciones. Como ejemplos de estas restricciones, podrı́a considerar que en general las interrogaciones de un curso
deberı́an distribuirse de manera uniforme durante el semestre y que se espera que la primera interrogación
no sea tomada los primeros dı́as de clases. Además, se espera que la misma sala sea ocupada para todas las
clases de la sección de un curso, al igual que para todas las ayudantı́as de esta sección.
3.
SAT solver
Para utilizar el SAT solver lo primero que se debe hacer es añadir a su proyecto las tres librerı́as que se encuentran en la página del curso. Para usar el SAT solver, debe utilizar la instrucción import satPackage.*;.
Luego podrá usar la clase llamada Solver, la cual contiene un método estático llamado ResolverArchivo.
Este método recibe como parámetro el nombre de un archivo con extensión .cnf. Dicho archivo debe representar una fórmula en lógica proposicional expresada en CNF en formato CNF-Dimacs. Un archivo en este
formato se ve de la siguiente forma:
La primera lı́nea debe ser exactamente [p cnf n k], donde n es la cantidad de variables proposicionales
de la fórmula, y k la cantidad de cláusulas de la fórmula. Llamaremos {p1 , . . . , pn } a las variables
proposicionales de la fórmula.
Desde la segunda lı́nea en adelante, cada lı́nea representa una cláusula. Para representar una cláusula
se debe escribir los subı́ndices de las variables proposicionales que aparecen en ella, seguidos de un cero.
Si una variable pi aparece negada, entonces se debe escribir -i. Los números deben estar separados por
un espacio.
Por ejemplo, considere la siguiente fórmula ϕ en lógica proposicional:
(p ∨ q ∨ r) ∧ (q ∨ ¬r ∨ ¬s ∨ t) ∧ (p ∨ r) ∧ (¬p ∨ ¬r ∨ s) ∧ (p ∨ s ∨ ¬t) ∧ (r ∨ ¬s).
3
Para representar ϕ en formato CNF-Dimacs, primero debemos enumerar las variables:
p1 = p
p2 = q
p3 = r
p4 = s
p5 = t.
Entonces nuestra fórmula corresponde a:
(p1 ∨ p2 ∨ p3 ) ∧ (p2 ∨ ¬p3 ∨ ¬p4 ∨ p5 ) ∧ (p1 ∨ p3 ) ∧ (¬p1 ∨ ¬p3 ∨ p4 ) ∧ (p1 ∨ p4 ∨ ¬p5 ) ∧ (p3 ∨ ¬p4 ),
que es representada en formato CNF-Dimacs de la siguiente forma:
p cnf 5 6
1 2 3 0
2 -3 -4 5 0
1 3 0
-1 -3 4 0
1 4 -5 0
3 -4 0
Nótese que en el ejemplo las variables de cada cláusula están ordenadas según los subı́ndices de las letras
proposicionales. Esto no es un requisito, podrı́amos cambiar en el archivo mostrado arriba la segunda lı́nea
por 3 1 2 0, y el archivo resultante serı́a equivalente.
Volviendo a la clase Solver, una vez que tenemos nuestro archivo en formato CNF-Dimacs, el cual supondremos que tiene por nombre formula.cnf, podemos llamar a Solver.ResolverArchivo("formula.cnf").
Si la fórmula almacenada en formula.cnf es satisfacible, este método retorna un arreglo de enteros que representa una valuación σ que satisface la fórmula. De manera especı́fica, cada posición del arreglo entregado
contiene un número i que representa el valor asignado a una variable. Si el número i es positivo, entonces
σ(pi ) = 1. En caso contrario, si i es negativo, entonces σ(p−i ) = 0. Por ejemplo, si el arreglo entregado es [-3,
1, 4,-5, 2], entonces la valuación σ satisface que σ(p1 ) = σ(p2 ) = σ(p4 ) = 1 y σ(p3 ) = σ(p5 ) = 0. Finalmente,
si la fórmula almacenada en formula.cnf no es satisfacible, entonces el método retorna un arreglo con cero
elementos.
Importante:
Si el archivo dado como parámetro a ResolverArchivo no está en el formato correcto, entonces el
método retornará un arreglo con cero elementos y enviará un mensaje a consola informando el problema.
Si el archivo está en el formato correcto pero la cantidad de variables o la cantidad de cláusulas no son
correctas, entonces el método puede entregar una respuesta incorrecta.
El tiempo lı́mite para procesar una fórmula es de 10 horas. Para cambiar dicho tiempo se debe utilizar
el segundo parámetro del método ResolverArchivo, el cual es opcional y representa el tiempo lı́mite
de la ejecución expresado en segundos. Si el tiempo lı́mite es excedido, el programa envı́a un mensaje
a consola indicando esto y retorna un arreglo de largo cero.
4
Descargar