Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Informatic
LUCRARE DE LICEN
Coordonator tiinific
Lect. Univ. Dr. Radu Boriga
Absolvent:
Popescu Marian Alexandru Mihai
Bucureti, 2013
CUPRINS
Introducere..................................................................................................................................3
Capitolul 1: Algoritmi Greedy....................................................................................................4
1.1 Noiuni introductive.......................................................................4
1.2 Clase de metode de optimizare....................................................6
1.3 Algoritmi iterativi i convergen................................................6
1.4 Clasificarea metodelor de optimizare.........................................7
Capitolul 2: Tehnica Divide et Impera........................................................................................8
Algoritmi de programare dinamic.................................................................11
2.1 Cautare binara...............................................................................11
2.2 Branch & Bound............................................................................14
2.3 Arborii binari de cutare tip data..............................................16
2.4 Arborele optim..............................................................................16
Capitolul 3: ALGORITMI DE PROGRAMARE DINAMICE................................................18
3.1 Trei Principii fundamentale ale Programrii Dinamice...........18
3.2 Programarea dinamic comparat cu tehnica GREEDY..........20
Capitolul 4: Planificarea proceselor..........................................................................................21
4.1 Planificarea proceselor................................................................21
4.2 Criteriile planificrii......................................................................21
4.3 Problemele planificatorului.........................................................21
4.4 Strategiile planificatorului..........................................................21
4.5 First Come First Served Scheduling.........................................22
4.6 Round Robin Scheduling..............................................................25
4.7 Round Robin..................................................................................26
4.8 Alegerea cuantei...........................................................................27
4.9 Priority scheduling.......................................................................27
4.10 Gruparea prioritilor................................................................31
Capitolul 5: Problema optimizare.............................................................................................35
5.1 Modelul problemei de planificare..............................................35
5.2 Descrierea matematic a problemei.........................................38
5.3 Metode clasice de rezolvare.......................................................40
Aplicatie....................................................................................................................................47
Concluzii...................................................................................................................................53
Bibliografie...............................................................................................................................54
Introducere
Un proces reprezinta un set de activitati din program, care nu se pot suprapune (se
executa secvential). Un proces este determinat de o secventa de instructiuni (o procedura) din
programul care se executa. Termenul de proces este folosit pentru a desemna obiectul
activitatii procesorului, in timpul executiei unui program.
Algoritmii de planificare a executiei proceselor sunt impartiti, in principiu, in doua
mari clase: nonpreemptivi si preemptivi.
Algoritmii nonpreemptivi sunt proiectati ca, atunci cand un proces intra in executie, sa
fie rulat pana cand a fost epuizat timpul sau de executie. Algoritmii preemptivi se conduc
dupa notiunea de prioritate; procesul cu prioritatea cea mai mare trebuie sa fie cel care
foloseste procesorul
Programarea dinamic este o metod de elaborare a algoritmilor care se aplic n
general problemelor pentru care se cere determinarea unui optim n urma adoptrii unor
decizii.
Nu exist un criteriu pe baza cruia s identificm cu siguran o problema pentru
rezolvarea creia trebuie s utilizm metoda programrii dinamice, dar putem formula doua
proprieti care sugereaz o soluie prin programare dinamica.
n aceast lucrare ncerc s prezint cteva din metodele generale de elaborare a
algoritmilor de programare a activitatilor.
Este de inteles acum de ce un astfel de algoritm se numeste lacom (am putea sa-i
spunem si nechibzuit). La fiecare pas, procedura alege cel mai bun candidat la momentul
respectiv, fara sa-i pese de viitor si fara sa se razgandeasca. Daca un candidat este inclus in
solutie, el ramane acolo; daca un candidat este exclus din solutie, el nu va mai fi niciodata
reconsiderat. Asemenea unui intreprinzator rudimentar care urmareste castigul imediat in
dauna celui de perspectiva, un algoritm greedy actioneaza simplist. Totusi, ca si in afaceri, o
astfel de metoda poate da rezultate foarte bune tocmai datorita simplitatii ei. Functia select
este de obicei derivata din functia obiectiv; uneori aceste doua functii sunt chiar identice. Un
exemplu simplu de algoritm greedy este algoritmul folosit pentru rezolvarea urmatoarei
probleme. Sa presupunem ca dorim sa dam restul unui client, folosind un numar cat mai mic
de monezi. In acest caz, elementele problemei sunt:
functia de selectie: se alege cea mai mare moneda din multimea de candidati
ramasa
i studiaz rata de convergen a irului ctre soluia optim. Este esenial cnd se recomand
un algoritm s se menioneze i o estimare a timpului necesar pentru obinerea soluiei. [3]
Metoda
Programare liniar
Determinarea
drumului
Funcie obiectiv
Liniar
minim Liniar
(Dijkstra)
Minimum spanning tree
Algoritmul Ford/Fulkerson
PERT i gestionea resurselor
Branch and Bound
Algoritmul Balas (cu valiabile binare)
Algoritmi genetici
Algoritmul Hooke i Jeeves
Metoda Lagrange
Metode GRG
Programare quadric
Programare liniar secvenial
Programare quadric secvenial
Restricii
Liniare
Liniare
Liniar
Liniar
Liniare
Liniare
Liniar
Liniare
Neliniar
Neliniar
Neliniar
Quadric
Neliniar
Neliniar
Fr restricii
Egaliti neliniare
Neliniare
Liniare
Liniare
Termenul 3/4cn2 domin pe ceilali cnd n este suficient de mare, ceea ce nseamn
ca algoritmul B este n esen cu 25% mai rapid dect algoritmul A. Nu am reuit ns s
schimbm ordinul timpului, care rmne ptratic. Putem s continum n mod recursiv acest
procedeu, mprind subcazurile n subsubcazuri etc. Pentru subcazurile care nu sunt mai mari
dect un anumit prag n0, vom folosi tot algoritmul A. Obinem astfel algoritmul C, cu timpul.
Empiric, gsim n0 67, adic valoarea pentru care nu mai are important dac
aplicm algoritmul A n mod direct, sau dac continuam descompunerea. Cu alte cuvinte,
atta timp ct subcazurile sunt mai mari dect n0, este bine s continum descompunerea.
Dac continum ns descompunerea pentru subcazurile mai mici dect n0, eficienta
algoritmului scade.
Observm ca metoda divide et impera este prin definiie recursiv. Uneori este
posibil s eliminam recursivitatea printr-un ciclu iterativ. Implementata pe o maina
convenionala, versiunea iterativa poate fi ceva mai rapida (n limitele unei constante
multiplicative). Un alt avantaj al versiunii iterative ar fi faptul c economisete spaiul de
memorie. Versiunea recursiv folosete o stiva necesar memorrii apelurilor recursive.
Pentru un caz de mrime n, numrul apelurilor recursive este de multe ori n .(log n), uneori
chiar n .(n).
Fie G=<V,M> un graf orientat, unde V este mulimea vrfurilor i M este mulimea
muchiilor. Fiecrei muchii i se asociaz o lungime negativ. Dorim s calculm lungimea
celui mai scurt drum ntre fiecare pereche de vrfuri.
Vom presupune c vrfurile sunt numerotate de la 1 la n, i c matricea L d
lungimea fiecrei muchii: L[i,i]=0, L[i,j]0 pentru ij, L[i,j]=+ dac muchia (i,j) nu exist.
Principiul optimalitii este valabil: dac cel mai scurt drum de la i la j trece prin
vrful k, atunci poriunea de drum de la i la k ct i cea de la k la j, trebuie s fie, de asemenea
optime.
Construim o matrice D care s conin lungimea celui mai scurt drum ntre fiecare
pereche de vrfuri. Algoritmul de programare dinamic iniializeaz pe D cu L, apoi
efectueaz n iteraii. Dup iteraia k, D va conine lungimile celor mai scurte drumuri care
folosesc ca vrfuri intermediare doar vrfurile din {1,2,,k}. Dup n iteraii, obine rezultatul
final. La iteraia k, algoritmul trebuie s verifice pentru fiecare pereche de vrfuri (i,j) dac
exist sau nu un drum, trecnd prin vrful k, care este mai bun dect actualul drum optim ce
trece doar prin vrfurile din {1,2,,k-1}. Fie Dk matricea D dup iteraia k.
Verificarea necesar este atunci:
Dk[i,j]=min(dk-1[i,j], Dk-1[i,k]+Dk-1[k,j])
unde am fcut uz de principiul optimalitii pentru a calcula lungimea celui mai scurt drum
via k. implicit, am considerat c un drum optim care trece prin k nu poate trece de dou ori
prin k.
Acest algoritm simplu este datorat lui Floyd (1962):
function Floyd(L[1..n, 1..n])
9
0 5
50 0 15 5
D0 L
30 5 0
15 5 0
obtinem succesiv
De obicei dorim s aflm nu numai lungimea celui mai scurt drum, dar i traseul su. n
aceast situaie, vom construi o a doua matrice P, iniializat cu zero. Bucla cea mai interioar
a algoritmului devine
if D[i,k]+D[k,j]<D[i,j] then D[i,j]D[i,k]+D[k,j]
P[i,j]k
10
Cnd algoritmul se oprete, P[i,j] va conine vrful din ultima iteraie care a cauzat o
modificare n D[i,j]. Pentru a afla prin ce vrfuri trece cel mai scurt drum de la i la j,
consultm elementul P[i,j]. Dac P[i,j]=0, atunci cel mai scurt drum este chiar muchia (i,j).
Dac P[i,j]=k, atunci cel mai scurt drum de la i la j trece prin k i urmeaz s consultm
recursiv elementele P[i,k] i P[k,j] pentru a gsi i celelalte vrfuri intermediare.
Algoritmi de programare dinamic
11
while i < j do
{T[i] = x < T[ j+1]}
k . (i+j) div 2
case x < T[k]: j k-1
x = T[k+1]: i k+1
otherwise: i, j k
return i
Timpul pentru iterbin1 este n (log n). Algoritmul iterbin2 necesit un timp care
depinde de poziia lui x n T, fiind n (1), (log n), (log n) pentru cazurile cel mai favorabil,
mediu i respectiv, cel mai nefavorabil.
Care din aceti doi algoritmi este oare mai eficient? Pentru cazul cel mai favorabil,
iterbin2 este, evident, mai bun. Pentru cazul cel mai nefavorabil, ordinul timpului este acelai,
numrul de executri ale buclei while este acelai, dar durata unei bucle while pentru iterbin2
este ceva mai mare; deci iterbin1 este preferabil, avnd constanta multiplicativ mai mic.
Pentru cazul mediu, compararea celor doi algoritmi este mai dificil: ordinul timpului este
acelai, o bucla while n iterbin1 dureaz n medie mai puin dect n iterbin2, n schimb
iterbin1 execut n medie mai multe bucle while dect iterbin2.
Un arbore binr n care fiecare frf conine o valoare numit cheie este un arbore de
cutare, dac cheia fiecrui vrf neterminal este mai mare sau egal cu cheia descendenilor
si stngi i mai mic sau egal cu cheia descendenilor si drepi. Dac cheile arborelui sunt
distincte, aceste inegaliti sunt, n mod evident, stricte.
Figura de mai sus este un exemplu de arbore de cutare *, coninnd cheile A, B, C,
,H. vrfurile pot conine i alte informaii n afar de chei, la care s avem acces prin
intermediul cheilor. Aceast structur de date este util, deoarece permitee o cutare eficient
a valorilor n arbore:
Cu o mulime dat de chei, se pot construi mai muli arbori de cutare(fig. de sus).
Pentru a cuta o cheie X n arborele de cutare, X va fi comparat la nceput cu cheia
rdcinei arborelui. Dac X este mai mic dect cheia rdcinii, atunci se continu cutarea n
subarborele stng. Dac X este egal cu cheia rdcinii, atunci cutarea se incheie cu succes.
Dac X este mai mare dect cheia rdcinii, atunci se cotinu cutarea n subarborele drept.
Se continu astfel recursiv accest proces.
13
cea care permite reducerea ordinului de marime a acestui spatiu. Solutia aceasta este eficienta
doar daca cistigul oferit prin reducerea spatiului de cautare (scazind efortul suplimentar depus
pentru determinarea si eliminarea din mers a continuarilor ineficiente) este substantial.
Solutiile de tip backtracking, avind la baza un schelet atit de general (algoritmul de
traversare a grafului de cautare a solutiilor) sint relativ simplu de adaptat in rezolvarea unor
probleme. Poate acesta este motivul care a condus pe unii programatori lipsiti de experienta la
convingerea falsa ca Orice este posibil de rezolvat prin backtracking.
La ora actuala, lista problemelor pentru care nu se cunosc decit solutii exponentiale, total
nerezonabile ca durata de executie a programului de solutionare, cuprinde citeva sute de
probleme, una mai celebra ca cealalta. Reamintim doar de banala (dar agasanta) Problema a
Orarului unei institutii de invatamint care nu admite o solutie backtracking datorita duratei
astronomice de asteptare a solutiei.
Datorita totalei lor ineficiente in executie, solutiile backtracking obtinute dupa o
analiza si o proiectare la prima mina (brute-force approach, in limba engleza) ajung sa fie
reanalizate din nou cu mai multa atentie. Se constata atunci ca modelul abstract asociat
problemei, fie este prea sarac in informatii pentru determinarea grafului de cautare a solutiilor,
fie conduce la un graf de cautare avind dimensiunea nerezonabila (exponentiala sau factoriala,
fata de dimensiunea n a vectorului de intrare). Singura solutie care ramine in aceasta situatie
la dispozitie este ca aceste solutii sa fie reproiectate prin metoda branch&bound.
Un exemplu usor de inteles de problema branch&bound il ofera Problema Generala
a Labirintului. Spre deosebire de Problema Labirintului prezentata anterior (care admitea o
solutie de tip backtracking), in varianta extinsa a acestei probleme, numarul directiilor
posibile de urmat la fiecare pas poate fi oricit de mare, iar obstacolele pot avea orice forma si
dimensiune. In acest caz, singura posibilitate este construirea din mers a spatiului de cautare
a solutiei. Astfel, pentru determinarea unui drum de iesire din labirint sau a drumului cel mai
scurt (daca este posibila determinarea acestuia in timp rezonabil!) este obligatorie adoptarea
strategiei branch&bound.
Desi aceasta strategie poate sa creasca uneori surprinzator de mult
eficienta algoritmilor de solutionare (din nerezonabili ca timp de executie ei pot ajunge
rezonabili, datorita reducerii dimensiunii exponentiale a spatiului de cautare a solutiei),
aplicarea ei este posibila doar printr-un efort suplimentar in etapa de analiza si in cea de
proiectare a algoritmului. Dezavantajul major al acestei metode consta deci in efortul major
depus in etapa de analiza a problemei (analiza care insa se va face o singura data si bine!) si
efortul suplimentar depus in etapa proiectarii algoritmului de solutionare.
Din experienta practica este cunoscut faptul ca, pentru a analiza o problema dificila un
analist poate avea nevoie de saptamini sau chiar luni de zile de analiza, in timp ce algoritmul
de solutionare proiectat va dura, ca timp de executie, doar citeva zeci de minute. Daca
programul obtinut nu este necesar a fi rulat decit o data, aceasta este prea putin pentru a se
amortiza costul mare al analizei si proiectarii sale. In acea situatie, solutia branch&bound
este nerentabila si, probabil ca ar fi mai ieftina strategia backtracking de solutionare, chiar si
cu riscul de a obtine o executie (singura de altfel) a programului cu durata de o saptamina
(ceea ce poate sa insemne totusi economie de timp).
Modificarea arborelui
16
Modificarea structurii arborelui de cutare, prin inserare sau tergerea unor vrfuri
trebuie realizat astfel nct proprietatea de arbore de cutare s nu se altereze. Cele dou
operaii sunt diferite n privina complexitii. tergerea este mai dificil i mult mai diferit
de operaiile obinuite.
Complexitatea funciei de tergere este tipic pentru structurile de cutare. Aceste structuri
tind s devin att de compacte nct tergerea fiecrei chei necesit reparaii destul de
complicate. De aceea se prefer de cele mai multe ori o tergere lene, prin care vrful este
doar marcat ca fiind ters, tergerea fizic realizndu-se cu ocazia unor reorganizri periodice.
22
}
else
{
jobs++;
ctr++;
idle.add(Boolean.FALSE);
}
23
}
}
finishedTime[z] = ctr;
if(z==0)
idleWT.add(0);
else idleWT.add(ctr);
}
waitingTime[0] = 0;
for(int z = 1;z<numberOfProcess;z++)
{
waitingTime[z] = finishedTime[z] - burstTime[z];
}
System.out.println(""+idleWT.toString());
System.out.println(""+idle.toString());
System.out.println("Jobs: "+jobs);
int ctr2 = 0;
for(int y = 0; y < numberOfProcess; y++)
{
if(idle.elementAt(ctr2)==false)
{ if(ctr2==0)
{System.out.print("|I"+(waitingTime[y+1])+" |"); ctr2++;}
else {
System.out.print("|I "+(idleWT.elementAt(y)-waitingTime[y])+" |");
ctr2++;
}
}
System.out.print("|P"+job[y]+"("+burstTime[y]+")"+" |");
ctr2++;
}
System.out.println("");
for(int x = 0;x<numberOfProcess;x++)
{ if(idleWT.elementAt(x) == 0)
System.out.print(""+waitingTime[x]);
else System.out.print("
"+waitingTime[x]+ "
}
System.out.println("");
"+idleWT.elementAt(x));
}
public void displaySorted()
{
System.out.println("\n------------------------------------");
System.out.println("Process | Arrival Time | CPU Burst ");
for(int y = 0; y < numberOfProcess; y++)
{
System.out.println("P" + job[y] + "\t\t"
+ arrivalTime[y] +"\t
"
+ burstTime[y]);
}
24
System.out.println("------------------------------------\n");
}
}
25
27
int no,n;
main()
{
int i,a,j,k,time=0;
printf("\n \n ---PRIORITY SCHEDULING---\n \n ");
printf("\n \n Enter the number of processes: ");
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
process[i].id = i;
printf("\n\nEnter the arrival time for process %d: ", i);
scanf("%d", &(process[i].arrival));
printf("\n Enter the burst time for process %d: ", i);
scanf("%d", &(process[i].burst));
printf("\n Enter the priority of the process %d:", i);
scanf("%d", & (process[i].pri));
process[i].rem = process[i].burst;
}
for(i = 1; i <= n; i++)
{
for(j = i + 1; j <= n; j++)
{
if(process[i].arrival > process[j].arrival)
{
temp = process[i];
process[i] = process[j];
process[j] = temp;
}
}
}
no = 0;
j = 1;
printf("\n \n Choices:");
printf("\n \n 1.Preemptive Priority Scheduling");
printf("\n \n 2.Non Preemptive Priority Scheduling");
printf("\n \n Enter your choice:");
scanf("%d", &a);
switch(a)
{
case 1:
{
while(chkprocess(n) == 1)
{
if(process[no + 1].arrival == time)
{
no++;
if(process[j].rem==0)
process[j].finish=time;
j = nextprocess();
}
28
if(process[j].rem != 0)
{
process[j].rem--;
for(i = 1; i <= no; i++)
{
if(i != j && process[i].rem !=
0)
process[i].wait++;
}
}
else
{
process[j].finish = time;
j=nextprocess();
time--;
k=j;
}
time++;
}
process[k].finish = time;
}
case 2:
{
process[1].start = process[1].arrival;
while(chkprocess(n) == 1)
{
if(process[no + 1].arrival == time)
no++;
if(process[j].rem != 0)
{
process[j].rem--;
for(i = 1; i <= no; i++)
{
if(i != j && process[i].rem !=
0)
process[i].wait++;
}
}
else
{
process[j].finish = time;
j = nextprocess();
time--;
process[j].start = time + 1;
}
time++;
}
process[j].finish = time;
}
}
display();
}
int chkprocess(int s)
29
int i;
for(i = 1; i <= s; i++)
{
if(process[i].rem != 0)
return 1;
}
return 0;
}
int nextprocess()
{
int min, l, i;
min = 0;
for(i = 1; i <= no; i++)
{
if( process[i].rem!=0 && process[i].pri > min)
{
min = process[i].pri;
l = i;
}
}
return l;
}
void display()
{
int i;
printf("\n\n\t\t\t---PRIORITY SCHEDULING---");
printf("\n\n Process Arrival Burst Priority Starting Waiting Finishing
turnaround Tr/Tb \n");
printf("%5s %9s %7s %15s %10s %8s %9s\n\n", "id", "time", "time", "time",
"time", "time", "time");
printf("%5d %8d %7d %4d %7d %8d %10d %9d %10.1f ", process[i].id,
process[i].arrival,
process[i].burst,
process[i].pri,process[i].start,
process[i].wait,
process[i].finish,
process[i].turnaround,
process[i].ratio);
printf("\n\n");
}
}
Priority inversion
o problem mare la algoritmii bazate pe prioriti este posibilitate
apariiei fenomenului de inversare a prioritilor
dac un proces prioritar ateapt dup un proces mai puin prioritar
(pentru sincronizarea
seciunilor critice), atunci procesele cu prioriti intermediare vor bloca
procesul prioritar astfel devenind aparent mai prioritari
soluia poate fi schimbarea temporare a prioritii procesului la
prioritatea celui care este blocat n ateptarea sincronizrii
Multiple queues
se folosesc clase de prioriti
procesele din clasa cea mai prioritar vor avea o cuant de timp, cele
din urmtoarea clas 2 cuante, urmtoarea 4 cuante, .a.m.d.
dac un proces i-a utilizat toate cuantele dintr-o clas, va fi trecut ntr-o
clas inferioar
de ex. un proces necesit 100 cuante:
ruleaz 1 cuant, ntrerupt, dup care 2, 4, 8, 16, 32, 37 t=> 7 comutri
n loc de 100
un proces lung se va rula din ce n ce mai rar
import java.io.*;
class sjf
{
public static void main (String args[])throws IOException
{
int i,j,temp;
BufferedReader b= new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter no. of processes");
int p=Integer.parseInt(b.readLine());
int burst[]=new int[p];
System.out.println("Enter the burst time for each process");
for(i=0;iburst[j+1])
{
temp=burst[j+1];
burst[j+1]=burst[j];
burst[j]=temp;
}
}
}
int arv[] = new int[p];
System.out.println("Enter arrival time for each process");
for(i=0;i arv[i]=Integer.parseInt(b.readLine());
int wait[] = new int[p];
System.out.println("Wait time for each process :");
System.out.println("Process 0 "+wait[0]+" units");
for(i=1;i {
wait[i]=arv[i-1]+burst[i-1]+wait[i-1]-arv[i];
System.out.println("Process "+i+" "+wait[i]+" units");
}
}
}
Planificare garantat
o abordare diferit de planificare:
se face promisiuni utilizatorului legat de mrimea timpului CPU atribuit
32
Politici i mecanisme
nici unul din algoritmii prezentai nu acceptau informaii de la procesele
utilizator, pe care s le foloseasc n luarea deciziilor
schedulerul nu va lua ntotdeauna decizia cea mai bun
soluia este separarea mecanismului planificrii de politica planificrii
mecanismul este realizat de kernel, dar politica este stabilit de
procesul utilizator
algoritmul de planificare este parametrizat ntr-un anume mod astfel
nct parametrii s pot fi setai de procesele utilizator
kernelul folosete priority scheduling i asigur un apel sistem prin care
un proces poate seta prioritile proceselor fii, astfel procesul printe va
controla planificarea proceselor fii
Two-level scheduling
pn acum am presupus c procesele ready se afl n memorie
dac ns nu dispunem de suficient memorie, unele din procese ready
va trebui plasate pe disc
comutarea proceselor de pe disc va lua un timp mult mai mare dect
celor din memorie
vom utiliza un scheduler cu 2 niveleTwo-level scheduling
iniial o submulime a proceselor ready vor fi ncrcate n memorie
schedulerul va planifica numai aceste procese pentru o perioad de
timp
periodic un scheduler de nivel nalt este utilizat pentru a elimina
procesele din memorie (care sunt de mult timp acolo) i a ncrca procese
noi de pe disc
apoi se folosete schedulerul de nivel jos pentru planificare ntre aceste
procese noiCriteriile folosite de schedulerul de nivel nalt
ct de mult a stat un proces n memorie sau pe disc
ct timp CPU a utilizat procesul
ct de mare este procesul
care este prioritatea procesului
import java.util.LinkedList;
class Test {
public static void main(String args[]) {
33
2. De tip "nceput nceput" Acest tip este frecvent ntlnit i spunem c o activitate A
precede activitatea B printr-o interdependen de tip "nceput nceput" dac
activitatea B nu poate ncepe dect dup un interval de timp tAB de la nceperea
activitii A. Acest interval poate fi chiar mai mare dect durata activitii A, caz n
care avem de fapt o dependen de tipul "terminare nceput", putnd chiar privi
primul tip ca un caz particular al celui de-al doilea.
3. De tip "terminare terminare". Spunem c o activitate A precede activitatea B printr-o
interdependen de tip "terminare terminare" dac activitatea B nu se poate termina
dect dup un interval de timp tAB de la terminarea activitii A sau c activitatea A
trebuie terminat cu cel puin tAB uniti de timp naintea terminrii activitii B.
Prin durat total de execuie a unui proiect nelegem intervalul de timp n care se
efectueaz toate activitile acestuia, respectnd toate interdependenele dintre activiti.
A programa un proiect nseamn a stabili termenele de ncepere pentru fiecare
activitate n parte, innd seama de restriciile impuse de procesul tehnologic, duratele
activitilor i resursele disponibile. Pentru un proiect dat, exist un numr enorm de
programri admisibile. Un interes deosebit prezint programul optim, adic acel program
care, pe de o parte, satisface restriciile impuse iar, pe de alt parte, optimizeaz un anumit
criteriu de eficien economic.
Criteriul de optimizare nu este acelai pentru toate proiectele, el este stabilit pentru
fiecare caz n parte i definete obiectivele majore ale conducerii proiectului. n funcie de
aceste obiective, criteriul poate fi durata total minim, costul total minim, folosirea ct mai
uniform a resurselor sau o sintez a acestora. Deci, programul optim este acea desfurare a
proiectului, precizat prin termenele de ncepere ale activitilor, care conduce la o eficien
maxim. [9]
Problema planificrii implic utilizarea unui graf orientat, aciclic, care s conin o
colecie de activiti i datele referitoare la relaiile lor de preceden. Scopul planificrii
activitilor este de a elimina momentele din proiect fr activiti i de a optimiza organizarea
activitilor, astfel nct relaiile de preceden s se ndeplineasc, iar timpul total de execuie
s fie minim. [10] n general, problema planificrii resurselor este de dou tipuri: static i
dinamic.
n planificarea static, caracteristicile problemei, cum ar fi durata unei activiti,
legturile, precedenele sau sincronizarea sunt cunoscute nainte de a fi executate. Pe de alt
parte, n planificarea dinamic, sunt cunoscute puine activiti i deciziile cu privire la
36
acestea sunt luate pe pacrurs. n continuare este prezentat modelul static de programare a
resurselor. [11]
Analiza resurselor
Dac din punct de vedere al condiionrilor de tip preceden (temporale) existena
activitilor paralele este corect din punct de vedere logic, putnd exista oricte activiti care
se desfoar n acelai timp, dac nu se intercondiioneaz ntre ele, neexistnd nici o
diferen ntre zilele proiectului, din punct de vedere practic, este clar c o zi n care se
desfoar n acelai timp 10 activiti este mult mai intens din punct de vedere al organizrii
i aprovizionrii cu resurse dect o zi n care se desfoar o singur activitate. Deci, dac se
ine cont doar de condiionrile temporale pot aprea dezechilibre foarte mari n desfurarea
proiectului i/sau pot aprea zile n care necesarul de resurse ar fi mai mare dect disponibilul
acestora.
Din cele spuse mai sus, se desprinde faptul c exist cel puin dou probleme
importante legate de resursele unui proiect:
problema alocrii resurselor, n care se ncearc programarea activitilor n aa fel
nct n nici o zi s nu se depeasc disponibilul din nici o resurs;
problema nivelrii resurselor, n care se ncearc programarea activitilor n aa
fel nct n toate zilele s se foloseasc cam aceiai cantitate de resurse (sau, altfel spus, suma
variaiilor de la o zi la alta s fie minim).
Analiza n cele dou probleme de mai sus se face n general pentru resurse refolosibile,
care nu se consum n timp, adic cele care, dup terminarea activitii la care au fost alocate,
se pot folosi la alt activitate. Resursele de acest tip sunt n principal fora de munc i
mainile i utilajele. [9]
Pentru fiecare activitate j vom nota cu Predj mulimea activitilor care trebuie s se
finalizeze nainte ca j s nceap. Elementele mulimii Predj sunt numite predecesori direci ai
lui j. Astfel, este adevrat urmtoarea afirmaie generalizat:
O
activitate
este
numit
predecesoare
activitii
dac
exist
.
38
Fig. 3.1
di/rj,1
2/
1
1/
2
0/
0
0/
0
K = 1, R1
=2
1/
2
1/
1
2/
1
Fig.
3.2
Fig.
3.3
39
6
2
Definiii:
Cu sj (fj) vom nota nceputul (sfritul) activitii j n secvena S, astfel rezultnd un
vector de timpi de start (s1, s2, ..., sn), sau similar, un vector de timpi de final (f1, f2, ..., fn). s1 =
0, iar sn = max {
4. Optimizri cost-durat
Estimarea duratelor aciunilor complexe (problema ADC/TIMP) prin metodele expuse
mai nainte, dei reprezint o problem deosebit de important din punct de vedere economic,
nu este nici pe departe singurul aspect care poate fi urmrit cu ajutorul acestor metode.
O alt problem n care pot fi utilizate instrumentele ADC sunt cele de analiz a
costului execuiei aciunilor complexe, n funcie de durata de execuie a acesteia.
Este evident c, n funcie de pregtirea celor care efectueaz lucrarea, de tehnologia
folosit, de oportunitile momentului etc, durata de execuie a unei aciuni complexe poate
varia, existnd totui o durat minim posibil Tmin i una maxim Tmax acceptabil.
Evident, durata lucrrii are numeroase implicaii asupra costului, drept pentru care
prezint un deosebit interes determinarea acelei durate de execuie, intermediare lui Tmin i
Tmax, creia i corespunde costul minim.
5. Graficul Gantt
Un instrument de mare utilitate n analiza drumului critic l constituie graficul
calendaristic tip Gantt, aprut la nceputul secolului. Graficul (diagram) Gantt exprim la
scara timpului, prin linii orizontale, durata activitilor, i prin linii ntrerupte (de exemplu)
rezervele de timp. Graficul Gantt presupune divizarea aciunii complexe pe care o reprezint
proiectul, n pri componente (activiti) i ealonarea acestora n timp, innd seama de
succesiunea tehnologic, termene impuse, resurse etc.
Dac este ntocmit n urma unei analize temeinice, graficul Gantt ofer informaii
bogate i extrem de sugestiv prezentate, privind desfurarea lucrrilor, precum i o serie de
informaii derivate, privind ealonarea resurselor (for de munc, materii prime, materiale,
fonduri bneti). Aceste avantaje scad dac, datorit fie amplorii aciunii considerate, fie
nivelului de detaliere dorit, numrul activitilor ce compun graficul Gantt crete mult,
ajungnd la cteva sute sau mii.
44
6. Analiza resurselor
Dac din punct de vedere al condiionrilor de tip preceden (temporale) existena
activitilor paralele este corect din punct de vedere logic, putnd exista oricte activiti care
se desfoar n acelai timp, dac nu se intercondiioneaz ntre ele, neexistnd nici o
diferen ntre zilele proiectului, din punct de vedere practic, este clar c o zi n care se
desfoar n acelai timp 10 activiti este mult mai intens din punct de vedere al organizrii
i aprovizionrii cu resurse dect o zi n care se desfoar o singur activitate. Deci, dac se
ine cont doar de condiionrile temporale pot aprea dezechilibre foarte mari n desfurarea
proiectului i/sau pot aprea zile n care necesarul de resurse ar fi mai mare dect disponibilul
acestora.Din cele spuse mai sus, se desprinde faptul c exist cel puin dou probleme
importante legate de resursele unui proiect: problema alocrii resurselor, n care se ncearc
programarea activitilor n aa fel nct n nici o zi s nu se depeasc disponibilul din nici o
resurs i problema nivelrii resurselor, n care se ncearc programarea activitilor n aa
fel nct n toate zilele s se foloseasc cam aceiai cantitate de resurse (sau, altfel spus, suma
variaiilor de la o zi la alta s fie minim).
Trebuie fcut i observaia c analiza n cele dou probleme de mai sus se face n
general pentru resurse refolosibile, care nu se consum n timp, adic cele care, dup
terminarea activitii la care au fost alocate, se pot folosi la alt activitate. Resursele de acest
tip sunt n principal fora de munc i mainile i utilajele.
7. Metoda PERT
Metodele CPM i MPM analizate anterior furnizeaz, aa cum s-a vzut, informaii
care sunt utile n procesul de conducere, ns ele nu in seama de posibilele variaii ale
duratelor de execuie ale activitilor.
Metoda PERT ncearc s corecteze acest lucru. n acest scop metoda permite
calcularea timpului mediu de terminare a unui proiect, identificarea activitilor critice,
precum i estimarea probabilitilor de realizare a termenelor planificate. Pentru c n
practic, n foarte multe programe din domeniul cercetrii i dezvoltrii, duratele activitilor
sunt insuficient cunoscute sau chiar incerte prin considerarea conceptelor statistice, duratele
activitilor sunt considerate variabile aleatoare caracterizate prin media i dispersia lor. [9]
45
Aplicatie
46
}
return s;
}
/*determinarea unui conflict intre evenimente*/
private int[] conflict(Event e)
{
int thisStartTime = e.getStartTime().totalminutes();
int thisEndTime = e.getFinTime().totalminutes();
ArrayList<Integer> conflictList = new ArrayList<Integer>();
for (int i=0; i<events.size(); i++)
{
int thatStartTime = events.get(i).getStartTime().totalminutes();
int thatEndTime = events.get(i).getFinTime().totalminutes();
/* if the event.get(i) has a conflicting time */
if ((thisStartTime < thatStartTime && thisEndTime >
thatStartTime) ||
(thisStartTime >= thatStartTime && thisEndTime <=
thatEndTime) ||
(thisStartTime < thatEndTime && thisEndTime >=
thatEndTime)
||
(thisStartTime <= thatStartTime && thisEndTime >=
thatEndTime))
{
/* if this events age is greater, add this event to
conflictList */
if (e.contactIsOlder(events.get(i)))
conflictList.add(i);
else
return null;
}
}
/* put conflicts in int[], return */
int[] cL = new int[conflictList.size()];
for (int i=0; i<cL.length; i++)
cL[i] = conflictList.get(i);
return cL;
}
/* metoda principala */
public static void main(String[] args) throws FileNotFoundException
{
Scanner stdIn = new Scanner(System.in);
System.out.print("Input file> ");
String fileIn = stdIn.next();
49
*
*
verificare
*
3a) this a trecut, that nu a trecut
*
3b) that a trcut, this nu a trecut
*/
/* cazurile 1 & 2*/
if ((thisBdayPassed && thatBdayPassed) || (!thisBdayPassed &&
!thatBdayPassed))
{
if (thisContact.getBdayMonth() <
thatContact.getBdayMonth())
return true;
if (thisContact.getBdayMonth() ==
thatContact.getBdayMonth())
if (thisContact.getBdayDay() <
thatContact.getBdayDay())
return true;
}
/* cazul 3 returneaza doar daca thatBday a trecut
*
daca a trecut, atunci this nu a trecut si este mai in varsta
*
daca nu a trecut, atunci this a trecut si este mai in varsta
*/
else
{
return thatBdayPassed;
}
}
return false;
}
/* sortam evenimentele programate */
public int compareTo(Event other)
{
if (start.getHours() == other.getStartTime().getHours())
return (start.getMinutes() - other.getStartTime().getHours());
return (start.getHours() - other.getStartTime().getHours());
}
}
Concluzii
Sistemele de planificare sunt algoritmi de rezolvare a problemelor
care opereaz cu reprezentri explicite ale strilor i actiunilor;
52
de
timp-real
MUF
-
Bibliografie
[1] Ioan RUS, Clin-Adrian COMES, Veronica DEAC Optimizarea fluxurilor informatice n
timp real element al restructurrii informatice, Universitatea Petru Maior din TrguMure
2010
53
[2] http://ro.wikipedia.org/wiki/Optimizare
[3] Romic Trandafir, Modele i algoritmi de optimizare, Ed. AGIR, Bucureti, 2004
[4] http://ro.wikipedia.org/wiki/Algoritm_genetic
[5] Claudia Mihaela Mark Seria informatic Algoritmi Genetici, Timioara, 2010
[6] Randy L. Haupt, Sue Hellen Haupt Practical Genetic Algorithms, John Wiley & Sons,
Inc., Hoboken, New Jersey, 2004
[7] Emil Scarlat, Nora Chirita - Cibernetica sistemelor economice, Editura ASE, Bucureti,.
2003
[8] Henri Luchian, Mihaela Breaban Algoritmi Genetici, Universitatea Al. I Cuza, Ia i,
2006
[9] E. ignescu, D. Mitru Bazele cercetrii operaionale, Ed. ASE, Bucureti 1999
[10] A. Abraham, A.E.Hassanien, P. Siarry, A. Engelbrecht - Foundations of Computational
Intelligence Volume 3
[11] F.A. Omara and M.M. Arafa - Genetic Algorithms for Task Scheduling Problem
[12] E.G. Franco, F.T. Zurrita, G.M. Delgadillo A Genetic Algorithm for the Resource
Constrained Project Scheduling Problem, Bogota
54