Lavori con precedenza: algoritmo di Lawler per minimizzare la massima penalità
delle operazioni con precedenze Sequenziamento delle operazioni con precedenze J1 J2 J3 J5 J4 J6 magazzino con movimentazione interna Ci possono essere precedenze fra i lavori da compiere rappresentate da un grafo, anche non connesso
gi funzione non decrescente Algoritmo di Lawler (1973) min max* gi (ci) S i=1,…,n gi funzione non decrescente * misura regolare: non decresce con ci max tardiness gh (ch) gk (ck) ci ch ck gi(ci) lateness
Ti: “tardiness”, fuori tempo ( Li: “lateness”, ritardo che negativo diventa anticipo ) Ti := Max (0, ci - di) Ti: 0 di ci
gk (ck) gh (ch) ci ch ck gi(ci) V: insieme dei lavori senza successori nel grafo delle precedenze t := åi pi 1 n k: gk (t) = min gi (t) Ji Î V g i(t) g h (t) g k (t) max gk (ck) gh (ch) ci gi(ci) ch ck t lateness tardiness $ S ottima: Jk è ultimo in S
Dim: $ S ottima: Jk è ultimo in S k: gk (t) = min gi (t) Ji Î V JA Jk JB Jl Sia S’ ottima S’ : c'k c’B t JA JB Jl Jk S : cA cB cl t
S’ ottima ci £ c'i i k g i (ci) £ g i (c'i) i k g k (ck) = g k (t) £ g l (t) = gl (c’l) max g i (ci) £ max g i (c’i) i=1,…,n i=1,…,n
i(k): gi(k) (t) = min gi (t) J i Î V PASSI DELL’ALGORITMO Grafo delle precedenze 1) k := n G : = { }; n tn := åi pi 1 Lavori senza successori in G 2) V := { }; i(k): gi(k) (t) = min gi (t) J i Î V
3) tk := tk - pi(k); G := G/{ nodo Ji(k)}; k := k -1 4) k ³ 1 Passo 2 k = 0 S = { Ji(1), Ji(2), ... Ji(n)}
gi (ci) = ci - di lateness Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J1 J2 J3 J5 gi (ci) = ci - di J4 lateness J6
t n = 6 gi (ci) = ci - di Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t n = 6
t Lavori Ji: J1 J2 J3 J4 J5 J6 15 gi (tn) : * * 6 * 4 8 n = 6 gi (ci) = ci - di J5 J4 Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t 15 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 i(n)=5 n = 6
t 15 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 13 gi (ci) = ci - di J5 J4 Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t 15 13 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 gi (t5) : * * 4 * 6 i(n)=5 i(5)=3 n = 6
t Lavori Ji: J1 J2 J3 J4 J5 J6 15 gi (tn) : * * 6 * 4 8 13 gi (ci) = ci - di J5 J4 Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t 15 13 9 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 gi (t5) : * * 4 * 6 gi (t4) : * 3 * 2 i(n)=5 i(5)=3 i(4)=6 n = 6
t 15 13 9 8 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 gi (ci) = ci - di J5 J4 Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t 15 13 9 8 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 gi (t5) : * * 4 * 6 gi (t4) : * 3 * 2 gi (t3) : * 2 1 i(n)=5 i(5)=3 i(4)=6 i(3)=4 n = 6
Sequenza ottima: Ji(1) Ji(2) ...Ji(k) ... Ji(n-1) Ji(n) n = 6 gi (ci) = ci - di J5 J4 Lavori: J1 J2 J3 J4 J5 J6 Tempi pi : 2 3 4 3 2 1 Cons. di : 3 6 9 7 11 7 J6 t 15 13 9 8 5 2 Lavori Ji: J1 J2 J3 J4 J5 J6 gi (tn) : * * 6 * 4 8 gi (t5) : * * 4 * 6 gi (t4) : * 3 * 2 gi (t3) : * 2 1 gi (t2) : * -1 gi (t1) : -1 i(n)=5 i(5)=3 i(4)=6 i(3)=4 i(2)=2 i(1)=1 Sequenza ottima: Ji(1) Ji(2) ...Ji(k) ... Ji(n-1) Ji(n) n = 6
Algoritmo di Smith modificato: sequenze efficienti rispetto al completamento medio e il ritardo massimo
Algoritmo di Smith modificato Efficiente rispetto F e Tmax 1980 F’ < F° T’max £ T°max S° : Efficiente: $ S’ : F’ £ F° T’max < T°max F non c’è efficienza (inclusa frontiera) Tmax := maxi Ti 1 n F° non c’è sequenza (inclusa frontiera) Tmax T°max
[S EDD Lmax £ 0] Algoritmo di Smith (1956) min F S : Tmax = 0 $ soluzione Ses le sequenze EDD danno Tmax £ 0 : cm := å r pr 1 n ri = 0 tutti i pezzi disponibili al tempo iniziale F = 1 n åi (ci - ri) = c flusso medio
F = c = Si ci Si ci Jk Jl S’ : Jl Jk S : nF’ = nF - cl + c’k > nF una sequenza è minima solo se l’ultimo lavoro è (uno) di lunghezza massima, tra quelli che possono (senza ritardo) essere sequenziati in ultimo : Jk Jl S’ : c’k cm pl < pk dk , dl ³ cm dk dl Jl Jk cl< c’k S : cl cm dk dl nF’ = nF - cl + c’k > nF F’ non è ottimo F = c = Si ci 1 n 1 n Si ci 1 n
Jk Jl S’ : Si c’i Jl Jk S : Si ci Si c’i Si ci Si ci = - cl + c’k > la sequenza dei rimanenti n-1 è minima solo se l’ultimo lavoro è (uno) di lunghezza massima, tra quelli che possono (senza ritardo) essere sequenziati al posto n-1 : Jk Jl S’ : Si c’i 1 n-1 c’k pl < pk dk , dl ³ cm dk dl Jl Jk cl< c’k S : cl Si ci 1 n-1 dk dl Si c’i 1 n-1 = - cl + c’k > F’ non è ottimo Si ci 1 n-1 Si ci 1 n-1 e così via a ritroso
Passi dell’algoritmo di Smith (1956) 1) k := n U : = { J1 ... Jn }; tn := år pr n 1 2) i(k): Ji(k) Î U (i) di(k) ³ t ( per ipotesi) (ii) Jl Î U dl ³ t pl £ pi(k)
(i) di(k) ³ t ( per ipotesi) (ii) Jl Î U dl ³ t 2) i(k): Ji(k) Î U (i) di(k) ³ t ( per ipotesi) (ii) Jl Î U dl ³ t pl £ pi(k) Il passo 2 pone al posto k-esimo il lavoro di peso massimo tra quelli che ci possono stare con il vincolo Tmax =0 il vincolo Tmax =0 equivale a Lmax 0
3) tk := tk - pi(k); U := U / { Ji(k)}; k := k -1 4) k ³ 1 Passo 2 k = 0 S = { Ji(1), Ji(2), ... Ji(n)}
Algoritmo di Smith modificato: Efficiente rispetto F e Lmax Dati: una sequenza EDD dei lavori: { J1 ... Jn } D ³ Tmax della EDD di := di + D D D dk dl dk dl Modifica dell’algoritmo
(i) di(k) ³ t ( per ipotesi) (ii) Jl Î U dl ³ t 2) i(k): Ji(k) Î U diviene pl £ pi(k) (i) di(k) ³ t ( per ipotesi) (ii) Jl Î U dl ³ t 2’) i(k): Ji(k) Î U pl < pi(k) pl = pi(k) => dl £ di(k) NO! di(k) < dl pl pi(k) =
F°:= min F * Lmax £ D D° = min Lmax F £ F° È il risultato dell’algoritmo modificato * Attenzione: Lmax può essere negativo Con D°:= Lmax per la S ottima D° = min Lmax F £ F° La condizione modificata dà:
F £ F° D°= T°max = min Tmax F £ F° F° = min F Tmax £ D°= T°max Se D° ³ 0 Con D° = min Lmax F £ F° l’algoritmo dà: F° = min F Tmax £ D°= T°max D°= T°max = min Tmax F £ F°
Efficienza rispetto F e Tmax F°= min F Tmax £ T°max F < F° Tmax £ T°max $ S: S° è Efficiente T°max = min Tmax F £ F° F £ F° Tmax < T°max F non c’è efficienza* F° non c’è sequenza* * frontiera compresa T°max Tmax
L’algoritmo dà una sequenza S efficiente rispetto a F e Tmax Att. : Se i(k) non è unico al passo 2’ ogni scelta diversa porterà a sequenze efficienti diverse
Efficienza rispetto F e Tmax Esempio: curva di efficienza Lavori: J1 J2 J3 J4 Tempi pi : 2 4 3 1 Cons. di : 1 2 4 6 Punto 1 n Passo 1: D = Passo 2: Smith mod. dà: J4 J1 J3 J2 åi pi = 10 1 F° = 5 T°max = 8
Efficienza rispetto F e Tmax Se ci sono più SPT l’alg. da’ quella con Lm minore. Es.: Lavori: J1 J2 J3 J4 Tempi pi : 2 4 4 1 Cons. di : 1 2 4 6 L: 2 5 6 -5 Punto 1 n Passo 1: D = Passo 2: Smith mod. dà: J4 J1 J2 J3 åi pi = 10 1 L’altra SPT avrebbe dato 9 F° = 5 T°max = 6
Efficienza rispetto F e Tmax Esempio: curva di efficienza Lavori: J1 J2 J3 J4 Tempi pi : 2 4 3 1 Cons. di : 1 2 4 6 Punto 2 Passo 1: D = 8 -1 = 7 ³ 0 Passo 2: Smith mod. dà: J4 J1 J2 J3 F° = 5.25 T°max = 6
Efficienza rispetto F e Tmax Esempio: curva di efficienza Lavori: J1 J2 J3 J4 Tempi pi : 2 4 3 1 Cons. di : 1 2 4 6 Punto 3 Passo 1: D = 6 -1 = 5 ³ 0 Passo 2: Smith mod. dà: J1 J2 J3 J4 La seq. è una (la unica in questo caso) EDD quindi non si può abbassare T°max F° = 6.75 T°max = 5
Efficienza rispetto F e Tmax Esempio: curva di efficienza Lavori: J1 J2 J3 J4 Tempi pi : 2 4 3 1 Cons. di : 1 2 4 6 Infatti: Passo 1: D = 5 -1 = 4 ³ 0 Passo 2: non ci sono sequenze con T°max £ 4 perché min Lm = 5
Efficienza rispetto F e Tmax Esempio: curva di efficienza: punti calcolati F non c’è efficienza F°= 6.75 F°= 5.25 F°= 5 non c’è sequenza* 4 T°max = 6 T°max = 8 T°max= 5 Tmax
Efficienza rispetto F e Tmax Esempio: curva di efficienza: punti calcolati F non c’è efficienza* EDD: min Lmax = 5 F°= 6.75 F°= 5.25 SPT: min F = 5 F°= 5 non c’è sequenza* 4 T°max = 6 T°max = 8 T°max= 5 Tmax
Efficienza rispetto S c ed Lm Per come si sviluppa l’algoritmo chiamato Smith modificato è più corretto parlare di min Lm (che può anche risultare negativo) e più comodo usare S c = nF S c non c’è efficienza* EDD: min Lm = 5 S°c = 27 S°c = 21 SPT: min S°c = 20 S°c= 20 non c’è sequenza* 4 L°m = 6 L°m = 8 L°m= 5 Lm Si noti che, mentre il punto con la Lm più a destra è senz’altro relativo a una SPT, quello più a sinistra ha la Lm di una EDD, ma può non essere relativo, come qui è, a una EDD.
L(SPT => min Lm) : -17 -12 - 5 - 4 2 11 Sc(SPT)= 50 c(SPT => min Lm) : 1 3 6 9 13 18 L(SPT => min Lm) : -17 -12 - 5 - 4 2 11 Sc(SPT)= 50 minLm = 11 Lavori: A B C D E F Tempi p : 1 2 3 3 4 5 Cons. d : 18 15 11 13 11 7 L £ 10 18 14 9 n = 6 t Lavori: A B C D E F L18 : 0 3 7 5 7 11 L14 : -4 -1 3 1 * 7 L9 : -9 -6 -2 -4 * * Col vincolo L £ 10, occorre calcolare i ritardi solo con c=18 perché la data dovuta minore è 7, il che porta ad escludere F. Scelto E come il più lungo dei restanti, i ritardi con c=14 degli altri saranno tutti £ 10, quindi vanno ordinati secondo la SPT che ha il minor Lm, il che fa scegliere D e non C con c=9. J(n):E J(5):F J(4):D °c : 1 3 6 9 18 14 S°c =51 Sequenza ottima: A B C D F E Min Lm = 7 Min Sc => L£ 10 Sc = 51
Sequenza ottima: A B C F E D Min Lm = 5 Otteniamo ora un altro punto di efficienza imponendo L £ 6 Lavori: A B C D E F Tempi p : 1 2 3 3 4 5 Cons. d : 18 15 11 13 11 7 18 15 11 n = 6 t Lavori: A B C D E F L18 : 0 3 7 5 7 11 L15 : -3 0 4 * 4 8 L11 : -7 -4 0 * * 4 Col vincolo L £ 6, occorre calcolare i ritardi solo con c=18 (attribuito a D) e con c=15 (attribuito a E). I ritardi degli altri (A,B,C,F) saranno tutti £ 6, perché i completamenti c diminuiscono. Quindi vanno ordinati secondo la SPT che ha il minor Lm, ma qui è unica: proprio A B C F J(n):D J(5):E J(4):F °c : 1 3 6 18 15 11 S°c = 54 Sequenza ottima: A B C F E D Min Lm = 5 Min Sc => L£ 6 Sc = 54
Sequenza ottima: A C F E D B Min Lm = 3 Otteniamo ora un altro punto di efficienza imponendo L £ 4 Lavori: A B C D E F Tempi p : 1 2 3 3 4 5 Cons. d : 18 15 11 13 11 7 18 16 13 9 n = 6 t Lavori: A B C D E F L18 : 0 3 7 5 7 11 L16 : -2 * 5 3 5 9 L13 : -5 * 2 * 2 6 L9 : -9 * -2 * * 2 Col vincolo L £ 4, si calcolano i ritardi con c=18 (attribuito a B), con c=16 (attribuito a D) , con c=13 (attribuito a E) , con c=9 (attribuito a F). I ritardi degli altri (A e C) saranno tutti £ 4, perché i completamenti c diminuiscono. Quindi vanno ordinati secondo la SPT che ha il minor Lm, ma qui è unica: A C J(n):B J(5):D J(4):E J(3):F °c : 1 18 4 16 13 9 S°c = 61 Sequenza ottima: A C F E D B Min Lm = 3 Min Sc => L£ 4 Sc = 61
Sequenza ottima: C F E D B A c(EDD => min Sc) : 18 17 8 15 12 5 Sc(EDD=>minSc)=75 EDD: F C E D B A Min Sc Lm= 2 Lavori: A B C D E F Tempi p : 1 2 3 3 4 5 Cons. d : 18 15 11 13 11 7 Lm £ 2 t 18 17 15 12 8 3 Lavori: A B C D E F L18 : 0(EDD!) 3 7 5 7 11 L17 : * 2(EDD!) 6 4 6 10 L15 : * * 4 2(EDD!) 4 8 L12 : * * 1 * 1(EDD!) 5 L8 : * * -3 * * 1(NO EDD!) L3 : * * -8 * * * J(n):A J(5):B J(4):D J(3):E J(2):F J(1):C °c : 18 17 3 15 12 8 S°c = 73 <75! Min Lm = 2 Sc = 73 Sequenza ottima: C F E D B A Non è una sequenza EDD, ma ha la stessa Lm!
non c’è efficienza* non c’è sequenza* SPT° Lm Efficienza rispetto S c ed Lm per l’esempio sviluppato Esistono due SPT°, entrambe con Lm=11, mentre min Sc con Lm=2 non è una EDD Sc = 75 EDD => min Sc S°c = 73 non c’è efficienza* S°c = 61 S°c = 54 S°c = 51 SPT° S°c= 50 non c’è sequenza* Lm 11 2 3 5 7 Quanto sopra conferma che, mentre il punto di efficienza con la Lm più a destra è senz’altro relativo a una SPT, quello più a sinistra ha la Lm di una EDD, ma può non essere relativo a una EDD.