A efectuat :
Studentul grupei AI-082
A verificat :
Rusnac Denis
Nastas Valentina
Chisinau 2009
APROB
0
eful catedrei
Informatica aplicat
_________dr.,conf.univ.V.Moraru
Sarcina
Pentru lucrarea de curs la disciplina Structuri de date i algoritmi
Tema:
Metoda drumului critic.
Scopul lucrarii:
Studierea i aplicarea algoritmului Ford pentru determinarea drumului critic ntr-un graf
orientat.
Sarcina:
Elaborarea programului care determina drumul critic, n limbajul de programare C.
13 aprilie 2009
19 iunie 2009
Valentina Nastas
Executtorul lucrrii
Rusnac Denis
1.Scurt istoric
Critical Path Method este procedeul fundamental al "analizei drumului critic" .
In anul 1956 firma E. I. Du Pont de Nemours a creat un grup de studii, format din
matematicieni i analiti care aveau la dispozitie un calculator UNIVAC I. In 1957 la
UNIVAC Application Research Center, sub conducerea lui 1. W. Mauchly, s-a pus la punct
procedeul CPM de catre J. E. Kelley (de la Remington Rand) i W. Walker (de la Du
Pont). Procedeul a fost aplicat de firma Du Pont la revizia uzinei din Louisville i a avut ca
rezultat reducerea duratei lucrarilor de la 125 ore la 93 ore, i apoi la 78 ore.
In 1958 J. W. Mauchly Intemeiaza firma de consultare Mauchly Associates, care a avut un
rol important in dezvoltarea i difuzarea analizei drumului critic. Succesele obtinute cu
ajutorul CPM ncep sa intereseze un cerc larg de cercetatori i utilizatori (universiti,
firme de consultare, intreprinderi) i metoda cunoate o popularitate fr precedent.
In 1961 apare studiul lui Kelley "Critical - Path Scheduling: Mathematical
Basis", in care CPM este prezentat Intr-o forma desavarit [9].
Procedeul CPM este o metoda folosita cu precdere de tarile anglo-saxone, cunoscuta i ca
metoda "sagitala", fiind una dintre cele mai simple procedee de analiza a drumului critic,
constituind procedeul fundamental al ADC.
CPM este considerat procedeul fundamental al ADC, deoarece procedeele mai
perfectionate nu au facut altceva dect sa adnceasca i sa extinda notiunile sale de
baza,fr sa le anuleze sau sa le infirme.
Procesul de conducere a unui proiect prin CPM ia in analiza parametrul timp, in care
fiecare activitate are o durata constanta, corespunzatoare conditiilor normale de lucru,
obtinandu-se programe de termene i durata totala de executie.
Prin faptul ca procedeul CPM ia pentru analiza proiectelor numai
parametrul timp, acesta se incadreaza in procedeele ADC/TIME.
2. Note teoretice
a) Activitatile sunt actiuni sau conditii care contribuie la realizarea unui proiect.
Principala caracteristica graficii a activitatilor este prezentarea lor sub forma de arce sau
sageti orientate in sensul desfurarii procesului tehnologic.
Fiecare activitate Aij - este definita i delimitata de durata dij
c) Drumul in graficul retea CPM este 0 succesiune de arce orientate i noduri, intre nodul
initial i nodul final. Drumul in CPM poate s fie definit ca o succesiune de activitati
parcurse in sensul sageilor,n care evenimentul final al fiecarei activitati coincide cu
evenimentul iniial al activitatii urmatoare.
Drumurile retelelor CPM pot sa fie definite astfel :
~drum complet - este considerat drumul parcurs ntre nodul iniial i nodul final al
retelei. In graficele retea CPM pot sa existe unul sau mai multe drumuri complete;
~ drum incomplet - este drumul parcurs tntre diferite secvene ale retelei. In retelele CPM
distingem urmatoarele tipuri de drumuri incomplete:
drumul care precede nodul "i" este drumul incomplet care incepe in nodul initial i
care se termina in nodul "i".
drumul care succede nodul "i" se considera drumul incomplet care incepe in nodul
"i" i se termina in nodul final "n".
drum intermediar este drumul incomplet ce se parcurge ntre dou noduri oarecare
ale reelei,spre exemplu ntre nodul i i nodul p.
Un drum poate sa fie identificat atat prin nodurile sau evenimentele sale,ct i prin
activitatile componente plasate pe traiectoria sa, dar toate drumurile sunt delimitate prin
lungimea lor.
3
d) Lungimea unui drum in graficul retea CPM este egala cu suma duratelor activitalilor
ce se situeaza pe drumul considerat.
Intr-o retea CPM exista mai multe drumuri complete, cu lungimi diferite:
e) Drumul critic in relelele CPM este drumul complet cu lungimea maxima, care pune in
evidenta durata totala minima posibila de realizare a intregului proiect.
g) Numerotarea nodurilor unei retele CPM este necesara pentru identificarea
evenimentelor ce delimiteaza activitalile proiectului. Fiecare nod este purtatorul unui
numar distinct, corespunzator unui sistem de numerotare adoptat:
~ numerotare secventiala continua, cand nodurile se numeroteaza in
ordinea crescatoare i imediat urmatoarea numerelor naturale:
0,1,2.....11,12,13.....23,24...........
~numerotare secventiala cu lacune, cand nodurile se numeroteaza in
ordinea crescatoare a numerelor naturalc, dar nu imediat urmatoare:
0,1,5.....11,15,27,.....35,45.........
~numerotare arbitrara, cand nodurile se numeroteaza aleator indiferent de ordine:
0,1,5,3,.....11,9,18,.....27,23, ......
La efectuare lucrrii de curs am folosit algoritmul lui Ford pentru determinare drumului
critic,cu putine modificri.
Algoritmul lui Ford pentru detrminarea drumului critic
Permite determinarea drumului critic care ncepe cu un vrf iniial xi pn la oricare vrf al
grafului G. Dac prin Lij se va nota ponderea arcului (xi, xj) atunci algoritmul conine
urmtorii pai:
1. Fiecrui vrf xj al grafului G se va ataa un numr foarte mare Hj(). Vrfului iniial i
se va ataa Ho = 0;
2. Se vor calcula diferenele Hj - Hi pentru fiecare arc (xi, xj). Sunt posibile trei cazuri:
a) Hj - Hi < Lij,
b) Hj - Hi = Lij,
c) Hj - Hi > Lij.
Cazul "c" permite micorarea distanei dintre vrful iniial i xj din care cauz se va
realiza Hj = Hi + Lij.
Pasul 2 se va repeta atta timp ct vor mai exista arce pentru care are loc inegalitatea
c. La terminare, etichetele Hi vor defini distana de la vrful iniial pn la vrful dat
xi.
3. Acest pas presupune stabilirea secvenei de vrfuri care va forma drumul critic. Se va
pleca de la vrful final xj spre cel iniial. Predecesorul lui xj va fi considerat vrful xi
pentru care va avea loc Hj - Hi = Lij. Dac vor exista cteva arce pentru care are loc
aceast relaie se va alege la opiune.
void Matr();
Start
k=1
int y=2,x=1;
Prezentarea
n
temei
k!
=0
i=1..n
Meniu
a[i][j]
k
return
k=1
Matr();
k=2
DC();
Stop
void DC();
H[0]=0;
i=1..n
H[i]=d;
i=0..n1
r=0
r=1
j=n1..0
(j!=n-1)&&
(a[j][n-1]!
=0)
j=1..n
(a[i][j]!
=0)
H[j]H[i]>a[i]
[j]H
H[n-1]H[j]=
=a[j][n-1]
dr[i]=j+1;i++;
n=j+1;
if(n>0) r=0;
H[j]=H[i]+a[i][j];
j=i-1..0
dr[j
]
i=0..n
j>0
H[i]
dr[0]=n;i=1;
->
return
H[n-1]
LISTING-UL PROGRAMULUI:
//
Lucrare de curs.
//
Tema:METODA DRUMULUI CRITIC
//
CRITICAL PATH METHOD
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<values.h>
#define d 10000;
int n,k,j,i,u,a[20][20],H[20],dr[10];
//------------------------------------------------------------------/* Matricea de incidenta si ponderile*/
void Matr()
{clrscr();
int y=2,x=1;
printf("Introduceti numarul de evenimente:");scanf("%d",&n);
clrscr();
printf("Introduceti matricea de incidenta si lungimea activitatilor: ");
for(i=0;i<n;i++)
{
y=y+1;
for(j=0;j<n;j++)
{
gotoxy(x,y);
scanf("%d",&a[i][j]);
x=x+3;
}
x=1;
}
}
//------------------------------------------------------------------/* Algoritmul aflarii drumului critic */
void DC()
{clrscr();
H[0]=0;
for(i=1;i<n;i++)
H[i]=d;
for(i=0;i<n-1;i++)
for(j=1;j<n;j++)
if(a[i][j]!=0)
{if(H[j]-H[i]>a[i][j])H[j]=H[i]+a[i][j];}
dr[0]=n;i=1;
printf("\nDrumul critic este:%d\n",H[n-1]);
//-------------------------------------------------------------------/* Afisarea succesiunii evenimentelor */
printf("Succesiunea evenimentelor este:\n");
int r=0;
while(r==0){ r=1;
for(j=n-1;j>=0;j--)
if((j!=n-1)&&(a[j][n-1]!=0))
if(H[n-1]-H[j]==a[j][n-1])
7
{dr[i]=j+1;i++;
n=j+1;
if(n>0) r=0; }}
for(j=i-1;j>=0;j--)
{printf("X[%d]",dr[j]);
if(j>0)printf("->");}
getch();
}
void main()
{int k=1;
//------------------------------------------------------------------/* Prezentarea temei */
clrscr();
printf("\n\n\n\n\t");
textcolor(3); cprintf("Lucrare de curs la disciplina Structuri de Date si Algoritmi.");
printf("\r\n\n\t\t\t");
cprintf("Drum critic.");
textcolor(15);
getch();
textcolor(10);
//------------------------------------------------------------------/* Meniul principal */
while(k!=0)
{
clrscr();
printf("\n\
\n\
[ MENIU ]
\n\
\n\
[1] - Introducerea grafului: ( MatIn ).
\n\
\n\
[2] - Aflarea drumului critic.
\n\
\n\
[0] - Iesirea.
\n\
\n");
scanf("%d",&k);
switch(k)
{
case 1:Matr(); break;
case 2:DC(); break;
case 0:;
}
}
}
Testarea: