Documente Academic
Documente Profesional
Documente Cultură
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
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
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
)
1.
2.
numere:
ntregi. De
()
3.
( )
[ ]
[]
[ ]
[]
( + 1)
4.
atunci
(1). Dac
(1) este n timp ( !). Aceast abordare va reduce numrul de configuraii posibile la
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
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
promitor pentru 0
8, dac
Pentru
[ ] [ ] { , 0, }
1, orice vector
este
0 , ,
vectorilor 8-promitori.
Fie
( , )
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
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
1.
2.
3.
4.
5.
( )
[1. . k] este
=8
( , )
6.
( + 1)
[ + 1]
( + 1)
( , )
[ ] { + 1 , 0,
( + 1, )
1}
(0) presupunnd c
regine pe o tabl de
linii i
coloane. Cu
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.