Documente Academic
Documente Profesional
Documente Cultură
Lucrare de
laborator Nr. 4
La obiectul: Analiza i Proiectarea Algoritmilor.
Scopul lucrrii:
1. Studierea metodei programrii dinamice.
2. Analiza i implementarea algoritmilor de
programare dinamic.
3. Compararea tehnicii greedy cu metoda de
programare dinamic.
2.1 Cele mai scurte drumuri care pleac din acelai punct
Fie G = <V, A> un graf orientat, unde V este mulimea vrfurilor i A este
mulimea arcelo. Fiecare arc are o lungime nenegativa. Unul din vrfuri este ales c
vrf surs. Problema este de a determina lungimea celui mai scurt drum de la surs
ctre fiecare vrf din graf.
Se va folosi un algoritm greedy, datorat lui Dijkstra (1959). Notm cu C
mulimea vrfurilor disponibile (candidaii) i cu S mulimea vrfurilor deja selectate.
n fiecare moment, S conine acele vrfuri a cror distan minim de la surs este
deja cunoscut, n timp ce mulimea C conine toate celelalte vrfuri. La nceput, S
conine doar vrful surs, iar n final S conine toate vrfurile grafului. La fiecare pas,
adugam n S acel vrf din C a crui distan de la surs este cea mai mic.
Se spune, c un drum de la surs ctre un alt vrf este special, dac toate
vrfurile intermediare de-a lungul drumului aparin lui S. Algoritmul lui Dijkstra
lucreaz n felul urmtor. La fiecare pas al algoritmului, un tablou D conine
lungimea celui mai scurt drum special ctre fiecare vrf al grafului. Dup ce se
adaug un nou vrf v la S, cel mai scurt drum special ctre v va fi, de asemenea, cel
mai scurt dintre toate drumurile ctre v. Cnd algoritmul se termin, toate vrfurile
din graf sunt n S, deci toate drumurile de la surs ctre celelalte vrfuri sunt
speciale i valorile din D reprezint soluia problemei.
Presupunem c vrfurile sunt numerotate, V = {1, 2, ..., n}, vrful 1 fiind sursa,
i c matricea L d lungimea fiecrui arc, cu L[i, j] = , dac arcul (i, j) nu exist.
Soluia se va construi n tabloul D[2 .. n]. Algoritmul este:
3: repeat n2 times
4: v vrful din C care minimizeaz D[v]
5: C C \ {v} {si, implicit, S S {v}}
6: for fiecare w C do
7: D[w] min(D[w], D[v]
+L[v, w]) return D
unde s-a facut uz de principiul optimalitii pentru a calcula lungimea celui mai scurt
drum fa de k. Implicit, s-a considerat c un drum optim care trece prin k nu poate
trece de dou ori prin k.
int main()
{
setlocale(LC_ALL, "Rus");
clock_t start,end;
start=clock();
int GR[V][V];
/*int GR[V][V]={
{0, 1, 4, 0, 2, 0},
{0, 0, 0, 9, 0, 0},
{4, 0, 0, 7, 0, 0},
{0, 9, 7, 0, 0, 2},
{0, 0, 0, 0, 0, 8},
{0, 0, 0, 0, 0, 0}};
*/
ifstream f;
f.open("g6des.txt");
int x;
}
6 virfuri rar:
6 virfuri des:
15 virfuri rar:
15 virfuri des:
25 virfuri rar :
25 virfuri des:
250 virfuri:
Floyd:
#include <iostream>
#include <conio.h>
#include <fstream>
#include <iostream>
#include<time.h>
using namespace std;
const int maxV=1000;
int i, j, n;
int it = 0;
int GR[maxV][maxV];
//alg Floyd
void FU(int D[][maxV], int V)
{
int k;
for (i=0; i<V; i++) D[i][i]=0;
int main()
{
setlocale(LC_ALL, "Rus");
clock_t start,end;
start=clock();
n=6;
ifstream f;
f.open("g6rar.txt");
int x;
/*
for (int i = 0; i <= n-1; i++)
{
for (int j = 0; j <= n-1; j++)
{
cout <<"\t"<<GR[i][j];
}cout << endl;
}
getch();
*/
cout<<"\t Floyd: "<<endl;
cout<<"Matricea Drumurilor minime:"<<endl;
cout<<"--------------------------------------------"<<endl;
FU(GR, n);
cout<<"--------------------------------------------"<<endl;
end=clock();
printf("\n\nTimpul de executie este : %.8f \n",((double)(clock()-
start))/CLOCKS_PER_SEC);
cout << "Nr iteratii: "<<it;
}
6 virfuri rar:
6virfuri des:
15 virfuri rar:
15 virfuri des :
25 virfur rar:
25 virfuri des:
250 virfuri:
Exemplu
Algorit V Nr.iterati Timpul
mul i
Dijkstra 6 180 Rar:0.032
Des:0.032
Floyd 6 432 Rar:0.007
Des:0.008
Exemplu
Algorit V Nr.iterati Timpul
mul i
Dijkstra 15 3150 Rar:0.184
Des:0.193
Floyd 15 6750 Rar:0.036
Des:0.036
Exemplu
Algorit V Nr.iterati Timpul
mul i
Dijkstra 25 15000 Rar:0.458
Des:0.489
Floyd 25 31250 Rar:0.085
Des:0.179
Exemplu
Algorit U Nr.iterati Timpul
mul i
Dijkstra 250 15562500 37.564
Dijkstra/IT Timpul:
Floyd
Floyd/It Timpul
31250000
15562500
37,564 17,892
Iteratii Timp
Concluzie:
Efectuind lucrarea data ne-am facut cunoscuti cu Metoda
programrii dinamice.Si am analizat eficienta programarii
dinamice pentru diferite cazuri ale problemei. Implementind si
analizind algoritmele Dijksta si Floys am concluzionat ca acesti
algoritmi sunt rapizi si deci sunt algoritmi eficienti si foarte buni
pentru rezolvarea problemei de construire a arborelui de cost
minim.Observ ca dindui numarul de virufuri in cazul meu 6 15 25
si 250 in algoritmului Dijkstra numarul de iteratii atit in cazul cu
un numar de arce dens si rar ramine acelas doar ca incepe a varia
in dependenta dupa numarul de virfuri, timpul de executie creste
cu marirea numarului de virfuri.In cazul algoritmului Floyd
iteratiile nu depind de densitatea arcelor ci doar de numarul de
virfuri si semnificativ timpul de executie este mai mic decit la
Dijkstra in schimb numarul de iteratii este mult mai mare.