Esquemas Algorı́tmicos. 20020131 Dept. de Lenguajes y Sistemas Informáticos. 1. (3,5p) Considera el problema estudiado en las prácticas: una empresa de M trabajadores que desea presentar N productos enviando para cada producto n al menos a uno de los trabajadores involucrado en su desarrollo, pero minimizando el número total de trabajadores enviados. Si las soluciones son vectores binarios de M componentes, escribe una función de cota superior y otra inferior para el estado (x1 , . . . , xm , ∗, . . . , ∗). Importante: no se puntuarán las cotas triviales (por ejemplo, sumar todas las xk distintas de 1 para obtener una cota inferior). 2. (4,5p) Un robot con dos brazos debe soldar una serie de puntos r1 , . . . , rN en un circuito. Aunque el orden de soldadura no puede cambiarse, puede elegirse qué brazo realizará la soldadura. Se quiere encontrar la secuencia de movimientos que minimiza la longitud total de los desplazamientos realizados si inicialmente ambos brazos se encuentran en la posición r0 y las distancias son conocidas. d 1 2 3 4 0 100 89 45 61 1 100 63 108 2 100 60 36 3 63 60 50 r2 ◦ r4 ◦ ◦r3 r0 ◦ ◦r1 • Comprueba que la solución voraz no es correcta para el ejemplo anterior. • Escribe una función de programación dinámica recursiva que permita resolver el problema y analiza su coste temporal en función de N . • Dibuja el árbol de llamadas recursivas que se genera para los datos del ejemplo y escribe el resultado en cada nodo. • Compara el número de cálculos con el de un esquema recursivo puro y con el de un esquema iterativo. Ayuda: considera la distancia f (n, k) que se debe recorrer todavı́a cuando se llevan soldados n puntos y un brazo está en rk (el otro, obviamente, está en rn ). 3. (2p) Se toma un número aleatorio ζ dado por unpgenerador uniforme √ (p. ej., drand48) y se le aplica la transformación t = 1 − 1 − ζ. ¿Cuál es la densidad de probabilidad f (t) de los sucesos t generados? Las calificaciones provisionales se publicarán en http://www.dlsi.ua.es (sección consulta de notas) el 19 de febrero. Esquemes Algorı́tmics. 20020131 Dept. de Llenguatges i Sistemes Informàtics. 1. (3,5p) Considereu el problema estudiat en les pràctiques: una empresa de M treballadors que vol presentar N productes enviant per a cada producte n almenys a un dels treballadors involucrat en el seu desenvolupament, però minimitzant el nombre total de treballadors enviats. Si les solucions són vectors binaris de M components, escriu una funció de cota superior i altra inferior per a l’estat (x1 , . . . , xm , ∗, . . . , ∗). Important: no es puntuaran les cotes trivials (per exemple, sumar totes les xk diferents de 1 per a obtenir una cota inferior). 2. (4,5p) Un robot amb dos braços ha de soldar una sèrie de punts r1 , . . . , rN en un circuit. Encara que l’ordre de soldadura no es pot canviar, es pot elegirquin braç farà la soldadura. Es vol trobar la seqüència de moviments que minimitza la longitud total dels desplaçaments realitzats si inicialment els dós braços es troben en la posició r0 i les distàncies són conegudes. d 1 2 3 4 0 100 89 45 61 1 100 63 108 2 100 60 36 3 63 60 50 r2 ◦ r4 ◦ ◦r3 r0 ◦ ◦r1 • Comprova que la solució voraç no és correcta per a l’exemple anterior. • Escriu una funció de programació dinàmica recursiva que permeta resoldre el problema i analitza el seu cost temporal repecte de N . • Dibuixa l’arbre de crides recursives que es genera per a les dades de l’exemple i escriu el resultat en cada node. • Compara el nombre de càlculs amb el d’un esquema recursiu pur i amb el d’un esquema iteratiu. Ajuda: considera la distància f (n, k) que s’ha de recórrer encara quan es duen soldats n punts i un braç està en rk (l’altre òbviament, està en rn ). 3. (2p) Es pren un nombre aleatori ζ donat perpun generador uniforme √ (p.ej., drand48) i se li aplica la transformació t = 1 − 1 − ζ. ¿Quina és la densitat de probabilitat f (t) dels successos t generats? Les qualificacions provisionals es publicaran en http://www.dlsi.ua.es (secció consulta de notes) el 19 de febrer. 1. Hay muchas posibilidades distintas para obtener una cota superior o inferior. A continuación se describe un ejemplo. Una cota superior viene dada por cualquier solución particular contenida en el nodo. Es preciso darse cuenta de que en algunos casos no existirán soluciones con las opciones x1 , ..., xm tomadas. En ese caso, ningún número finito u garantiza que existe una solución mejor o igual que u y la cota superior debe ser, por tanto, ∞. En caso contrario, nos conviene que u sea lo más baja posible y una forma que permite encontrar resultados con un coste computacional moderado es una estrategia voraz: P (a) Sea u = m i=1 xi . (b) Hágase xi = 0 para i = m + 1, ...M . (c) Sea n el número de trabajos tales que xi = 0 para todos los trabajadores i involucrados en él. (d) Constrúyase una lista con los trabajadores m+1, ..., M ordenados de mayor a menor productividad (esto es, número de productos en los que está involucrado) y hágase k = 1. (e) Selecciónese al trabajador k en la lista (supongamos que es el i, hágase u = u + 1 y recalcúlese n teniendo en cuenta que xi = 1. (f) Si n > 0 vuélvase al paso anterior con k = k + 1. Las cotas inferiores deben garantizar que ninguna solución es mejor que el valor g dado. Una opción senciall consiste en usar el algoritmo anterior, pero modificando el paso (e) de manera que n se calcula restando el número de trabajos en los que participa i (sin tener en cuenta repeticiones). 2. La solución voraz consiste en mover en cada instante el brazo que está más cerca del punto a soldar. En este ejemplo, la secuencia de movimientos voraz es: r0 → r1 , r0 → r2 , r2 → r3 , r3 → r4 y la distancia total recorrida es 100 + 89 + 60 + 50 = 299. En cambio, la distancia óptima es d(r0 , r1 ) + d(r1 , r2 ) + d(r0 , r3 ) + d(r2 , r4 ) = 100 + 100 + 45 + 36 = 281. Es evidente que la función f (n, k) tiene solución trivial si n = N . En ese caso ya se han soldado todos los puntos y la distancia que falta por recorrer es 0. En general, tenemos dos opciones: (a) mover hasta el punto rn+1 el brazo que se encuentra en la posición rn y resolver el problema f (n + 1, k); (b) mover el brazo que está en rk y resolver el problema f (n + 1, n). Por tanto, la siguiente función recursiva resuelve el problema ( 0 si n = N f (n, k) = min{d(n, n + 1) + f (n + 1, k), d(k, n + 1) + f (n + 1, n)} si n < N Una implementación de f (n, k) que usa programación dinámica recursiva es la siguiente: struct Sol { double dist; stack<int> s; }; // distancia recorrida // la solución Sol f ( int n, int k ) { Sol r1, r2, res; if ( A[n][k]<0 ) { // consulta el almacén if ( n == N ) { res.dist = 0; } else { r1 = f(n+1, k); r2 = f(n+1, n); if ( r1.dist + d(n, n+1) <= r2.dist + d(k, n+1) ) { res.dist = r1.dist + d(n, n+1); res.s = r1.s; res.s.push(n); } else { res.dist = r2.dist + d(k, n+1); res.s = r2.s; res.s.push(k); } } A[n][k] = res; } return A[n][k]; } El coste temporal de este algoritmo es, en el peor caso, proporcional a N 2 (la argumentación de este coste es simple y puede consultarse en otros ejercicios). El árbol de llamadas recursivas que se genera con esta función es el dibujado en al figura 1. Como puede verse, el algoritmo realiza 15 llamadas en vez de las 2N +1 = 32 de la función recursiva. Un algoritmo iterativo rellenarı́a el almacén A completo. Como hay 5 valores posibles de n y 4 posibles de k, el tamaño del almacén es 20. 3. Dado que para generar la distribución f (x) usamos q p x = F −1 (ζ) = 1 − 1 − ζ entonces, F (x) = ζ = 1 − (1 − x2 )2 Y, por definición, f (x) = F 0 (x) = 4x(1 − x2 ) f (0, 0) = 281 H HH H HH H f (1, 0) = 181 HH H HH H HH H f (2, 0) = 81 HH HH H H f (3, 0) = 50 f (3, 2) = 36 HH HH H H f (4, 0) = 0 f (4, 3) = 0 f (4, 2) = 0 f (4, 3) = 0 HH H HH f (2, 1) = 99 HHH H H f (3, 1) = 50 f (3, 2) = 36 HH H f (4, 1) = 0 f (4, 3) = 0 Figura 1: Árbol de llamadas recursivas. H f (1, 0)