Documente Academic
Documente Profesional
Documente Cultură
Diferenţa dintre cele două metode constă în faptul că metoda Backtracking la fiecare etapă selectează un
singur succesor după care se face verificarea condiţiilor de continuare, iar metoda Branch and Bound
generează la fiecare pas toate configuraţiile posibile (toţi succesorii) care rezultă din cea curentă şi le
stochează într-o listă. Se alege apoi un element din listă după un criteriu ce depinde de problemă şi se reia
procesul de expandare.
Alegerea optimă a unui element din această listă pentru expandare se face cu ajutorul unei funcţii f = g + h
în care g este o funcţie care măsoară lungimea drumului parcurs de la configuraţia iniţială până la nodul
curent iar h este o funcţie (euristică) care estimează efortul necesar pană se ajunge la soluţie şi este specifică
fiecărei probleme. Alegerea funcţiei h este foarte importantă din punct de vedere a vitezei de execuţie a
programului.
Se lucrează cu două liste: lista open în care se reţin configuraţiile neexpandate încă şi lista close care le
memorează pe cele expandate. Soluţia se construieşte folosind un arbore care se parcurge pe baza legăturii
tată.
Algoritmul:
1. înregistrarea corespunzătoare configuraţiei iniţiale este încărcată în open cu g=0 şi f=h;
2. atât timp cât nu s-a selectat spre expandare nodul corespunzător configuraţiei finale şi lista open este
nevidă, se execută următoarele:
3. se selectează din lista open nodul t cu f minim;
4. se expandează acest nod obţinând o listă liniară simplu înlănţuită cu succesorii săi;
5. pentru fiecare succesor din această listă se execută:
6. se ataşează noul g, obţinut ca sumă între valoarea lui g a configuraţiei t şi costul expandării (de obicei 1);
7. se testează dacă acest succesor aparţine listei open sau close şi în caz afirmativ, se verifică dacă valoarea
lui g este mai mică decât cea a configuraţiei găsite în listă:
8. în caz afirmativ, nodul găsit este direcţionat către actualul părinte (prin fixarea legăturii tată) şi se ataşează
noul g, iar dacă acest nod se găseşte în close, este trecut în open;
9. în caz că acest nod nu se găseşte în open sau close, este introdus în lista open;
10. dacă s-a selectat pentru expandare nodul corespunzător configuraţiei finale atunci se trasează folosind o
procedură recursivă drumul de la configuraţia iniţială la cea finală utilizând legătura 'tată';
11. dacă ciclul se încheie deoarece lista open este vidă înseamnă că problema nu are soluţie.
Obs: Algoritmul se poate implementa folosind o singură listă iar diferenţierea dintre nodurile expandate şi
cele neexpandate se va face după un câmp special. Apare însă dezavantajul că operaţiile de căutare se fac
într-o listă mai lungă. Acest dezavantaj se poate elimina folosind o structură specială numită tabelă hash. În
unele cazuri se poate folosi un arbore binar.