Corso di Laurea in Informatica Corso di Algoritmi II Esercitazione – 16 gennaio 2007 1. Composizione dello Zaino L’algoritmo di programmazione dinamica che risolve il problema ‘zaino’ nella versione di ottimizzazione non calcola l’insieme J degli oggetti che ottimizzano il contenuto dello zaino,: function Zaino-0-1 (K, k1, ..., kn, v1, ..., vn, n: integer): integer ak[1..n] k1, ..., kn av[1..n] v1, ..., vn for h 0 to n do MP[h,0] 0 for H 0 to K do MP[0,H] 0 for h 1 to n do for H 1 to K do if (H-ak[h]) 0 and MP[h-1, H] < MP[h-1, H-ak[h]]+av[h]) then MP[h, H] MP[h-1, H-ak[h]]+av[h] else MP[h, H] MP[h-1, H] return MP[n, K] Modificare l’algoritmo per ottenere anche l’insieme di indici J tale che {vj | j J } sia la soluzione. Suggerimento: Usare una seconda matrice booleana MQ il cui elemento MQ[h, H] = vero se e solo se la soluzione trovata per il problema P(h, H), usa l’elemento h-mo Per trovare l’insieme J basterà “procedere a ritroso” sulla matrice MQ. function Zaino-0-1 (K, k1, ..., kn, v1, ..., vn, n: integer): integer ak[1..n] k1, ..., kn av[1..n] v1, ..., vn for h 0 to n do MP[h,0] 0 for H 0 to K do MP[0,H] 0 for h 1 to n do for H 1 to K do if (H-ak[h]) 0 and MP[h-1, H] < MP[h-1, H-ak[h]]+av[h]) then MP[h, H] MP[h-1, H-ak[h]]+av[h] MQ[h, H] “true” else MP[h, H] MP[h-1, H] MQ[h, H] “false” return MP[n, K] Calcolo dell’insieme J, inizialmente vuoto Calcolo_J (MQ: array nxK, H, h: integer; J: set) if h = 0 or H = 0 then return while not MQ[h, H] do h h-1 J J {h} Calcolo_J (MQ, H-ak[h], h-1) return Calcolo iterativo dell’insieme J Calcolo_J_iter (MQ: array nxK, H, h: integer) J HK for i n to 1 do if MQ[i, H] then J J {i} H H-ak[i] return J Si può sostituire la matrice MP con due vettori: uno per la riga “precedente” ed uno per la riga che si sta costruendo (poi alla fine si scambiano i vettori ....), mentre per costruire l’insieme J serve mantenere tutta la matrice MQ. Per ognuno dei seguenti problemi: a) Scrivere la definizione induttiva. b) Fornire l’algoritmo di programmazione dinamica basato sulla definizione data. c) Specificare la complessità dell’algoritmo a costi uniformi 2. Torneo In un torneo si sfidano due squadre: INF e MAT. I due team giocano al più 2n-1 partite, in quanto vince la squadra che per prima raggiunge n vittorie, supponendo che non vi siano partite che finiscono alla pari. Si conosce la probabilità p che ha la squadra INF di vincere in ogni singola partita, mentre q = (1- p) è la probabilità di vincere in ogni singola partita della squadra MAT. Indichiamo con P(i, j) la probabilità del team INF di vincere il torneo quando gli mancano i vittorie, mentre all’avversario ne mancano j per aggiudicarsi il torneo. P(n, n) è pertanto la probabilità iniziale P(0, j) = 1 INF ha vinto, qualunque sia j > 0 P(i, 0) = 0 INF ha perso, qualunque sia i > 0 P(0, 0) è indefinito P(i, j) = p . P(i-1, j) + q . P(i, j-1) i, j >= 1 3. Resto Si hanno monete di n valori diversi e T[1..n] è un array che fornisce tali valori; per ogni valore si dispone di un numero illimitato di monete. Si deve scegliere il minimo numero di monete il cui valore complessivo ammonti ad un intero dato, minore o uguale ad L. N.B. Si usi per indicare l’impossibilità di formare la somma con le monete a disposizione. P[i,j] = 0 P[i-1,j] min {P[i-1,j], P[i, j-T[i]] + 1} se j = 0 se i = 0 and j > 0 se j < T[i] se i, j 0 and j T[i] 4. Sottostringhe comuni Siano date due stringhe P = p1,…,pm e T = t1,…,tn di caratteri. Si fornisca un algoritmo di programmazione dinamica per individuare la più lunga sottostringa comune di caratteri consecutivi. M[i, 0] = M[0, j] = 0 M[i, j] = M[i-1, j-1] + 1 M[i, j] = 0 se P[i] = T[j] se P[i] <> T[j] 5. Catene di montaggio. Uno stabilimento automobilistico ha due catene di montaggio. Il telaio di un’automobile entra in una catena, riceve nuovi componenti in un certo numero di stazioni e infine esce completa dalla catena di montaggio. Ogni catena ha n stazioni: Si,j (i = 1, 2, j = 1, …, n). Le stazioni j-esime su ognuna delle due catene eseguono le stesse lavorazioni, ma essendo state costruite con tecnologie diverse, i tempi di lavorazione sono diversi. Sia ai,j il tempo di montaggio nella stazione Si,j. Il telaio impiega un tempo ei per entrare nella prima stazione della catena i, i tempi di spostamento da una stazione alla successiva della stessa catena sono trascurabili, mentre si ha un tempo di uscita xi per l’automobile completa. Quando si presenta un ordine urgente la macchina in lavorazione può essere trasferita da una catena ad un’altra per minimizzare i tempi; in tal caso comunque si paga un tempo di trasferimento ti,j per abbandonare la catena i, in uscita dalla j-esima stazione. Il problema consiste nel determinare quali stazioni di lavorazione scegliere dalla catena 1 e dalla catena 2 in modo da minimizzare il tempo totale di assemblaggio dell’automobile.