Unidad V Técnicas Avanzadas de Análisis y Diseño de Algoritmos 1. 15.1-1 Modifique el procedimiento PRINT-STATIONS para imprimir las estaciones de las líneas de ensamblaje en orden creciente (Sugerencia: Use Recursividad).
Solución:
RECURSIVE-PRINT-STATIONS(1,n) i ← 1 while ( n ≥ 1 ) RECURSIVE-PRINT-STATIONS(1,n-1) i ← 1i [n] print “line i” i “, station” n – 1
Otra solución sería:
2. 15.1-2 Use las ecuaciones (15.8) y (15.9) y el método de sustitución para demostrar que r i(j), el número de referencias hechas a f i[j] en un algoritmo recursivo es igual a 2 n-j. Solución:
3. 15.1-5 el Profesor Canty supone que podrían existir algunos valores e i, a i,j y t i,j para los cuales FASTEST-WAY produce l i[j] tal que l 1[j]=2 y l 2[j]=1 para alguna estación numero j. Asumiendo que todos los costos de transferencia t i,j son no negativos, muestre que el profesor está equivocado.
Solución:
Si l 1[j] = 2, entonces la manera más rápida de pasar por la estación j en la línea 1 consiste en cambiar las líneas de la estación de j-1 en la línea 2. Esto significa que f 2[j-1] + t 1,j-1 + ai,j < f 1[j-1] + a 1, j. Quitando a 1, j de ambos lados de la ecuación se obtiene f 2[j-1] + t 1, j-1 < f 1[j-1]. Si L 2[j] = 1, entonces la manera más rápida de pasar por la estación j en la línea 2 es cambiando las líneas de la estación de j-1 en la línea 1. Esto significa que f 1[j-1] + t 2, j-1 + a2, j < f 2 [j-1] + a 2, j. Quitando a 2, j de ambos lados de la ecuación se obtiene f 1[j-1] + T2, j-1 < f 2 [j-1]. Se puede obtener una contradicción mediante la combinación de las dos ecuaciones anteriores de la forma siguiente: De f 2 [j-1] + t1, j-1 < f 1 [j-1]
y
f 1 [j-1] + t 2, j-1 < f 2 [j-1]
Se obtiene f 2 [j-1] + t 1, j-1 + t2, j-1 < f 2 [j-1]. Dado que todos los gastos de transferencia son no negativos, la desigualdad resultante no se cumple. Concluyendo entonces que no se puede tener la situación donde l 1[j] = 2 y L 2[j] = 1.
4. 15.2-1 Encuentre una parentización óptima para el problema de multiplicación de matrices con secuencia de dimensiones: 5, 10, 3, 12, 5, 50, 6.
Solución:
Se debe resolver la multiplicación encadenada de matrices para el problema específico. Esto se puede resolver mediante el empleo del algoritmo MATRIXCHAIN-ORDER (p) donde p = <5, 10, 3, 12, 5, 50, 6> o, simplemente, usando la ecuación m[i,j], que se detalla a continuación:
Tenemos entonces los siguientes resultados:
La tabla m:
m [1, 2] = 150, m [2, 3] = 360, m [3, 4] = 180, m [4, 5] = 3000, m [5, 6] = 1500 m [1, 3] = 330, m [2, 4] = 330, m [3, 5] = 930, m [4, 6] = 1860 m [1, 4] = 405, m [2, 5] = 2430, m [3, 6] = 1770 m [1, 5] = 1655, m [2, 6] = 1950 m [1, 6] = 2010
i/j 1 2 3 4 5 6
1 0
2 150 0
3 330 360 0
4 405 330 180 0
5 1655 2430 930 3000 0
La tabla s:
s [1, 2] = 1, s [2, 3] = 2, s [3, 4] = 3, s [4, 5] = 4, s [5, 6] = 5 s [1, 3] = 2, s [2, 4] = 2, s [3, 5] = 4, s [4, 6] = 4 s [1, 4] = 2, s [2, 5] = 2, s [3, 6] = 4 s [1, 5] = 4, s [2, 6] = 2 s [1, 6] = 2
6 2010 1950 1770 1860 1500 0
i/j 1 2 3 4 5 6
1 0
2 1 0
3 2 2 0
4 2 2 3 0
5 4 2 4 4 0
6 2 2 4 4 5 0
De acuerdo al algoritmo citado, la tabla se calcula simplemente por el hecho de que m [i, i] = 0 para todo i. Esta información se utiliza para calcular m [i, i +1] para i = 1, ... n-1 y así sucesivamente. Finalmente se tiene entonces la siguiente parentización:
15.2-2 Codifique un algoritmo recursivo MATRIX-CHAIN-MULTIPLICACION (A, s, i, j) que realiza la multiplicación óptima de cadenas de matrices (A 1, A2,...,An), La tabla s es calculada por MATRIX-CHAIN-ORDEN. (La llamada inicial sería MATRIX-CHAIN-MULTIPLICACION (A, s, 1, n).). Solución:
5. 15.3-1 ¿Cuál es una manera más eficiente para determinar el número óptimo para la multiplicación de cadenas de matrices: la enumeración de todas las formas posibles de parentización y calculando el número de multiplicaciones para cada uno, o correr el algoritmo MATRIX-CADENA? Justifica tu respuesta.
Solución:
Correr
RECURSIVE-MATRIX-CHAIN
(multiplicación
encadenada
de
matrices) es asintóticamente más eficiente que la enumeración de todas las formas de parentizar el producto de las matrices y calcular el número de multiplicaciones en cada multiplicación.
Considere el tratamiento de los subproblemas por los dos enfoques:
Para cada lugar posible a dividir la cadena de matriz, el método de enumeración encuentra todas las formas de colocar paréntesis en la mitad izquierda, busca todas las formas de colocar paréntesis en la mitad derecha, y mira a todas las posibles combinaciones de la mitad izquierda con la mitad derecha. El resultado de la cantidad de trabajo para buscar en cada combinación de izquierda y derecha en la mitad del subproblema, es la cantidad de formas de hacer el producto en la mitad izquierda y la cantidad de formas de hacerlo en la mitad derecha.
En cada lugar posible para dividir la cadena de matrices, RECURSIVEMATRIX-CHAIN encuentra la mejor manera de parentizar la mitad izquierda, encuentra la mejor manera de parentizar la mitad derecha, y combina solo esos dos resultados. Por lo tanto la cantidad de trabajo para combinar los resultados subproblema izquierda y derecha media es O (1).
Tomando como premisa, basados en el libro texto, que el tiempo de ejecución para la enumeración es Ω(4n/n3/2). Vamos a demostrar que el tiempo de ejecución de RECURSIVO-MATRIX-CADENA es O (n3 n-1). Para obtener una cota superior del tiempo de ejecución de RECURSIVEMATRIX-CHAIN, vamos a usar el mismo criterio para obtener un límite inferior: Derive una recurrencia de la forma T (n) ≤. . . y resolver por sustitución. Por el límite inferior de la recurrencia, se asume (de acuerdo al libro texto) que cada uno tomará por lo menos por unidad de tiempo. Por la recurrencia del límite superior, asumiremos que cada par de líneas tomar un tiempo constante c. Por lo tanto, tenemos la recurrencia:
Esto es igual que las recurrencias estudiadas previamente del libro texto, excepto que tiene c en lugar de uno, por lo que se puede reescribir como:
Vamos a demostrar que T(n) = O (n3 n-1) utilizando el método de sustitución. (Nota: Cualquier límite superior de T(n) es o(4 n/n3/2) será suficiente. Si se prefiere, para demostrar una que es más fácil de imaginar, por ejemplo, T (n) = O (3.5n). ) Específicamente, vamos a demostrar que T (n) ≤ cn3 n-1 para todo n ≥ 1. La base es fácil, ya que T (1) ≤ c = c · 1 · 3 1-1. Inductivamente, para n ≥ 2 tenemos:
Correr RECURSIVE-MATRIX-CHAIN toma un tiempo de O(n3N n-1), y enumerar toda la parentización toma un tiempo de
Ω (4n/n3/2), y así
RECURSIVE-MATRIX-CHAIN es más eficiente que la enumeración. Nota: La sustitución anterior utiliza el hecho de que
Esta ecuación puede ser derivada de la ecuación (A.5) tomando la derivada. Tenemos:
6. 15.3-2 Dibuje el árbol de la recursividad para el procedimiento MERGE-SORT de la Sección 2.3.1 en un conjunto de 16 elementos. Explique por qué memorización es ineficaz en la aceleración de un algoritmo divide y conquista como MERGE-SORT. Solución: La memorización es ineficaz en la aceleración de un algoritmo divide y conquista como MERGE-SORT, ya que el mismo realiza, la mayoría de las veces, una sola llamada a cualquier par de índices en el arreglo que está siendo ordenado. En otras palabras, los subproblemas no se solapan y por lo tanto memorización no mejorará el tiempo de ejecución.
7. 15.3-4 Describa cómo la programación de líneas de ensamblaje tiene superposición de subproblemas. Solución:
8. 15-7 Supongamos que tiene una máquina y un conjunto de n trabajos a1, a2,. . . ,an para ser procesados. Cada trabajo de aj tiene un tiempo de procesamiento de tj, un lucro pj, y un plazo dj. La máquina sólo puede procesar un trabajo a la vez, y el trabajo aj se debe ejecutar ininterrumpidamente en tj
unidades de tiempo. Si el trabajo aj se completa en el plazo dj, recibirá un pj de lucro, pero si se completa después de su plazo límite, recibirá una ganancia de 0. Escriba un algoritmo para encontrar el programa que obtiene la cantidad máxima de ganancias, asumiendo que todos los tiempos de procesamiento son números enteros entre 1 y n. ¿Cuál es el tiempo de ejecución de su algoritmo?
Solución:
Primero se deben ordenar los trabajos en orden creciente de d j (plazo). Supóngase que los n trabajos a 1, ..., an, son ordenados de esta manera. Consideremos la siguiente función recursiva. S [j, d] denota el subproblema de j trabajos a0,..., an y d un plazo en el que tenemos que terminar todos nuestros trabajos. Es decir, la solución factible debe terminar el último trabajo en el momento d.
Dado que esta función recursiva satisface la propiedad de subestructura óptima, se genera la solución óptima. Todo lo que tenemos que hacer es construir una tabla de tamaño n por dn y obtener la solución para S [ n, d n] utilizando recursividad hacia arriba. El tiempo de ejecución es max { n lg n, n max1≤ j ≤n d j}
9. ¿El Problema de Líneas de Ensamblaje puede ser atacado por programación Voraz? Daría soluciones óptimas? Explique. Solución:
10. 16.1-1 Hacer un algoritmo programación dinámica para el problema de selección de actividades, basado en la recurrencia (16,3). El algoritmo debe calcular las dimensiones C [i, j] como se ha definido anteriormente y también producir el subconjunto de actividades A de tamaño máximo. Supóngase que las entradas se han clasificado como en la ecuación (16,1). Compare el tiempo de ejecución de su solución con el tiempo de ejecución de GREEDYACTIVITYSELECTOR. Solución:
11. 16.1-2 Suponga que en vez de seleccionar la primera actividad que termine, se debe seleccionar la última actividad que es compatible con todas las actividades previamente seleccionadas. Describa cómo este enfoque es un algoritmo voraz, y demostrar que se obtiene una solución óptima.
Solución:
El enfoque propuesto, seleccionando la última actividad para empezar que es compatible con todas las actividades previamente seleccionadas, es en realidad el algoritmo voraz, pero a partir del final en lugar de al principio. Otra forma de verlo es la siguiente. Se nos ha dado un conjunto S = {a1, a2,. . . Otra forma de verlo es la siguiente. Se nos ha dado un conjunto S = {a 1, a2... an} de actividades, donde a i = [si, f i), y nos proponemos encontrar una solución óptima mediante la selección de la última actividad para empezar que es compatible con todas las actividades previamente seleccionadas. En su lugar, vamos a crear un conjunto S' = {a' 1, a' 2,. . . , a' n}, donde a i = [f i y s i). Es decir, a’i es la inversa de a i. Es evidente que un subconjunto de {a i1, a i2,…, a ik} ⊆
S es mutuamente compatible si y sólo si el subconjunto correspondiente {a' i1,
a'i2,…, a' ik}
⊆
S' es también mutuamente compatible. Por lo tanto, una solución
óptima para S es directamente a una solución óptima para S' y viceversa.
El enfoque propuesto de selección de la última actividad para empezar que es compatible con todas las actividades previamente seleccionadas, cuando se ejecuta en S, da la misma respuesta que el algoritmo voraz del texto - la selección de la primera actividad a fin de que sea compatible con todas las actividades previamente seleccionadas - cuando se ejecuta en S ’. La solución que el enfoque propuesto encuentra para S corresponde a la solución que el algoritmo voraz del texto encuentra para S', por lo que se demuestra que es óptimo.
12. 16.1-4 No todo planteamiento voraz en el problema de selección de actividades produce un conjunto de tamaño máximo de actividades compatibles entre sí. Dé un ejemplo para mostrar que el enfoque de selección de la actividad de menor duración compatible con las actividades previamente seleccionadas no funciona. Haga lo mismo para enfoques que siempre seleccionan la actividad compatible que se solapa con la menor cantidad de las actividades que quedan y siempre seleccionando la actividad compatible restante con el tiempo de inicio más temprano.
Solución:
Para el enfoque de selección de la actividad de menos duración de aquellos que son compatibles con las actividades previamente seleccionadas:
Este enfoque sólo selecciona {a2}, pero la solución óptima selecciona {a1, a3}.
Para el enfoque de seleccionar siempre la actividad compatible que se solape con la menor cantidad de las otras actividades restantes:
Este enfoque selecciona primero a 6, y después de la elección, sólo se pueden seleccionar dos de las otras actividades (una de a 1, a2, a3, a4 y una de los a 8, a9, a10, a11). Una solución óptima es {A1, A5, A7, A11}.
Para el enfoque de seleccionar siempre la actividad restante compatible con el tiempo de inicio más temprano, sólo tiene que añadir una actividad más con el intervalo [0, 14) para el ejemplo en la sección 16.1. Será la primera actividad seleccionada, y ninguna otra actividad será compatible con ella.
13. 16.2-1 ¿Por qué el problema de la mochila fraccional es un algoritmo voraz? Justifique.
Solución:
Digamos que la estrategia voraz utiliza totalmente el elemento i más costoso, y el resto forma parte de los i +1 elementos más caros. Entonces, supongamos alguna estrategia no voraz funcionó mejor. Luego tendría que usar menos de la totalidad de uno de los i elementos más costoso, o menos del elemento i +1 más costoso, con el fin de tener espacio para utilizar algún otro elemento. Digamos que se usa menos del artículo j y sume más del elemento k. Se podría sustituir la cantidad del artículo k con la cantidad faltante del elemento j y tener una mezcla que es por lo menos este valor. Se puede repetir este proceso hasta que toda la cantidad de objetos no incluidos en la mezcla voraz, pero incluido en la “solución óptima" no voraz han sido reemplazados por cantidad de producto en la solución voraz, y la mezcla voraz es como mínimo más valiosa. Esto es una contradicción.
14. 16.2-2 De una solución de programación dinámica al problema de la mochila 01 que corra en O(nW) donde n es el número de ítems y W el peso máximo de los ítems colocados en la mochila.
Solución:
En primer lugar, se tiene que el problema mochila 0-1 muestra una subestructura óptima. Si una solución óptima contiene el elemento n, las opciones restantes deben constituir una solución óptima a un problema similar en los ítems 1, 2, ..., n - 1, con límite W - w n. . Si una solución óptima no contiene n elementos, la solución también debe ser una solución óptima a un problema similar en los puntos 1, 2, ..., n - 1 con límite W . Sea m[i,j] el valor total que puede ser tomado de los primeros i artículos , cuando la mochila puede soportar el peso j. Nuestro problema es conseguir que el valor máximo de m [n, W], donde n es el número de elementos dados y W es el peso máximo de elementos que el ladrón puede ponerlo en su mochila. Podemos expresar esto en la siguiente fórmula:
El algoritmo toma como entrada n, W, y las dos secuencias de v = < v 1, v2,..., vn> y w = . Almacena los valores m[i, j] en una tabla, es decir, una matriz de 2 dimensiones, m [0 ... n, 0 ... W], cuyas entradas se calculan en el orden de importancia de las filas. (Es decir, la primera fila de m es llenada de izquierda a derecha, a continuación, la segunda fila, y así sucesivamente.) Al final del proceso, m [n, W] contiene el valor máximo que se puede empacar en la mochila. Podemos usar esta recursividad para crear un algoritmo de programación dinámica sencillo:
Debido a que cada m [i, j] se puede calcular en tiempo constante, el funcionamiento total sería de O (N).
15. 16.2-3 Suponga que en el problema de la mochila 0-1 el orden de los ítems cuando son ordenados ascendentemente por peso es el mismo que cuando son ordenados descendentemente. Codifique un algoritmo eficiente que encuentre una solución óptima a esta variante del problema de la mochila y argumente la correctitud de su solución. Solución:
16. 16.2-5 Describa un algoritmo eficiente que, dado un conjunto de puntos {x1, x2,..., Xn} en la recta real, determina el conjunto más pequeño de intervalos de longitud unitaria cerrada que contiene todos los puntos dados. Argumente que su algoritmo es correcto. Solución:
17. 16.2-6 Muestre como resolver el problema de la mochila fraccional en tiempo O(n). Solución:
18. 16-1 Considere el problema de hacer el cambio para n centavos utilizando el menor número de monedas. Supóngase que el valor de cada moneda es un número entero. Solución:
a.
Describa un algoritmo voraz para hacer un cambio con monedas de venticinco, de diez centavos, cinco centavos, y monedas de un centavo. Demostrar que el algoritmo obtiene una solución óptima.
b.
Codifique un algoritmo de tiempo O (nk) que hace el cambio para cualquier conjunto de denominaciones de monedas diferentes k, suponiendo que una de las monedas es un centavo.