(3,5p) Considera el problema estudiado en las

Anuncio
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)
Descargar