Sunteți pe pagina 1din 1

Branch and bound

Prezentarea metodei Branch and bound


Metoda Branch and Bound foloseste la rezolvarea problemelor la care domeniul în care se caută soluţia este
foarte mare şi nu se cunoaşte un alt algoritm care să conducă mai rapid la rezultat. Problemele care pot fi
abordate prin această metodă pot fi modelate într-un mod asemănator celui folosit la metoda Backtracking.
Se pleacă de la o configuraţie iniţială şi se reţine şirul de operaţii prin care aceasta este transformată într-o
configuraţie finală dacă aceasta este dată, în alte cazuri se cere configuraţia finală ştiind că trebuie să verifice
anumite condiţii de optim.

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ă.

Nodurile sunt înregistrări care cuprind următoarele informaţii:


• configuraţia la care s-a ajuns, t;
• valorile funcţiilor g si h,
• adresa nodului 'tată';
• adresa înregistrării următoare în lista open sau close;
• adresa înregistrării următoare în lista succesorilor.

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.

S-ar putea să vă placă și