Sunteți pe pagina 1din 7

Problema 8-puzzle: Există o spaţiu de joc 3x3, deci asigur�nd 9 poziţii, �n care pot glisa �n

direcţia spaţiului neocupat 8 piese �nscrise cu numere �ntre 1 şi 8. Plec�nd de la o distribuţie


iniţială a pieselor pe tablă se cere aducerea lor �ntr-o stare finală impusă. Un exemplu de instanţă a
problemei 8-puzzle este prezentat �n Figura 4.

Figura 4: O instanţă a problemei 8-puzzle

Operatori (reguli): mută blanc sus, mută blanc jos, mută blanc dreapta, mută blanc st�nga.

Funcţia euristică: nr. de piese aflate �n poziţii finale.

f(stare iniţială) = 4; f(stare finală) = 8;


Figura 5: Un exemplu de arbore de căutare pentru problema 8-puzzle

(Sub fiecare stare este notat scorul stăii. Avansarea spre

soluţie este dată de săgeţile groase.)

Strategii tentative

O strategie tentativă este una şovăitoare: o mişcare ce se dovedeşte greşită poate fi �ndreptată.
Mişcarea �n spaţiul stărilor nu este inexorabilă. Dacă s-a ajuns �ntr-un punct mort pot să "iau
urma �ndărăt" pentru a face o altă mişcare dintr-o poziţie anterioară celei curente, �n care am
mai fost.

� Metoda ascensională cu revenire (backtracking hill climbing)

procedure backtracking-hill-climbing(initial-state)

begin

�� stack = initial-state;

�� while (stack) begin

����� current-state = pop(stack);

����� if (current-state e stare finală) return current-state;

����� else begin

evaluează funcţia de cost pentru descendenţii lui current-state;

elimină dintre aceste stări pe acelea �n care am mai fost;

sortează stările rămase �n ordinea descrescătoare a valorilor funcţiei de cost;

introdu-le �n stivă (push) �n această ordine;

����� end

�� end

�� return fail;

end

Se observă că ordonarea noilor stări găsite se face �nainte de introducerea lor �n


stivă. �nseamnă că prima stare ce va fi considerată �n continuare este cea din care pot să ajung
cel mai sus din starea �n care mă aflu. Dacă la un moment dat ajung �ntr-un punct de maxim local
sau de platou, dacă stări noi pot fi atinse din starea curentă, ele se introduc �n stivă, chiar
dacă acestea se află �mai jos� dec�t starea curentă �n drumul spre soluţie. Acest lucru permite
abordarea altor căi neexplorate şi �ocolirea� v�rfurilor locale sau a platourilor. Interzicerea
introducerii �n stivă a stărilor prin care s-a mai trecut �mpiedicăintrarea �n bucle infinite.

Metode de căutare sistematică (brute-force)


Metodele de căutare sistematică investighează �n totalitate spaţiul stărilor, plec�nd din starea
iniţială, pentru găsirea unei căi către starea (stările) finală (finale). Aceste metode pot fi aplicate
c�nd spaţiul stărilor este rezonabil de mic, �n aşa fel �nc�t să ne putem permite, �n extremis,
parcurgerea lui exhaustivă.

� Metode de tip generează şi testează

Metodele de tip generează şi testează utilizează un generator care furnizează o stare următoare
�ncă nevizitată. Toată euristica se află �n generator. Acesta poate implementa o listă, o stivă sau o
coadă şi atunci vom recunoaşte diferite metode specifice. Procedura generală este următoare:

procedure generateAndTest()

�� while (generatorul nu e gol) {

����� if solutionTester(generator(candidate)) then return candidate;

����� }

�� return failure

� Căutare �nt�i-�n-ad�ncime (depth-first search)

�n căutarea �nt�i-�n-ad�ncime generatorul implementează o stivă. Prin aceasta �nainte de a


căuta �n fraţii unui nod, �nt�i fiii acestuia s�nt căutaţi. Această ordine este dictată de faptul că,
după vizitarea unui nod N, �nt�i N este eliminat din stivă şi apoi fiii acestuia s�nt introduşi �n
stivă. Datorită caracteristicii last-in-first-out ei vor fi parcurşi �naintea altor noduri aflate deja acolo.
C�nd spaţiul stărilor este un arbore, căutarea �nt�i-�n-ad�ncime parcurge arborele cu
predilecţie �n ad�ncime, de unde şi numele metodei.

procedure depthFirstSearch(root)

�� STACK = o stivă conţin�nd nodul rădăcină root;

�� while (STACK nu e goală)

�� begin

����� node = pop(STACK);

����� if goal(node) then return node;

����� else push succesorii lui node;


�� end

�� return FAIL;

Această procedură testează soluţia �n fiecare nod al arborelui. Dacă doar nodurile frunză sunt
soluţii posibile, procedura se schimbă astfel:

procedure leafDepthFirstSearch(root)

�� STACK = o stivă conţin�nd nodul rădăcină root;

�� while (STACK nu e goală)

�� begin

����� node = pop(STACK);

����� if not(leaf(node)) push succesorii lui node;

����� else if goal(node) then return node;

�� end

�� return FAIL;

Un dezavantaj al căutării �n ad�ncime �l constituie posibilitatea ca algoritmul să nu se termine


�n cazul arborilor infiniţi. Desigur �n practică nu se lucrează cu arbori infiniţi, dar problema
răm�ne pentru că e �ncă posibil ca algoritmul să genereze un număr foarte mare de noduri chiar
dacă soluţia se află pe un nivel superior, dar pe o ramură aflată �n dreapta arborelui.

� Căutare �nt�i �n lărgime (breadth-first search)

procedure breadthFirstSearch(root)

QUEUE = o coadă conţin�nd nodul rădăcină root;

while (QUEUE nu e goală)

begin

�� node = first(QUEUE);

�� if goal(node) then return node;


�� else introdu �n spatele cozii succesorii lui node;

end

return FAIL;

O căutare �n lărgime are mai mari şanse să găsească �nt�i nodul soluţie aflat pe cel mai �nalt
nivel, dec�t o căutare �n ad�ncime.

Căutarea cel-mai-bun-�nt�i (best-first)

Metoda de căutare cel-mai-bun-�nt�i (best-first) combină metodele depth-first şi breadth-


first �n sensul că ia de la prima urmarea unei singure căi o dată, iar de la a doua faptul că nu se
�mpotmoleşte �n nodurile care nu au urmaşi.

Metoda: la fiecare pas sortează toate nodurile ce nu au fost �ncă vizitate �n ordinea crescătoare a
distanţei p�nă la un nod final şi alege pentru expandare �n continuare pe cel mai bine plasat.

Ea poate fi aplicată �n egală măsură parcurgerii arborilor ca şi a grafurilor.

Figura 6 prezintă un exemplu de căutare best-first pe un arbore.

Figura 6: Un exemplu de căutare best-first

Cifrele de l�ngă noduri �n


Figura 6 şi cele ce �nsoţesc ca puteri numele de noduri �n tabela următoare reprezintă costuri.

Pasul Nodul Descendenţi �n Stiva sortată


vizitat ordinea crescătoare a
scorurilor

0 (A)

1 A D1, B3, C5 (D1, B3, C5)

2 D E4, F6 (B3, E4, C5, F6)

3 B H5, G6 (E4, C5, H5, G6, F6)

4 E J1, I2 (J1, I2, C5, H5, G6,


F6)

5 J

Pentru transpunerea metodei la o căutare pe grafuri vom folosi două liste de noduri:

� OPEN: noduri care au fost generate şi au funcţia euristică aplicată asupra lor, dar care nu au
fost �ncă vizitate. Elementele �n această listă s�nt �ntotdeauna sortate �n ordinea crescătoare
a valorilor funcţiei euristice.

� CLOSED: noduri care au fost deja examinate. O astfel de listă e necesară dacă structura este
una de graf, iar nu de arbore, �ntruc�t, la fiecare generare a unui nou nod, lista este căutată şi
nodul generat numai dacă el nu există deja �n CLOSED.

Funcţia euristică f', �n multe cazuri, este rezultatul sumei a două valori:

g � un cost al traversării grafului din nodul start p�nă �n nodul curent, şi

h' � un cost al estimării traversării grafului din nodul curent p�nă �ntr-un nod final:

f' = g + h'

Un algoritm cunoscut care aplică best-first pentru căutare pe grafuri este A*.