Está en la página 1de 7

UNIVERSIDAD DE GRANADA

E.T.S. DE INGENIERÍA INFORMÁTICA

Departamento de Ciencias de la Computación


e Inteligencia Artificial

Teorı́a de Algoritmos
Guión de Prácticas

Curso 2002-03

Ingenierı́a Informática
Ingenierı́a Técnica en Informática de Gestión
Ingenierı́a Técnica en Informática de Sistemas
Práctica 2

Programación Dinámica

2.1. Objetivo
El objetivo de la práctica es que el alumno comprenda y asimile el fun-
cionamiento de las técnica de diseño de algoritmos basada en Programación
Dinámica. Para ello se propondrá un problema que habrá de resolverse apli-
cando esta técnica.

2.2. Encontrar la subsecuencia común más lar-


ga
Dado un conjunto finito de sı́mbolos, una secuencia del conjunto es una
disposición finita y ordenada de sı́mbolos del conjunto. Por ejemplo, dado
el conjunto Γ = {a, c, g, t} son secuencias suyas haccggtagtttci y hcgtaatgci.
La longitud de una secuencia es el número de sı́mbolos que la componen:
|hcf taatgci| = 8.
Dada un secuencia, A, una subsecuencia de ésta, Z, es cualquier se-
cuencia que resulta al eliminar cero o más de los sı́mbolos de A. Por ejemplo,
sea A = hacctaggai. Entonces la propia A es un subsecuencia de sı́ misma.
Pero también lo son hactaggai, htai y haai, que resultan de eliminar la pri-
mera c, acc y agg y, todos los sı́mbolos menos el primero y el último o cct
y gga, respectivamente. Para una secuencia de longitud n se pueden extraer
2n subsecuencias.
Dadas dos secuencias A y B, un subsecuencia Z se dice común si es
subsecuencia de A y B simultáneamente. El objetivo de este problema es
encontrar una subsecuencia común a dos secuencias y que sea de longitud
máxima.

1
2.2 Encontrar la subsecuencia común más larga 2

Este es un problema con diversas aplicaciones reales, como por ejemplo:

Biologı́a molecular. Las cadenas de ADN se pueden representar como


secuencias del alfabeto a, c, g, t. Cuando se encuentra una nueva secuen-
cia, interesa encontrar a qué otras secuencias se parece más.

Comparación de modificaciones realizadas sobre ficheros. La utilildad


diff de Unix se usa para comparar dos versiones distintas de un mis-
mo fichero. Funciona buscando una subsecuencia de lı́neas común de
longitud máxima.

Refresco de información en pantalla. Actualizar la información mostra-


da en pantalla cuando se hacen cambios, requiere el envı́o del mı́nimo
conjunto de datos cuando la comunicación entre el ordenador y la pan-
talla es muy lenta (por ejemplo, en terminales serie).

La solución simple a este problema consiste en realizar todas las com-


paraciones posibles guardando en cada caso la que resulte más larga. Este
algoritmo requiere un tiempo proporcional a 2n . Este resultado, claramente
insatisfactorio, se puede mejorar empleando Programación Dinámica.
El primer paso para diseñar un algoritmo basado en Programación Dinámi-
ca consiste en encontrar una formulación del problema que cumpla el prin-
cipio de optimalidad.
Resulta sencillo probar lo siguiente: Sean A = ha1 a2 · · · am i y B = hb1 b2 · · · bn i
dos cadenas. Si la cadena C = hc1 c2 · · · ck i es su subsecuencia común de lon-
gitud máxima entonces se cumple:

1. Si am = bn entonces ck = am = bn y hc1 c2 · · · ck−1 i es una subsecuencia


común de longitud máxima para A y B ambas sin el último sı́mbolo,
es decir, para ha1 a2 · · · am−1 i y hb1 b2 · · · bn−1 i.

2. Si am 6= bn entonces si se verifica ck 6= am se cumple que C es la


subsecuencia común de longitud máxima para A sin el último sı́mbolo
(ha1 a2 · · · am−1 i) y B.

3. Si am 6= bn entonces si se verifica ck 6= bn se cumple que C es la


subsecuencia común de longitud máxima para A y B sin el último
sı́mbolo (hb1 eb2 · · · bm−1 i).

A partir de esta propiedad es fácil diseñar un algoritmo basado en Progra-


mación Dinámica que encuentre una subsecuencia común de longitud máxima
C de dos cadenas dadas, A y B. Lo ilustramos con un ejemplo:
2.2 Encontrar la subsecuencia común más larga 3

Ejemplo
Las cadenas de ADN codifican toda la información genética de un ser vivo
empleando un alfabeto de tan sólo cuatro letras: a (adenina), c (citosina),
g (guanina), t (timina), correspondientes a las cuatro macromoléculas que
pueden aparecer en estas cadenas.
En un análisis para comparar si dos cadenas de ADN pertenecen a un
mismo individuo (o comprobar si dos individuos están emparentados) se de-
termina cuál es la subsecuencia común de longitud máxima y se determina
el porcentaje de longitud de subsecuencia respecto a la longitud de la cadena
del individuo.
Supongamos dos cadenas A = hgacggattagi y B = hgatcggaatagi con
longitudes m = 10 y n = 11, respectivamente. Entonces una subsecuencia
común de longitud máxima serı́a:

A= ga cggattag
B= gatcggaatag
-------------
ga cgga tag

El resultado puede obtener construyendo una tabla considerando el prin-


cipio de optimalidad. Cada celda de esta tabla (i, j) tiene la longitud de
la subsecuencia más larga común a las cadenas A hasta el i-ésimo sı́mbolo,
(ha1 · · · ai i), y B hasta el j-ésimo sı́mbolo, (hb1 · · · bj i).
La tabla que se obtiene para el ejemplo es la siguiente:

0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1
0 1 2 2 2 2 2 2 2 2 2 2
0 1 2 2 3 3 3 3 3 3 3 3
0 1 2 2 3 4 4 4 4 4 4 4
0 1 2 2 3 4 5 5 5 5 5 5
0 1 2 2 3 4 5 6 6 6 6 6
0 1 2 3 3 4 5 6 6 7 7 7
0 1 2 3 3 4 5 6 6 7 7 7
0 1 2 3 3 4 5 6 7 7 8 8
0 1 2 3 3 4 5 6 7 7 8 9

donde la primera fila y la primera columna se inician a 0 y a partir de ahı́ la


posición (i, j) se actualiza según:

si el carácter i-ésimo de la cadena A es igual al j-ésimo de la cadena B,


(ai = bj ), entonces el valor será 1 más el valor de la posición (i−1, j−1),
2.3 Resolución del problema 4

si no, se le asigna el valor máximo de entre los de (i − 1, j) e (i, j − 1).

Como segundo ejemplo consideremos A = hgacacgggattagi y B = hggacatcggaatagi.


Una solución serı́a:

A = g aca cgggattag
B = ggacatcggaa tag
----------------
g aca cgga tag

Y la tabla correspondiente resultarı́a:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 1 2 2 2 2 2 2 2 2 2 2 2 2
0 1 1 2 3 3 3 3 3 3 3 3 3 3 3
0 1 1 2 3 4 4 4 4 4 4 4 4 4 4
0 1 1 2 3 4 4 5 5 5 5 5 5 5 5
0 1 2 2 3 4 4 5 6 6 6 6 6 6 6
0 1 2 2 3 4 4 5 6 7 7 7 7 7 7
0 1 2 2 3 4 4 5 6 7 7 7 7 7 8
0 1 2 3 3 4 4 5 6 7 8 8 8 8 8
0 1 2 3 3 4 5 5 6 7 8 8 9 9 9
0 1 2 3 3 4 5 5 6 7 8 8 9 9 9
0 1 2 3 3 4 5 5 6 7 8 9 9 10 10
0 1 2 3 3 4 5 5 6 7 8 9 9 10 11

2.3. Resolución del problema


Se pide diseñar e implementar un algoritmo basado en Programación
Dinámica para resolver el problema anterior.
Especificar claramente los pasos seguidos para la resolución:

Establecer una formulación del problema que cumpla el principio de


optimalidad e incluir su demostración. La cantidad a optimizar (maxi-
mizar en este caso) es la longitud de la subsecuencia común.

Obtener una definición recursiva de la solución.

Seguir una aproximación ascendente para resolver el problema. O sea,


diseñar un algoritmo para calcular la longitud máxima de las subse-
cuencias comunes.
2.4 Evaluación de la práctica 5

Construir la solución óptima utilizando los valores calculados previa-


mente. Es decir, obtener una subsecuencia común de longitud máxima.
Por tanto, habreis de modificar el algoritmo diseñado en el paso anterior
para recabar la información necesaria para construir la subsecuencia
buscada.
Una vez implementado, realizar un estudio de la eficiencia del algoritmo
creado empleando los tres enfoques conocidos: teórico, empı́rico e hı́brido.

2.4. Evaluación de la práctica


Esta práctica forma parte del conjunto de trabajos que serán evaluados
para obtener la calificación del alumno en la asignatura.
Para su evaluación, el alumno deberá entregar una memoria y un disquete,
que se ajustarán a las siguientes indicaciones:

2.4.1. Estructura de la memoria


La memoria tendrá una portada en la que aparezcan claramente: el
tı́tulo de la práctica, la titulación, el nombre y dirección de correo
electrónico del alumno, y el nombre de su profesor de prácticas.
La memoria deberá contener las siguientes partes:
• Definición del problema.
• Resolución del problema mediante Programación Dinámica indi-
cando cada paso.
• Listado de la implementación de los algoritmos diseñados: el del
cálculo de la longitud de la subsecuencia más larga y el de obten-
ción de una de esas subsecuencias.
• Análisis de la eficiencia del algoritmo: teórico, empı́rico e hı́brido.

2.4.2. Disquete
Junto con la memoria se entregará un disquete con las implementaciones
de los algoritmos indicados. Además de todos los ficheros fuentes correspon-
dientes se incluirá un fichero Makefile que automatice la compilación.
El disquete irá etiquetado con el tı́tulo de la práctica, y el nombre y grupo
de prácticas del alumno.
Finalmente, el disquete se adjuntará dentro de un sobre pequeño pegado
a una de las páginas de la memoria.
2.4 Evaluación de la práctica 6

2.4.3. Otras observaciones


En la página http://decsai.ugr.es/~jmbs/TA puede encontrarse este
guión en distintos formatos, además de información adicional sobre la prácti-
ca.
Fecha lı́mite de entrega: 13 de enero de 2003 a las 14:00h.
Se recuerda que la elaboración de las prácticas es de carácter individual.

También podría gustarte