Anda di halaman 1dari 32

Curs 13:

Tehnica cutrii cu revenire


(Backtracking)

Algoritmica - Curs 13

Structura
Ce este tehnica cutrii cu revenire ?
Structura general a algoritmilor proiectai folosind aceast
tehnic
Aplicaii:

Generarea permutrilor
Problema plasrii reginelor pe tabla de ah
Colorarea hrilor
Gsirea traseelor care unesc dou locaii
Problema labirintului
Algoritmica - Curs 13

Ce este tehnica cutrii cu revenire?


Este o strategie de cutare sistematic n spaiul soluiilor unei
probleme
Se utilizeaz n special pentru rezolvarea problemelor a cror
cerin este de a determina configuraii care satisfac anumite
restricii (probleme de satisfacere a restriciilor). Majoritatea
problemelor ce pot fi rezolvate folosind tehnica cutrii cu revenire
se ncadreaz n urmtorul ablon:
S se gseasc o submulime S a produsului cartezian A1 x A2 x
x An (Ak mulimi finite) avnd proprietatea c fiecare element
s=(s1,s2,,sn) satisface anumite restrictii
Exemplu: generarea tuturor permutrilor mulimii {1,2,,n}
Ak = {1,2,,n} pentru fiecare k=1..n
si <> sj pentru orice i<>j (restricia: componente distincte)
Algoritmica - Curs 13

Ce este tehnica cutrii cu revenire?


Ideea de baza:
Soluiile sunt construite n manier incremental prin gsirea
succesiv a valorilor potrivite pentru componente (la fiecare etap
se completeaz o component obinndu-se o soluie parial)
Fiecare soluie parial este evaluat cu scopul de a stabili dac
este valid (promitoare). O soluie parial valid poate conduce
la o soluie final pe cnd una invalid ncalc restriciile pariale,
nsemnnd c nu va conduce niciodat la o soluie care s
satisfac toate restriciile problemei
Dac nici una dintre valorile corespunztoare unei componente nu
conduce la o soluie parial valid atunci se revine la componenta
anterioar i se ncearc alt valoare pentru aceasta.

Algoritmica - Curs 13

Ce este tehnica cutrii cu revenire?


Ideea de baz:
Principiul tehnicii poate fi vizualizat folosind un arbore de cutare
care ilustreaz parcurgerea spaiului soluiilor:
Rdcina arborelui corespunde strii iniiale (nainte de a ncepe
completarea componentelor)
Un nod intern corespunde unei soluii pariale valide
Un nod extern (frunz) corespunde fie unei soluii pariale invalide fie
unei soluii finale

Algoritmica - Curs 13

Ce este tehnica cutrii cu revenire?


Exemplu: arborele de parcurgere a spaiului soluiilor n cazul
problemei de generare a permutrilor (n=3)
(*,*,*)

(1,*,*)

(1,1,*) (1,2,*) (1,3,*)

(1,2,3) (1,3,2)

(2,*,*)

(2,1,*) (2,2,*) (2,3,*)

(2,1,3)

(2,3,1)

Algoritmica - Curs 13

(3,*,*)

(3,1,*) (3,2,*) (3,3,*)

(3,1,2) (3,2,1)

Structura general a algoritmului


Etape n proiectarea algoritmului:
1.

Se alege modul de reprezentare a soluiilor

2.

Se identific spaiul de cutare i se stabilesc mulimile A1,,An


i ordinea n care acestea sunt parcurse

3.

Din restriciile problemei se deduc condiiile pe care trebuie s


le satisfac soluiile pariale pentru a fi valide. Aceste condiii
sunt denumite condiii de continuare.

4.

Se stabilete criteriul n baza cruia se decide dac o soluie


parial este soluie final

Algoritmica - Curs 13

Structura general a algoritmului


Exemplu: generarea permutrilor
1.

Reprezentarea soluiei: fiecare permutare este un vector


s=(s1,s2,sn) care satisface si<>sj pentru orice i<>j

2.

Mulimile A1,,An : {1,2,,n}. Fiecare mulime este parcurs


n ordinea natural a elementelor (de la 1 la n)

3.

Condiii de continuare: o soluie parial (s1,s2,,sk) trebuie s


satisfac sk<>si pentru orice i<k

4.

Criteriu pentru a decide cnd o soluie parial este soluie


final: k=n (au fost completate toate cele n componente)

Algoritmica - Curs 13

Structura general a algoritmului


Notaii:
(s1,s2,,sk) soluie parial
k indice n s
Ak = {ak1,,akmk}
mk=card{Ak}
ik - indice in Ak

Algoritmica - Curs 13

Structura general a algoritmului

Se caut o valoare pt componenta


k care conduce la o soluie parial
valid

Dac o astfel de valoare exist


atunci se verific dac nu s-a
ajuns la o soluie final
Dac s-a gsit o soluie atunci
aceasta se proceseaz i se trece
la urmtoarea valoare
Dac nu e soluie final se
trece la urmtoarea component
Dac nu mai exist nici o valoare
neanalizat pt componenta curent
se revine la componenta anterioar

Backtracking(A1, A2, , An)


k 1; ik 0
WHILE k>0 DO
ik ik+1
v False
WHILE v=False AND ik<=mk DO
sk akik
IF (s1,..sk) e valida THEN v True
ELSE ik ik+1 ENDIF ENDWHILE
IF v=True THEN
IF (s1,,sk) este solutie final
THEN prelucreaz soluia
ELSE k k+1; ik 0 ENDIF
ELSE k k-1 ENDIF
10
ENDWHILE

Structura general a algoritmului


Varianta recursiv:

Presupunem ca A1,,An i
s sunt variabile globale

Fie k componenta care


urmeaz a fi completat

Algoritmul se apeleaz prin


BT_rec(1)
Se ncearc fiecare valoare
posibil

BT_rec(k)
IF (s1,,sk-1) este soluie
THEN se prelucreaz soluia
ELSE
FOR j 1,mk DO
s k ak j
IF (s1,sk) este valid
THEN BT_rec(k+1) ENDIF
ENDFOR
ENDIF
Se completeaz urmtoarea
component

Algoritmica - Curs 13

11

Aplicaie 1: generarea permutrilor


Backtracking(A1, A2, , An)
k 1; ik 0
WHILE k>0 DO
ik ik+1
v False
WHILE v=False AND ik<=mk DO
sk akik
IF (s1,..sk) e valida THEN v True
ELSE ik ik+1 ENDIF ENDWHILE
IF v=True THEN
IF (s1,,sk) e solutie finala
THEN prelucreaza solutia
ELSE k k+1; ik 0 ENDIF
ELSE k k-1 ENDIF
ENDWHILE

permutari(n)
k 1; s[k] 0
WHILE k>0 DO
s[k] s[k]+1
v False
WHILE v=False AND s[k]<=n DO
IF valid(s[1..k])
THEN v True
ELSE s[k] s[k]+1
ENDWHILE
IF v=True THEN
IF k=n
THEN WRITE s[1..n]
ELSE k k+1; s[k] 0
ELSE k k-1
ENDIF ENDIF ENDWHILE

Algoritmica - Curs 13

12

Aplicaie 1: generarea permutrilor


Funcie care verific dac o
soluie parial este valid
valid(s[1..k])
FOR i 1,k-1 DO
IF s[k]=s[i]
THEN RETURN FALSE
ENDIF
ENDFOR
RETURN TRUE

Varianta recursiva:
perm_rec(k)
IF k=n+1 THEN WRITE s[1..n]
ELSE
FOR i 1,n DO
s[k] i
IF valid(s[1..k])=True
THEN perm_rec(k+1)
ENDIF
ENDFOR
ENDIF

Algoritmica - Curs 13

13

Aplicaie 2: problema reginelor


S se determine toate posibilitile de a plasa n regine pe o tabl de
ah de dimensiune nxn astfel nct acestea s nu se atace
reciproc:
- fiecare linie conine exact o regin
- fiecare coloan conine exact o regin
- fiecare diagonal conine cel mult o regina
Obs. Este o problem clasic propus de ctre Max Bezzel (1850)
i studiat de ctre mai muli matematicieni ai vremii (Gauss,
Cantor)
Exemplu: dac n<=3 nu are soluie; dac n=4 sunt 2 soluii
Pe msur ce n crete numrul
soluiilor crete (pt n=8 sunt
92 soluii)
Algoritmica - Curs 13

14

Aplicaie 2: problema reginelor


1.

Reprezentarea soluiei: vom considera c regina k este


ntotdeauna plasat pe linia k. Astfel pentru fiecare regin
este suficient s se identifice coloana pe care va fi plasat.
Soluia va fi astfel reprezentat printr-un tablou (s1,,sn) unde
sk = indicele coloanei pe care se plaseaz regina k

2.

Mulimile A1,,An : {1,2,,n}. Fiecare mulime va fi


prelucrat n ordinea natural a elementelor (de la 1 la n)

3.

Condiii de continuare: o soluie parial (s1,s2,,sk) trebuie


s satisfac restriciile problemei (nu mai mult de o regin pe
fiecare linie, coloan sau diagonal)

4.

Criteriu pentru a decide dac o soluie parial este final:


k = n (toate reginele au fost plasate)

Algoritmica - Curs 13

15

Aplicaie 2: problema reginelor


Condiii de continuare: Fie (s1,s2,,sk) o soluie parial. Aceasta este
valid dac satisface:

Reginele se afl pe linii diferite condiia este implicit satisfacut


datorit modului de reprezentare utilizat (regina i este ntotdeauna
plasat pe linia i)

Reginele se afla pe coloane diferite:


si<>sj pentru orice i<>j
(este suficient s se verifice ca sk<>si pentru orice 1<=i<=k-1)

Reginele se afl pe diagonale diferite:


|i-j| <> |si sj| pentru orice i<>j
(este suficient s se verifice |k-i|<>| sk - si| pentru orice
1<=i<=k-1)
Algoritmica - Curs 13

16

Aplicaie 2: problema reginelor


Obs:
Dou regine i i j se afl pe
aceeai diagonal dac
i-si=j-sj

i-j=-(n-2)
i-j=1

i-j = si-sj

i-j=-1
i-j=n-2

sau

i-j=0

i+si=j+sj i-j= sj-si


Aceasta nseamn c

i+j=3
i+j=n+2

|i-j|=|si-sj|
i+j=n

i+j=2n-1

i+j=n+1

Algoritmica - Curs 13

17

Aplicaie 2: problema reginelor


Algoritm:
Validare(s[1..k])

regine(k)

FOR i 1,k-1 DO

IF k=n+1 THEN WRITE s[1..n]

IF s[k]=s[i] OR |i-k|=|s[i]-s[k]|
THEN RETURN False
ENDIF
ENDFOR
RETURN True

Apel: regine(1)

ELSE
FOR i 1,n DO
s[k] i
IF Validare(s[1..k])=True
THEN regine(k+1)
ENDIF
ENDFOR
ENDIF

Algoritmica - Curs 13

18

Aplicaie 3: colorarea hrilor


Problema: Considerm o hart geografic care conine n ri.
Avnd la dispoziie 4<=m<n culori s se asigneze o culoare
fiecrei ri astfel nct oricare dou ri vecine s fie colorate
diferit.

Problema matematic: orice hart poate fi colorat utiliznd cel


mult 4 culori (rezultat demonstrat in 1976 de catre Appel and
Haken unul dintre primele rezultate obinute folosind tehnica
demonstrrii asistate de calculator)
Algoritmica - Curs 13

19

Aplicaie 3: colorarea hrilor


Problema: : Considerm o hart geografic care conine n ri.
Avnd la dispoziie 4<=m<n culori s se asigneze o culoare
fiecrei ri astfel nct oricare dou ri vecine s fie colorate
diferit.
Formalizarea problemei: Considerm c relaia de vecintate ntre
ri este specificat printr-o matrice N avnd elementele:
0

dac i i j nu sunt ri vecine

dac i i j sunt ri vecine

N(i,j) =

Scopul problemei este s se determine un tablou S=(s1,,sn) cu sk


n {1,,m} specificnd culoarea asociat rii k i astfel nct
pentru toate perechile (i,j) cu N(i,j)=1 elementele si i sj sunt
diferite (si<>sj)
Algoritmica - Curs 13

20

Aplicaie 3: colorarea hrilor


1.

Reprezentarea soluiei
S=(s1,,sn) unde sk culoarea asociat rii k

2.

Mulimile A1,,An : {1,2,,m}. Fiecare mulime va fi


prelucrat n ordinea natural a elementelor (de la 1 la m)

3.

Condiii de continuare: o soluie parial (s1,s2,,sk) trebuie


s satisfac si<>sj pentru toate perechile (i,j) pentru care
N(i,j)=1
Pentru fiecare k este suficient s se verifice ca sk<>sj pentru
toate valorile i in {1,2,,k-1} satisfacnd N(i,k)=1

4.

Criteriu pentru a decide daca o solutie partiala este solutie


finala: k = n (toate rile au fost colorate)

Algoritmica - Curs 13

21

Aplicaie 3: colorarea hrilor


Algoritm recursiv

Algoritm de validare

Colorare(k)
IF k=n+1 THEN WRITE s[1..n]
ELSE
FOR j 1,m DO
s[k] j
IF valid(s[1..k])=True
THEN Colorare(k+1)
ENDIF
ENDFOR
ENDIF

valid(s[1..k])
FOR i 1,k-1 DO
IF N[i,k]=1 AND s[i]=s[k]
THEN RETURN False
ENDIF
ENDFOR
RETURN True

Apel: Colorare(1)

Algoritmica - Curs 13

22

Aplicaie 4: gsirea traseelor


Considerm un set de n orae i o reea de drumuri care le
conecteaz. S se determine toate traseele care conecteaz
dou orae date (un traseu nu poate trece de dou ori prin
acelasi ora).
Trasee de la Arad
la Constanta

Orae:
1.Arad

Satu Mare

1->7->3->4

2.Brasov

Iasi

3.Bucuresti
4.Constanta

1->6->5->3->4

Brasov

Arad

1->2->3->4

1->6->5->2->3->4

5.Iasi
6.Satu-Mare
7.Timisoara

Timisoara

Constanta
Bucuresti

Algoritmica - Curs 13

23

Aplicaie 4: gsirea traseelor


Formalizarea problemei: Reeaua de osele este specificat prin
matricea C:
0
nu exist osea direct de la oraul i la oraul j
C(i,j) =
1
exist osea direct de la oraul i la oraul j
S se gseasc toate traseele S=(s1,,sm) - unde sk n {1,,n}
specific oraul vizitat la etapa k - astfel nct
s1 este oraul surs
sm este oraul destinaie
si<>sj pentru orice i <>j (un ora este vizitat o singur dat)
C(sk,sk+1)=1 (exist osea direct ntre oraele vizitate la momente
consecutive de timp)
Algoritmica - Curs 13

24

Aplicaie 4: gsirea traseelor


1. Reprezentarea soluiei
S=(s1,,sm) cu sk reprezentnd oraul vizitat la etapa k
(m = numrul de etape; nu este cunoscut de la nceput)
2. Mulimile A1,,An : {1,2,,n}. Fiecare mulime va fi
prelucrat n ordinea natural a elementelor (de la 1 la n)
3. Condiii de continuare: o soluie parial (s1,s2,,sk) trebuie
s satisfac:
sk<>sj pentru orice j n {1,2,,k-1} (oraele sunt distincte)
C(sk-1,sk)=1 (se poate trece direct de la sk-1la sk)
4. Criteriul pentru a decide dac o soluie parial este soluie
final:
sk = ora destinaie

Algoritmica - Curs 13

25

Aplicaie 4: gsirea traseelor


Algoritm recursiv

Algoritm de validare

trasee(k)
IF s[k-1]=oras destinatie THEN
WRITE s[1..k-1]
ELSE
FOR j 1,n DO
s[k] j
IF valid(s[1..k])=True
THEN trasee(k+1)
ENDIF
ENDFOR
ENDIF

valid(s[1..k])
IF C[s[k-1],s[k]]=0 THEN
RETURN False
ENDIF
FOR i 1,k-1 DO
IF s[i]=s[k]
THEN RETURN False
ENDIF
ENDFOR
RETURN True

Apel:
s[1] ora surs
trasee(2)
Algoritmica - Curs 13

26

Aplicaie 5: problema labirintului


Problema. Se consider un labirint definit pe o gril nxn. S se
gseasc toate traseele care pornesc din (1,1) i se termin n
(nxn)
Obs. Doar celulele libere pot fi vizitate.
Dintr-o celul (i,j) se poate trece n
una dintre celulele vecine:

(i-1,j)
(i,j-1) (i,j) (i,j+1)
(i+1,j)

Obs: celulele de pe frontier au mai puini


vecini
Algoritmica - Curs 13

27

Aplicaie 5: problema labirintului


Formalizarea problemei. Labirintul este stocat ntr-o matrice nxn
0

celul liber

celul ocupat

M(i,j) =
S se gseasc S=(s1,,sm) cu sk n {1,,n}x{1,,n} indicii
corespunztori celulei vizitate la etapa k
s1 este celula de start: (1,1)
sm este celula destinaie: (n,n)
sk<>sq pentru orice k <>q (o celul este vizitat cel mult o
dat)
M(sk)=0 (doar celulele libere pot fi vizitate)
sk-1 si sk sunt celule vecine

Algoritmica - Curs 13

28

Aplicaie 5: problema labirintului


1. Reprezentarea soluiei
S=(s1,,sn) cu sk reprezentnd indicii celulei vizitate la etapa
k
2. Mulimile A1,,An sunt submulimi ale mulimii
{1,2,,n}x{1,2,,n}. Pentru fiecare celul (i,j) exist un set de 4
vecini: (i,j-1), (i,j+1), (i-1,j), (i+1,j)
3. Condiii de continuare: o soluie parial (s1,s2,,sk) trebuie s
satisfac:
sk<>sq pentru orice q in {1,2,,k-1}
M(sk)=0
sk-1 i sk sunt celule vecine
4. Condiia ca o soluie parial (s1,,sk) s fie soluie final:
sk = (n,n)
Algoritmica - Curs 13

29

Aplicatie 5: problema labirintului


labirint(k)
IF s[k-1].i=n and s[k-1].j=n THEN WRITE s[1..k]
ELSE // se incearc toi vecinii
s[k].i s[k-1].i-1; s[k].j s[k-1].j
IF valid(s[1..k])=True THEN labirint (k+1) ENDIF
s[k].i s[k-1].i+1; s[k].j s[k-1].j

Obs:
s[k].i reprezint
prima component a
perechii de indici
s[k].j reprezint a
doua component a
perechii de indici

IF valid(s[1..k])=True THEN labirint (k+1) ENDIF


s[k].i s[k-1].i; s[k].j s[k-1].j-1
IF valid(s[1..k])=True THEN labirint (k+1) ENDIF
s[k].i s[k-1].i-1; s[k].j s[k-1].j+1
IF valid(s[1..k])=True THEN labirint (k+1) ENDIF
ENDIF
Algoritmica - Curs 13

30

Aplicaie 5: problema labirintului


valid(s[1..k])
IF s[k].i<1 OR s[k].i>n OR s[k].j<1 OR s[k].j>n // n afara grilei
THEN RETURN False
ENDIF
IF M[s[k].i,s[k].j]=1 THEN RETURN False ENDIF // celul ocupat
FOR q 1,k-1 DO

// celul deja vizitat

IF s[k].i=s[q].i AND s[k].j=s[q].j THEN RETURN False ENDIF


ENDFOR
RETURN True
Apel algoritm labirint:
s[1].i:=1; s[1].j:=1
Algoritmica - Curs 13

labirint(2)

31

Curs urmtor: recapitulare


Tematica examen:

Algorirmi iterativi: proiectare i analiza complexitate


Algoritmi recursivi: descriere i analiza complexitate
Tehnici de reducere i divizare: descriere i analiza
complexitate
Algoritmi de sortare:
algoritmi elementari (inserie, selecie, interschimbare)
algoritmi eficieni (sortare prin interclasare, sortare rapid)
Cutare local optimala (greedy)
Programare dinamic
Cutare cu revenire (backtracking)

Algoritmica - Curs 13

32

Anda mungkin juga menyukai