140 likes | 523 Vues
CAPITOLUL 1. METODA GREEDY . Profesor Coordonator: Brebenel George. GENERALITĂŢI. Enunţ general : “ Se consideră o mulţime A. Se cere o submulţime a sa astfel încât să fie îndeplinite anumite condiţii (acestea diferă de la o problemă la alta) ”.
E N D
CAPITOLUL 1 METODAGREEDY Profesor Coordonator: Brebenel George
GENERALITĂŢI Enunţ general :“Se consideră o mulţime A. Se cere o submulţime a sa astfel încât să fie îndeplinite anumite condiţii (acestea diferă de la o problemă la alta)”. Structura generală a unei aplicaţii Greedy (lacom) : Sol:=0; Repetă Alege x€A; Dacă este posibil Atunci SolSol+x; Până când am obţinut soluţia Afişează Sol; Metoda Greedy se aplică în două cazuri : Atunci când ştim sigur că se ajunge la soluţia dorită (avem la bază o demonstraţie) Atunci când nu dispunem de o soluţie în timp polinomial.
Problema comis-voiajorului Enunţ :”Un comis-voiajor pleacă dintr-un oraş, trebuie să viziteze un număr de oraşe şi să se întoarcă în oraşul de unde a plecat cu efort minim. Orice oraş i este legat printr-o şosea de orice alt oraş j printr-un drum de A[i,j] kilometri. Se ceretraseulpe care trebuie să-l urmeze comis-voiajorul, astfel încât să parcurgă un număr minim de kilometri.” Fie oraşele de mai jos şi matricea care reţine distanţele dintre ele : 1 1 3 5 5 1 2 5 4 1 9 2 4 3 6
Problema comis-voiajorului Rezolvare :se alege un oraş de pornire. La fiecare pas se selectează un alt oraş, prin care nu s-a mai trecut şi aflat la distanţa minimă faţă de oraşul de pornire. Algoritmul se încheie atunci când am selectat toate oraşele. Obs: vectorul S va reţine oraşele deja selectate. De exemplu, dacă se porneşte cu oraşul 1, se va obţine un drum de lungime 14 care trece prin oraşele : 1, 2, 5, 3, 4, şi 1.
Problema comis-voiajorului #include <iostream.h> Int S[10], A[10][10], n, i, j, v, vs, vs1, min, cost; int main(){ cout<<”Numar de noduri=”; cin>>n; //citescmatricea for (i=1;i<=n;i++) for (j=1;j<=n;j++){ cin>>A[i][j]; A[j][i]= A[i][j] } //pentrufiecare nod cout<<”Nod de pornire”; cin>>v; S[v]=1; vs1=v; cout<<”Drumultreceprin “; for (i=1;i<=n-1;i++){ min=30000; for (j=1;j<=n;j++) if (A[v][j]!=0 && S[j]==0 && min>A[v][j]){ min=A[v][j]; vs=j; } cost+=A[v][vs]; cout<<vs<<” “ S[vs]=1; v=vs; } cost+=A[vs1][v]; cout<<”Cost= <<cost“; return 0; }