Sunteți pe pagina 1din 4

Backtracking

Backtracking este un principiu fundamental de elaborarea a algoritmilor pentru probleme de


optimizare, sau de gsire a unor soluii la o problem dat. Algoritmii de tip backtracking se bazeaz pe
o tehnic special de explorare n grafurile orientate implicite. Aceste grafuri sunt de obicei arbori, sau
cel puin nu conin cicluri.
Pentru exemplificare, vom considera o problem clasic: cea a plasrii a opt dame pe tabla de
ah, astfel ca niciuna s nu intre n zona controlat de cealalt. O metod simpl este cea de a ncerca
toate combinaiile de plasare a celor 8 regine, verificnd de fiecare dat dac nu s-a obinut o soluie.
Exist n total

64
= 4,426,165,368 combinaii posibile, clar aceast abordare nu este practic.
8

O prim mbuntire ar fi s nu plasm mai mult de o regin pe fiecare linie deoarece altfel clar am
avea cel puin dou regine care se atac. Aceast restricie reduce reprezentarea unei configuraii pe
[1. .8] cu regina de pe linia , 1 8 aflndu-se pe coloana

tabla de ah la un simplu vector,

[ ] adic pe tabla de ah n poziia ( ,

[ ]). De exemplu, vectorul (3,1,6,2,8,6,4,7) nu

reprezint o soluie pentru c reginele de pe liniile trei i ase sunt pe aceeai coloan. n plus exist
dou perechi de regine situate pe aceeai diagonal.
Algoritmul care gsete o soluie a problemei este cel de mai jos:

1.
2.
3.
4.

( , ,, )
(

5.
6.
7.

De aceast dat numrul combinaiilor s-a redus la 8 = 16,777,216, algoritmul oprindu-se de fapt

dup ce inspecteaz 1,299,852 i gsete prima soluie.

n continuare vom mbunti acest algoritm. Dac introducem i restricia ca dou regine s nu se
afle pe aceeai coloan, o configuraie pe tabla de ah se poate reprezenta ca o permutare a primilor opt
ntregi. Algoritmul devine
2

1.

permutarea iniial

2.

permutarea inal

3.
(

4.
5.

urmtoarea permutare
)

Sunt mai multe posibiliti de a genera sistematic toate permutrile primilor


exemplu, putem pune n fiecare din cele
recursiv toate permutrile celor
permutrilor a

1.
2.

numere:

ntregi. De

elemente, pe rnd, n prima poziie, genernd de fiecare dat

1 elemente rmase. Iat mai jos algoritmul de generare a

()

3.

( )

[ ]

[]

[ ]

[]

( + 1)

4.

n acest algoritm de generare a permutrilor, [1. . ] este un tablou global iniializat cu

[1,2, , ], iar primul apel al procedurii este

atunci

(1). Dac

( ) necesit un timp constant,

(1) este n timp ( !). Aceast abordare va reduce numrul de configuraii posibile la

8! = 40,320. Dac se folosete algoritmul

atunci pn la prima soluie sunt generate 2830 de

permutri. Verificarea faptului c o configuraie este o soluie este simpl: trebuie verificat s nu fie
dou regine pe aceeai diagonal.
Chiar i cu aceste ajustri, nu am reuit s eliminm o deficien comun algoritmilor de mai sus
i anume instruciunea

) se face plasnd toate reginele pe tabla de ah. Aceasta

nseamn un numr de 8 instruciuni n cazul unei table de 8X8.

Iat o soluie pentru a elimina acest impediment. Pentru nceput reformulm problema de
cutare a reginelor ca o problem de cutare n arbore. Fie vectorul [1. . ] de ntregi ntre 1 i 8 ce

conine plasamentul unei regine. Spunem c acest vector este


zonele controlate de cele

promitor pentru 0

8, dac

regine plasate n poziiile (1, [1]), (2, [2]), , ( , [ ]) sunt disjuncte.

Din punct de vedere matematic, aceasta nseamn c:

Pentru

[ ] [ ] { , 0, }

1, orice vector

este

0 , ,

promitor. Soluiile problemei celor 8 regine corespund

vectorilor 8-promitori.
Fie
( , )

mulimea vectorilor -promitori cu 0

dac i numai dac exist un ntreg

8. Definim graful orientat ( , ) astfel:

astfel nct

este

promitor,

este ( + 1)

promitor i [ ] = [ ] pentru fiecare 0 . Acest graf este un arbore cu rdcina n vectorul vid

( = 0) i vrfurile terminale sunt fie soluii ( = 8), fie vrfuri moarte ( < 8), n care este imposibil

de plasat regina pe urmtoarea linie fr ca ea s nu atace alta deja plasat. Pentru aceasta nu este
necesar s generm, n mod explicit arborele: vrfurile vor fi generate i abandonate pe parcursul
explorrii.
Vom parcurge arborele

n adncime, ceea ce este echivalent aici cu o parcurgere n preordine,

cobornd n arbore numai dac exist anse de a ajunge la o soluie.


Acest mod de abordare are dou avantaje fa de algoritmul

2. n primul rnd, numrul

de vrfuri n arbore este mai mic dect 8! i anume pe cale empiric | | = 2057. De fapt, este suficient

s explorm 114 vrfuri pentru a ajunge la prima soluie. n al doilea rnd, pentru a decide dac un
vector este ( + 1) promitor, trebuie s verificm ca ultima regin s nu fie pus ntr-o poziie

controlat de reginele deja plasate. Mai jos avem algoritmul:

1.
2.
3.
4.
5.

( )

[1. . k] este

=8

( , )

6.

( + 1)

[ + 1]

( + 1)

( , )

[ ] { + 1 , 0,

( + 1, )

1}

Din programul principal se va apela

(0) presupunnd c

global. Problema se poate generaliza, astfel nct s plasm

[1. .8] este un tablou

regine pe o tabl de

ajutorul acestor contraexemple, se poate demonstra c problema celor

linii i

coloane. Cu

regine nu are n mod necesar

o soluie.
Iat mai jos schema general a unui algoritm de backtracking, varianta recursiv:

1.
2.

( [1. . ])

3.
4.
5.

( + 1)

[1. . ] = [1. . ]

( [1. . + 1])

Sunt foarte multe aplicaii ale algoritmilor de backtracking. Putei ncerca rezolvarea
problemelor ntlnite n capitolele anterioare: problema monezilor, a rucsacului. De asemenea se pot
rezolva problema colorrii hrilor, problema comis-voiajorului, n care admitem c exist orae fr
legtur direct i nu se cere calculul optim. Parcurgerea n adncime, folosit n algoritmul regine,
devine i mai avantajoas atunci cnd ne mulumim cu o singur soluie a problemei. Sunt unele
probleme pentru care acest mod de explorare nu este avantajos.

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