COORDINAMENTO E GESTIONE DI PROGETTI COMPLESSI 1. - Formulazione del problema Supponiamo di dover organizzare e gestire un progetto complesso, quale puó essere la costruzione di un edificio, oppure la progettazione, produzione e lancio sul mercato di un nuovo prodotto, la realizzazione di un nuovo servizio, di un nuovo farmaco o di una nuova arma. La realizzazione del progetto puó essere scomposta nella esecuzione di un numero finito di attivitá relativamente indipendenti, nel senso che la responsabilitá della loro esecuzione puó essere affidata ad una unitá decisionale autonoma all interno dell organizzazione, o addirittura data in subappalto ad un impresa esterna all organizzazione, e l esecuzione stessa viene affidata a maestranze specializzate in quella particolare attivitá. Tra le diverse attivitá esistono delle relazioni di precedenza, nel senso che una qualunque di esse puó iniziare solo dopo che sono state terminate altre attivitá che la precedono. Ad esempio, se vogliamo costruire un edificio, non possiamo realizzare l impianto elettrico se non sono state scavate le fondamenta, non é stato realizzato il rustico, non sono stati costruiti i muri divisori interni, ecc. Inoltre supponiamo che di ogni attivitá si possa conoscere o si possa stimare la durata, cioé il tempo necessario per la sua esecuzione. Se il progetto é stato sufficientemente sperimentato in passato, la durata delle attivitá puó essere conosciuta con sufficiente attendibilitá, al punto da essere considerata certa. Se invece il progetto viene sperimentato per la prima volta o é stato sperimentato poche volte, allora la durata delle attivitá é una variabile aleatoria di cui si puó solo immaginare una distribuzione di probabilitá. Consideriamo dapprima il caso in cui tali tempi sono certi; vedremo piú avanti come trattare il caso in cui le durate sono aleatorie. Ci si pone allora i seguenti problemi. (1 Organizzare e coordinare le diverse attivitá in modo che, (nel rispetto dei vincoli di precedenza tra le diverse attivitá e dei vincoli sulla loro durata, l intero progetto venga completato nel minimo tempo possibile. (2 Schedulare le attivitá del progetto, cioé determinare per ogni attivitá il minimo inizio, (cioé l istante prima del quale l attivitá non puó iniziare senza violare qualche vincolo di precedenza o qualche vincolo sulla durata delle attivitá precedenti, e il massimo inizio, cioé l istante dopo il quale l attivitá non puó iniziare se vogliamo che il progetto si concluda nel tempo minimo. (3 Individuare i colli di bottiglia, cioé le attivitá in cui il minimo ritardo comporta un ritardo a cascata in tutte le attivitá successive, e quindi un ritardo nella conclusione del progetto. Queste attivitá sono dette le attivitá critiche del progetto; le altre attivitá sono invece dette non critiche, poiché, entro certi margini, un ritardo nella loro conclusione non comporta un ritardo nella conclusione del progetto. Evidentemente, conoscere le attivitá critiche e non critiche é estremamente importante, perché é possibile eventualmente distogliere risorse (umane, di capitali, macchine, ecc. dalle attivitá non critiche alle attivitá critiche, in modo da essere sicuri che non si verifichino ritardi nelle attivitá critiche. (4 Individuare un cammino critico, cioé una sequenza ordinata di attivitá critiche consecutive, ciascuna delle quali inizia non appena é terminata quella precedente, sicché la somma delle loro durate rappresenta la durata minima dell intero progetto. Per affrontare i suddetti problemi si utilizza una metodologia detta CPM, (che é un acronimo per Critical Path Method, consistente nel rappresentare il progetto come un grafo. Solitamente le attivitá rappresentano gli archi del grafo, le durate delle attivitá sono le lunghezze degli archi, e i nodi sono gli istanti in cui sono terminate tutte le attivitá precedenti e possono iniziare quelle successive. Negli ultimi anni ha preso piede un approccio alternativo, in cui le attivitá sono rappresentate dai nodi del grafo, le durate delle attivitá sono i pesi dei nodi e gli archi sono le relazioni di precedenza tra le attivitá. Seguiremo questo secondo approccio detto AON, (Activities On Nodes, piuttosto che il tradizionale approccio AOA, (Activities On Arcs. 1
2 n. 2. - Il Critical Path Method Consideriamo dunque un progetto complesso e alle attivitá proprie del progetto aggiungiamo due attivitá fittizie, che diremo inizio del progetto e conclusione del progetto; alle relazioni di precedenza tra le attivitá effettive del progetto, aggiungiamo le relazioni: - l inizio del progetto precede tutte le attivitá senza predecessori, - la conclusione del progetto segue tutte le attivitá senza successori. Siano dunque a 0, a 1, a 2,..., a n le attivitá del progetto e supponiamo di averle numerate in modo che - a 0 é l attivitá fittizia inizio del progetto, a n é l attivitá fittizia conclusione del progetto, - se l attivitá a i precede l attivitá a j, allora risulta i < j. Consideriamo il grafo G = (N, A, dove l insieme dei nodi é N = {a 0, a 1, a 2,..., a n } e l insieme degli archi é A = {(a i, a j N N a i precede a j }. Per ogni i = 1, 2,... n 1 sia T (i la durata dell attivitá a i ; l attivitá fittizie a 0 ed a n avranno ovviamente durata 0, e dunque T (0 = T (n = 0. Evidentemente G é un grafo orientato pesato, con pesi sui nodi; il grafo é senza cicli, ed in esso a 0 é l unica sorgente ed a n é l unica destinazione. Per ogni i = 0, 1, 2,..., n poniamo: F B(i = minimo inizio dell attivitá a i, F E(i = minima fine dell attivitá a i, LB(i = massimo inizio dell attivitá a i senza pregiudicare la conclusione del progetto nel tempo minimo, LE(i = massima fine dell attivitá a i senza pregiudicare la conclusione del progetto nel tempo minimo. La durata minima del progetto é dunque F E(n e ad essa si giunge facilmente attraverso un procedimento ricorsivo. Infatti, dal momento che nessuna attivitá puó iniziare prima che siano terminate tutte le attivitá precedenti, per ogni j = 1, 2,... n deve aversi (1 F B(j = max{f E(i : a i precede a j }, F E(j = F B(j + T (j. Ebbene, avendo supposto che i < j se a i precede a j, é evidente che ponendo F B(0 = LE(0 = 0 ed applicando la (1 in maniera ricorsiva si ricavano nell ordine: F B(1 ed F E(1, F B(2 ed F E(2,......, F B(n = F E(n = durata minima del progetto. D altra parte, nessuna attivitá puó finire dopo l inizio di quelle successive; perció, se vogliamo che la conclusione del progetto non venga ritardata, allora, per ogni i = 0, 1, 2,... n 1, deve aversi (2 LE(i = min{lb(j : a i precede a j }, LB(i = LE(i T (i. Ebbene, se vogliamo che il progetto non sia ritardato, occorre che sia LB(n = LE(n = F B(n = F E(n; di qui, applicando la (2 in maniera ricorsiva retrograda, si calcolano LE(n 1 ed LB(n 1, LE(n 2 ed LB(n 2,...... LE(0 ed LB(0. A questo punto, si puó calcolare, per ogni i = 0, 1,... n, lo scorrimento dell attivitá a i : SCORR(i = LB(i F B(i = LE(i LB(i, cioé il massimo ritardo che si puó avere nell inizio dell attivitá a i senza che la conclusione del progetto venga ritardata. Le attivitá che hanno uno scorrimento nullo sono attivitá critiche, perché devono necessariamente iniziare nell istante F B(i, altrimenti il progetto verrebbe ritardato. Le attivitá che hanno uno scorrimento maggiore di 0 sono non critiche, perché potrebbero iniziare in un qualunque istante compreso tra F B(i e LB(i senza che l intero progetto venga ritardato.
Per trovare un cammino critico, cioé una sequenza ordinata di attivitá critiche consecutive, ciascuna delle quali inizia non appena é terminata quella precedente, per ogni j = 1, 2,..., n sia h j l indice di un attivitá immediatamente precedente l attivitá a j, cioé tale che 3 F E(h j = max{f E(i : a i precede a j } = F B(j. Ebbene, se l attivitá a j é critica, anche l attivitá a hj é critica. Infatti, in caso contrario, si avrebbe LB(h j > F B(h j e quindi LE(h j > F E(h j = F B(j; ne seguirebbe che l attivitá a j potrebbe iniziare all istante LE(h j > F B(j senza ritardare la conclusione del progetto, e quindi sarebbe non critica. Pertanto se, nella fase in cui si calcola iterativamente il minimo inizio e la minima fine di ogni attivitá, si memorizza anche in un vettore P RED l attivitá a hj che precede la generica attivitá a j, allora da tale vettore potremo alla fine ricavare il cammino critico. Infatti, ovviamente l attivitá a n é un attivitá critica, e quindi é l ultima attivitá del cammino critico; ne segue che P RED(n sará la penultima attivitá del cammino critico, e il suo predecessore sará la terzultima attivitá del cammino critico, e cosí via fino a giungere all attivitá a 0 che sará la prima attivitá del cammino critico. Possiamo formalizzare quanto detto sotto forma di algoritmo: Algoritmo CPM (0 (Inizializzazione - Si memorizzano le attivitá a 0, a 1,..., a n ordinate in modo che i < j se a i precede a j. Si memorizzano le relazioni di precedenza mediante la matrice P tale che : { 1 se ai precede a j P (i, j = 0 altrimenti per ogni i, j. Si memorizzano le durate delle attivitá attraverso un vettore T IME tale che T IME(i = durata dell attivitá a i per ogni i = 0, 1,..., n. Si pone F B(i = 0, F E(i = 0, P RED(i = 0 per ogni i = 0, 1,..., n. (1 (Fase dell avanzamento - Si pone j = 0 e si esegue il ciclo: finché j < n si pone j = j + 1 e si esegue il ciclo: per i = 0, 1,..., j 1 si esegue: se P (i, j = 1 ed F E(i > F B(j, allora si pone F B(j = F E(i, P RED(j = i; alla fine del ciclo si pone F E(j = F B(j + T IME(j. (2 (Fase dell arretramento - Si pone LB(n = F B(n, LE(n == F E(n, SCORR(n = 0, i = n e si esegue il ciclo: finché i > 0 si pone i = i 1 e si esegue il ciclo: per j = i + 1, i + 2,..., n si esegue: se P (i, j = 1 ed LB(j < LE(i, allora si pone LE(i = LB(j; alla fine del ciclo si pone LB(i = LE(i T IME(i, SCORR(i = LB(i F B(i. (3 (Ricerca del cammino critico - Per ogni i = 0, 1, 2,..., n si pone LABEL(i = 0. Si pone LAST = n, LABEL(LAST = 1 e si esegue il ciclo: finché LAST 0 si pone LAST = P RED(LAST, LABEL(LAST = 1. Alla fine dell esecuzione dell algoritmo, tutti i dati raccolti possono essere organizzati in una tabella; la prima colonna contiene le diverse attivitá, le altre colonne sono nell ordine i vettori T IM E, F B, F E, P RED, LB, LE, SCORR, LABEL.
4 Da essa si ricava per ogni attivitá a i : (1 il minimo inizio e la minima fine; (2 massimo inizio e la massima fine compatibile con la conclusione del progetto in tempo minimo, (3 se l attivitá é critica o meno, (a seconda che risulti SCORR(i = 0 oppure SCORR(i > 0, (4 se fa parte del cammino critico o meno, (a seconda che risulti LABEL(i = 1 oppure LABEL(i = 0. Se il precedente algoritmo viene modificato ponendo F B(0 = F E(0 = data (o istante di inizio effettivo del progetto, (invece che F B(0 = F E(0 = 0, allora l algoritmo fornirá di ogni attivitá a i le date (o gli istanti F B(i e F E(i prima del quale l attivitá non puó iniziare e finire, e le date (o gli istanti LB(i e LE(i entro cui l attivitá deve iniziare e terminare, altrimenti l intero progetto verrebbe ritardato. In questo caso la durata minima del progetto sará data da F B(n F B(0. Questi dati possono anche essere rappresentati graficamente mediante i cosidetti diagrammi di Gantt. Tali diagrammi si ottengono fissando un riferimento cartesiano su una retta, su cui si rappresenta il tempo. Su tale retta si rappresenta il cammino critico, mediante una sequenza di segmenti adiacenti, aventi per estremi i punti di ascissa uguale all inizio e alla fine di ciascuna attivitá del cammino critico. Tale retta viene replicata piú volte per rappresentarvi le altre attivitá che si svolgono contemporaneamente a quelle del cammino critico. Le attivitá critiche vengono rappresentate da segmenti aventi per estremi i punti di ascissa uguale all inizio e alla fine dell attivitá. Invece un attivitá non critica a i viene rappresentata da un segmento di lunghezza T IME(i che puó scorrere tra i punti di ascissa F B(i e LE(i e questo viene ottenuto segnando con tratto continuo il segmento i cui estremi hanno ascissa F B(i e F E(i e con tratto discontinuo il segmento i cui estremi hanno ascissa F E(i e LE(i. 3. - Il PERT Consideriamo ora il caso in cui il progetto non é sufficientemente sperimentato, sicché non si puó conoscere con sufficiente attendibilitá la durata di ciascuna attivitá; tale durata é pertanto una variabile aleatoria, poiché le cause dei ritardi nella sua esecuzione sono non prevedibili e quindi casuali. In questo caso l incertezza viene controllata nel modo seguente: (1 per ogni attivitá a i si chiede al responsabile di quell attivitá (o a un team di esperti di indicare: un tempo ottimistico T O(i che rappresenta la durata prevista se tutto va per il verso giusto, un tempo pessimistico T P (i che rappresenta la durata prevista se tutto va storto, un tempo piú probabile T M(i che rappresenta la durata giudicata piú probabile; (2 sulla base di questi dati si assume che la durata T (i dell attivitá a i sia una variabile aleatoria il cui valore atteso sia T O(i + T P (i + 4T M(i E(T (i = = 1 ( T O(i + T P (i 6 3 + 2 2 3 T M(i, (il che significa che alla stima del tempo piú probabile si dá peso doppio rispetto alla media aritmetica tra tempo ottimistico e tempo pessimistico, e la cui varianza sia ( T P (i T O(i 2. σ 2 (T (i = 6 Si calcola dunque il valore atteso e la varianza delle durate di tutte le attivitá del progetto, dopo di che ci si comporta come se, per ogni attivitá a i, la durata attesa dell attivitá a i fosse una durata certa. Di conseguenza, con il procedimento descritto nell algoritmo CPM, si calcolano, di ogni attivitá a i, - il minimo inizio atteso F B(i e la minima fine attesa F E(i, - il massimo inizio atteso LB(i e la massima fine attesa LE(i compatibilmente con la conclusione del progetto in tempo minimo, - lo scorrimento atteso SCORR(i = LE(i F E(i.
5 Si trovano cosí le attivitá che molto probabilmente saranno attivitá critiche o non critiche e dunque le attivitá a i1, a i2,..., a ik che molto probabilmente faranno parte del cammino critico. Ció fatto, si osserva che il progetto sará terminato solo quando sono state completate tutte le attivitá del cammino critico; ne segue che la variabile aleatoria T = durata minima del progetto sará data da T = T (i 1 + T (i 2 +... + T (i k = somma delle durate delle attivitá critiche. A questo punto si suppone che le durate delle varie attivitá siano variabili aleatorie statisticamente indipendenti, cioé si suppone che le cause di possibili ritardi nella conclusione di un attivitá siano indipendenti da quelle che possono ritardare la conclusione delle altre attivitá. Se ne deduce che il valore atteso e la varianza della variabile aleatoria T coincide con la somma dei valori attesi e delle varianze delle durate delle attivitá del cammino critico: E(T = E(T (i 1 + E(T (i 2 +... + E(T (i k, σ 2 (T = σ 2 (T (i 1 + σ 2 (T (i 2 +... + σ 2 (T (i k. Si ottiene cosí il valore atteso e la varianza della variabile aleatoria T =durata minima del progetto. Infine si fa ricorso al teorema del limite centrale per approssimare la variabile aleatoria T = T (i 1 + T (i 2 +... + T (i k con una variabile aleatoria con distribuzione normale. Naturalmente l errore dell approssimazione é tanto piú piccolo quanto piú grande é il numero k degli addendi, e quindi quanto piú grande é il numero totale n delle attivitá del progetto, cioé quanto piú complesso é il progetto. La conclusione é dunque che la durata del progetto é approssimativamente la variabile aleatoria con distribuzione normale, di valore atteso E(T e varianza σ 2 (T. Dalle tavole della distribuzione normale standardizzata Z, (cioé con valore atteso 0 e varianza 1, si puó allora ottenere una stima della probabilitá che il progetto sia concluso entro un tempo τ > 0: ( T E(T P (T τ = P τ E(T ( = P Z τ E(T, o nell intervallo temporale [τ 1, τ 2 ]: ( τ1 E(T P (τ 1 T τ 2 = P T E(T τ 2 E(T ( τ1 E(T = P Z τ 2 E(T. Naturalmente se il cammino critico non é unico, allora la lunghezza attesa dei cammini critici é la stessa, perché coincide in ogni caso con F B(n = F E(n. Peró, due diversi cammini critici possono avere diversa varianza; in tal caso, (per motivi di prudenza, si deve prendere in considerazione il cammino critico che presenta la massima varianza complessiva, cioé la massima incertezza.