PROYECTO FINAL-Fecha de entrega: 11 de Mayo de 2012, 5:30PM

Anuncio
Proyecto Final
TC4001 Fundamentos de Computación
Análisis de Algoritmos (CB99-102)
Profr. Dr. Hugo Terashima Marı́n
12 de Abril de 2012 Entrega: 11 de Mayo de 2012, 5:30PM
1.
Problemas
El proyecto consiste de dos problemas y puede realizarse en grupos de hasta tres personas máximo. Los
problemas son los siguientes:
1. Problemas SAT.
SAT es la abreviatura para el problema de satisfactibilidad: dada un estatuto proposicional, determinar
si es satisfacible, y si es, mostrar las proposiciones que tienen que ser verdaderas para hacer el estatuto
verdadero. 3SAT es el problema de encontrar la asignación de verdad para que el estatuto proposicional
el cual se establece forma 3-CNF (Conjunctive Normal From), que se define como sigue:
Una literal es un sı́mbolo proposicional (verdadero o falso) o su negación (e.g P ó ¬P ).
Una cláusula es una disyunción de literales: Una 3-cláusula es una disyunción con exactamente 3
literales (e. g. (P ∨ Q ∨ ¬R))
Un estatuto en CNF es una conjunción de cláusulas, en un estatuto 3-CNF la conjunción es de
3-cláusulas.
Ejemplo de una 3-CNF con cuatro cláusulas y 5 sı́mbolos proposicionales (variables booleanas):
(P ∨ Q ∨ ¬S) ∧ (¬P ∨ Q ∨ R) ∧ (¬P ∨ ¬R ∨ ¬S) ∧ (P ∨ ¬S ∨ T )
En este problema vas a implementar y probar el algoritmo GSAT, que es utilizado para resolver
problemas SAT, en particular para determinar la dificultad en problemas SAT. GSAT es un algorimo
que utiliza reinicialización y es del tipo alpinista (hill-climber). El estado incial es una asignación
aleatoria de true o f alse para los sı́mbolos proposicionales (variables). Por ejemplo, para el ejemplo
anterior, se podrı́a empezar con f alse para P y Q, y true para R, S, y T . La función de evaluación
mide el número de cláusulas satisfechas, ésto es, cláusulas con al menos una literal true. Ası́, el estado
inicial obtiene una evaluación de 3, porque la segunda, tercera y cuarta cláusulas son true. Si hay
n variables boolenas, entonces hay n operadores, donde cada operador cambia el valor de asignación
para cada uno de los sı́mbolos. En la búsqueda de alpinista, simpre se busca el operador que resulta
en mejor evaluación (si hay varios con la misma evaluación se escoge uno arbitrariamente). Nuestro
ejemplo se resuelve en un paso, cambiando la asignación de S de true a f alse se obtiene la solución.
Con el algoritmo de reinicio aleatorio, al menos que se encuentre la solución después de un número
de pasos, se desiste y se inicia otra vez con una nueva asignación aleatoria. Después de un número de
reinicios, se desiste definitivamente. El algoritmo completo se muestra abajo.
function GSAT (sentence, max-restarts,max-climbs)
returns a truth assignment or failure
1
for i = 1 to max-restarts do
A <- A randomly generated truth assignment
for j = 1 to max-climbs
If A satifies a sentence then return A
A <- a random choice of one of the best succesors of A
end
end
return failure
Contesta las siguientes preguntas relacionadas con el algoritmo.
a) Determina si el algoritmo es sound y complete (Investiga estos conceptos primero)
b) Implementa GSAT y muestra un pequeño ejemplo con su funcionamiento.
c) Usa GSAT para resolver problemas 3-SAT aleatorios de diferentes tamaños. Hay dos parámetros
clave: N , el número de variables proposicionales, y C, el número de cláusulas. Con N fija en 20,
presenta una gráfica del tiempo promedio de ejecución contra C/N , con C/N de 1 a 10. Usa N
como el valor de max-restarts y 5N como el valor de max-climbs.
d ) Repite para valores de N = 15.
e) ¿ Qué puedes concluir sobre la dificultad en problemas para diferentes valores de N , C y el ratio
C/N ? ¿ Se parecen los resultados a los del artı́culo de Bryan Hayes Can’t get no satisfaction?
f ) Determina por qué un problema 2-SAT es P y el 3-SAT es NP.
2. Diseño Eficiente de Algoritmos
Escoge algún programa o alguna parte de un sistema que hayas desarrollado en alguna optra materia
o en tú trabajo. La longitud debe ser de entre 250-400 lı́neas de código. Una vez que hayas hecho la
selección relaiza lo siguiente:
a) Describe las partes principales de tu programa tratando de separar en módulos independientes.
Imagina que tienes que describir un algoritmo explicando el proceso completo efectuado en tú programa.
b) Para cada módulo analiza la complejidad en tiempo y en espacio, describiendo la operación básica,
el caso peor, el caso promedio, y las estructuras de datos utilizadas. Corre tu programa para
diferentes inputs y detalla el número de operaciones básicas en cada módulo. Genera la complejidad
total.
c) Rediseña tu programa tratando de hacerlo más eficiente. Prueba que los resultados son correctos y
analiza tu programa de la misma forma que lo hiciste en la parte anterior. Compara la complejidad
total de este nuevo programa con el anterior.
d ) Obtiene toda las conclusiones y comentarios pertinentes al llevar a cabo el análisis anterior.
3. Elabora un reporte tipo artı́culo que contenga el desarrollo de los problemas anteriores y sus respuestas,
incluyendo para cada uno la introducción, metodologı́a, experimentos, resultados, discusión y conclusiones, y bibliografı́a.
2
Descargar