220 likes | 609 Views
Curs 12. Paradigmele "backtracking" si "branch and bound" Modelul matematic Studii de caz problema celor n regine colorarea grafurilor submultimea de suma maxima rucsac 0/1. "Backtracking" si "branch and bound": cadru general.
E N D
Curs 12 • Paradigmele "backtracking" si "branch and bound" • Modelul matematic • Studii de caz • problema celor n regine • colorarea grafurilor • submultimea de suma maxima • rucsac 0/1
"Backtracking" si "branch and bound": cadru general • metoda de rezolvare: cautare in spatiul solutiilor candidat (finit) • cautare exhaustiva: este cercetat intregul spatiu • cautare sistematica: "backtracking" si "branch and bound" • spatiul solutiilor este organizat ca un arbore • un varf este viabil daca sunt sanse sa se gaseasca o solutie explorand subarborele cu radacina in acel varf • sunt explorati numai subarborii cu radacini viabile • "backtracking" si "branch and bound" difera doar prin modul in care exploreaza lista varfurilor viabile din arbore
"Backtracking": ingrediente • spatiul solutiilor candidat organizat ca arbore • produs cartezian • submultimi • permutari • drumuri in graf • etc • se defineste o functie criteriu prin care se stabileste daca un varf este viabil sau nu • arborele este explorat prin algoritmul DFS • fie x = (x0, ..., xk) secventa care descrie drumul de la radacina la varful curent • daca varful curent este pe frontiera se verifica daca x este solutie • in caz contrar se alege urmatorul succesor viabil (daca exista)
"Backtracking" pentru probleme de optim • pp. ca se doreste calculul lui optimx f(x) • se pleaca cu un optim initial • daca varful curent este pe frontiera se verifica daca f(x) este mai bun decat optimul calculat pana in acel moment • daca da, atunci f(x) devine noul optim • daca varful curent NU este pe frontiera si f() calculat pentru solutia partiala este mai "rau" decat optimul calculat pana in acel moment, atunci varful nu este viabil si este abandonat
Spatiul solutiilor = produs cartezian: exemplu 3 1 2 2 1 2 2 1 1 (3,2) (3,1) (2,2) (2,1) (1,2) (1,1) • S = {1,2,3} {1,2} • dimensiune spatiu: A0 A1 ... An-1 are |A0| |A1| ... |An-1| elemente
Enumerarea elementelor din {0,...,m-1}n procedure EnumProdCart(m,n) begin k 0; x[0] -1 while (k >= 0) do if (x[k] < m-1) then x[k]++ if (k=n-1) then scrie(x) else k++ x[k] -1 else k-- end
"Backtracking": produs cartezian - algoritm procedure backtracking() begin k 0; x[0] -1 while (k >= 0) do if (x[k] < m - 1) then repeat x[k]++ until (viabil(x,k) or x[k]=m-1) if (viabil(x,k)) then if (k=n-1 and x este solutie) then scrie(x) else if (k<n-1) then k++ x[k] -1 else k-- end
Spatiul solutiilor = submultimi 0 1 0 1 0 1 0 0 0 0 1 1 1 1 • S {0, 1, ..., n-1} • S poate fi reprezentata prin vectorul sau caracteristic x: x[i] {0,1}, x[i] = 1 i S • vector caracteristic {0,1}n • enumerare submultimi = enumerare vectori caracteristici • dimensiune spatiu: 2n • Exemplu: n = 3
Spatiul solutiilor = permutari 2 0 1 2 2 1 1 0 0 1 2 2 0 0 1 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 n = 3: • enumerare permutari prin "bactracking" • x[k] viabil 0 x[k] n-1 si x[k] x[i] pentru i = 0, ..., k-1
Spatiul solutiilor = drumuri in graf cu sursa precizata 0 0 1 4 4 1 2 2 3 3 3 2 4 3 2 1 2 1 4 • se parcurge DFS • ori de cate ori se epuizeaza lista de asteptare a lui i ≠ i0 se face p[i] = a[i] (se reia de la capat) • se inlocuieste testul i S cu i stiva
Spatiul solutiilor = drumuri in graf cu sursa si destintatia precizate (0,0) (0,0) (0,1) (0,2) (1,0) (0,1) (1,1) (1,1) (1,0) (0,2) (1,2) (1,1) (0,1) (1,2) (1,2) (1,0) (1,2) (0,2) (1,2) • lista de adiacenta = parcurgerea in sensul arcelor de ceasornic incepind cu vecinul din dreapta • se parcurge DFS incepand cu (0, 0) • ori de cate ori se intalneste (1,2) stiva descrie un drum de la (0,0) la (1,2)
Spatiul solutiilor = labirint (0,0) (5,3) lista de adiacenta = parcurgerea in sensul arcelor de ceasornic incepind cu vecinul din dreapta
Backtracking: problema celor n regine 0 1 2 3 0 1 2 3 • Problema • intrare: o tabla de sah n n, n regine • iesire: toate asezarile posibile ale celor n regine pe tabla fara ca sa se atace
Problema celor n regine: algoritm backtracking • reprezentarea solutiei • o reprezentare care nu-i OK Q[i,j] = true pe pozitia [i,j] se gaseste o regina nr. sol. candidat = 2nn • o reprezentare mai buna s[i] = j Q[i,j] = true nr. sol. candidat = nn n = 8 2nn = 264, nn = 224 • criteriul de viabilitate • (i) 0 i k – 1 s[i] s[k] |s[i] – s[k]| |i-k|
Problema celor n regine: arborele taiat 3 0 2 1 0 3 0 3 2 1 0 3 2 1 1 2 0 1 2 3 0 x x 1 x x 2 x x x x 3
Backtracking: colorarea grafurilor • problema • instanta • un graf G = (V, E), V = {0, ..., n-1}, • m culori 1, 2, ..., m • colorare c : V {1, 2, ..., m}, {i, j} E c[i] c[j] • iesire: • toate colorarile posibile • modelul matematic • reprezentarea solutiilor • c {1, 2, ...,m}n • criteriul de viabilitate • (j) 0 j < k and {j, k} E c[j] c[k]
Backtracking: submultimi de suma data • problema • instanta • o multime A cu n elemente • fiecare a A are o marime s[a] Z+ • un numar M Z+ • iesire • submultimile A’ A cu (s[a] a A’) = M • modelul matematic • reprezentarea solutiei • pp. A = {0, 1, ..., n-1}, s[i] = wi • A' reprezentata prin vectorul caracteristic x • criteriul de viabilitate: i=1,k xiwi M si i=1,k xiwi + i=k+1,n wi M
"Branch and bound" • fiecare varf viabil este explorat o singura data • cand un varf viabil este explorat, toti fiii viabili sunt generati si memorati intr-o structura de date de asteptare • urmatorul varf explorat este ales din structura de asteptare • moduri de implementare pentru structura de asteptare: • coada (FIFO) • arborele este explorat BFS • (min, max) - heap • probleme de optim • se asociaza o functie predictor (valoare de cost aproximativa) pentru fiecare varf • cheia in heap = valoarea functiei predictor
"Branch and bound": rucsac 0/1 • problema relaxata • functia obiectiv: max i=0,n-1 yi pi • restrictii: (i) 0 i < k yi {0,1} (i) k i < n yi [0,1] i=0,n-1 yi wi M M Z, (i)wi , pi Z • modelul matematic • valoarea cost aproximata = valoarea obtinuta prin rezolvarea problemei relaxate • structura pentru structura de asteptare: max-heap (varful urmator este cel cu valoarea maxima pentru problema relaxata)
"Branch and bound": rucsac 0/1 – exemplu M = 80 1 0 1 0 1 0 0 1 0 0 0 0 W = 75 P = 95 W = 70 P = 90