Documente Academic
Documente Profesional
Documente Cultură
4.
Structuri i strategii de cutare n spaiul de stri
4.1.2 Cutarea
Un al doilea aspect subliniat de Newell i Simon este acela c o problem este soluionat
prin cutarea soluiei printre nite alternative posibile. Acest aspect este susinut de analogia
cu gndirea uman. Omul utilizeaz de asemenea un numr de strategii n modul lui de a
rezolva o problem. De exemplu, un juctor de ah analizeaz un anumit numr de micri
viitoare, alegnd micarea n funcie de un criteriu de eficien, astfel ales nct s-i asigure un
avantaj maxim. Un matematician alege dintre diferite strategii, nu mai puin complexe, pe
acelea care-i permit demonstrarea unei teoreme complexe; un fizician poate investiga un
anumit numr de cauze posibile ale unui anumit fenomen .a.m.d. Acest aspect al inteligenei
contureaz aa numita tehnica de rezolvare prin cutare n spaiul de stri.
Prin stare se nelege o anumit configuraie a problemei investigate. De exemplu, n
jocul de ah o stare este o anumit poziie de pe tabla de ah. n calculator, o poziie este
reprezentat printr-o aa numit baz de date, baz a crei complexitate depinde de natura
problemei abordate, mergnd de la cteva numere pn la o baz de date relaional. n
procesul de rezolvare a unei probleme, omul sau maina poate utiliza anumite reguli, poate
aplica anumite procedee sau artificii sau, n cazul jocurilor, poate efectua anumite mutri. De
exemplu, n jocul de ah poate efectua oricare din mutrile posibile. Aceste reguli, procedee
sau mutri vor produce modificri asupra bazei de date, aceasta reflectnd starea curent a
problemei.
Totalitatea acestor stri vor constitui un spaiu pe care-l vom denumi spaiul de stri.
Dintre acestea, vom deosebi o stare denumit stare iniial reflectnd datele iniiale ale
problemei. De asemenea, strile ce constituie soluii posibile ale problemei vor fi denumite
stri finale.
IASE 2/16 Cap. 4. Structuri i strategii de cutare
Fr a avea pretenia c este cea mai simpl forma de soluionare a problemei, dac un
astfel de drum exist, predicatul: exista_lant_eulerian va avea valoarea true.
Exerciiul 4.1 Transpunei n LPA PROLOG problema podurilor din Knigsberg,
definind predicatele descrise mai sus i chestionai ulterior sistemul asupra existenei soluiei.
Simplificai acest program prin utilizarea listelor.
O implementare eficient a unui algoritm de cutare cere programatorului s analizeze i
s prevad comportarea algoritmului, acesta fiind confruntat cu urmtoarele probleme:
conduce algoritmul respectiv la o soluie?
algoritmul conduce la o soluie ntr-un numr finit (rezonabil) de pai sau poate
intra ntr-un ciclu infinit?
dac o soluie este gsit este aceasta optim?
ct de amplu este procesul de cutare n termenii timpului de calcul consumat i al
memoriei afectate?
Iniial tabla este goal, aceast stare de fapt corespunznd strii iniiale. O stare final
corespunde poziiei n care o linie, o coloan sau o diagonal conine trei x-uri:
o o x
x o
x x o
IASE 4/16 Cap. 4. Structuri i strategii de cutare
Drumul de la nodul rdcin la nodul soluie (sau goal) nu este altceva dect seria de
micri ce vor conduce primul juctor la ctigul jocului. Spaiul de stri va conine toate
configuraiile posibile pe care tabla de joc le poate avea. Desigur, dei sunt 39 posibiliti de a
aeza unul din caracterele {blank, x, o} n cele 9 csue, multe dintre acestea nu se pot
produce n cadrul jocului. Aceasta deoarece arcele sunt generate de micrile regulamentare
ale jocului, alternnd ntre plasarea unui x i plasarea unui o ntr-o locaie neutilizat.
Digraful astfel generat nu este un arbore deoarece strile de nivel mai mare sau egal cu trei
pot fi generate n moduri diferite, dar este un digraf aciclic DAG (Directed Acyclic Graph).
n ceea ce privete complexitatea problemei, se poate observa c prima mutare poate fi
aleas din 9 posibile, a doua din 8, .a.m.d. Altfel spus, se vor investiga 9! drumuri n digraful
asociat n vederea gsirii strategiei care s conduc primul juctor la ctig. Mai exact,
juctorul va alege mutarea corespunztoare primului arc al unui drum din starea curent spre
una din strile de ctig.
Dei n acest caz investigarea exhaustiv a celor 9!=362880 de drumuri n graf nu
constituie o problem pentru calculatorul electronic, creterea factorial sau exponenial a
timpului de calculator necesar fac ca aceste metode de cutare exhaustiv s fie aplicabile
doar la problemele de talie relativ redus. n jocul de ah spre exemplu, numrul de stri ceva
de genul 10120 i o astfel de cutare nu s-ar termina practic niciodat.
Exemplul 4.2 Este foarte cunoscut aa numitul joc 15-Puzzle constituit din 15 jetoane
ptrate numerotate de la 1 la 15 dispuse ntr-un chenar, jucat de majoritatea copiilor. Fie,
pentru simplitatea reprezentrii, un joc 8-puzzle:
1 2 3
8 4
7 6 5
generat nu mai este aciclic, o anumit configuraie a dispunerii celor 8 numere putndu-se
repeta n cadrul jocului. Dar, dac n graful generat exist un drum de la starea iniial la cea
de goal atunci exist sigur i un drum elementar ntre cele dou stri. Explornd numai
drumurile elementare riscul ca algoritmul de cutare s pice ntr-un ciclu infinit este exclus.
1 4 3
7 6
5 8 2
1 3 1 4 3 1 4 3 1 4 3
7 4 6 7 6 7 8 6 7 6
5 8 2 5 8 2 5 2 5 8 2
1 3 1 3 4 3 1 4 3 1 4 3 1 4 3 1 4 1 4 3
7 4 6 7 4 6 1 7 6 5 7 6 7 8 6 7 8 6 7 6 3 7 6 2
5 8 2 5 8 2 5 8 2 8 2 5 2 5 2 5 8 2 5 8
n
s0 s jn (sjn este derivabil din s0), n lungimea soluiei.
Exemplu: Problema fermierullupulcapravarza.
F L C V
s/d s/d s/d s/d
s0 s0
s1 s1
s8 s9 s2 s3
s2 s4
s6 s7 s5 s6
s3 s7
s4 s5 s8 s9
procedure DepthFirst
begin
Open [(s0 nil)];
Close [ ];
while Open [ ] do
begin
extract ((s, p), Open) {Extrage primul element al listei Open}
insert ((s, p), Close) {insereaz primul element n lista Close}
if goal (s) then begin
compune_solutia; exit/continue;
end;
t
D {d S | s d , t T}
for d in D do
if ((d, _) Open) ((d, _) Close) then insert ((d,s), Open);
end;
writeln(Problema nu are soluie)
end;
Start
Problem: Goal
12
10 11 1
9 2 3 4
8 7 6 5
Ordinea operatorilor:
Open: {12}
Close: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
IASE 8/16 Cap. 4. Structuri i strategii de cutare
a 1
2
b
5 e 9
i
3 4 6 10 11
j k
c d f
7 8
g h
goal
Open =[ a], Close =[ ] Dx= d, f; % d nu se mai examineaz
Open =[ ], x = a Open =[ f, i],
Dx=b, e, i; x = f, Open =[ i], Close =[ a, b, c, d, e, f],
Close =[ a], Open =[ b, e, i], Dx= g, h;
x = b, Open =[ e, i], Open =[ g, h, i],
Dx=c, d; x = g, Open =[h, i], Close =[ a, b, c, d, e, f, g].
Close =[ a, b], Open =[ c, d, e, i], n lista Close se regsesc perechile (S, P)
x = c, Open =[ d, e, i], Close =[ a, b, c], (Stare, Printe)
x = d, Open =[ e, i], Close =[ a, b, c, d], (b, a), (c, b), (d, b), (e, a), (i, a), (f, e), (g, f).
x = e, Open =[ i], Close =[ a, b, c, d, e], Soluia problemei: aefg.
breadth_first:-
retract(OpenL(S/P)),
assert(CloseL(S/P)),
(goal(S), !, compune_solutia (L), afisare_solutie(L);
generare_succesor(S), breadt_first
).
IASE 10/16 Cap. 4. Structuri i strategii de cutare
0
s
1 2 3 s
Close
4 5 6 7 8 9 10 11 12
d1 d2 d3
13 14
breadth_first:-
write(Problema nu are solutie!), nl.
generare_succesori(S):-
object(R), % Obstacole
( move(S,D,T), not member(D,R), % nu e un obstacol
assertn(D/S),
fail ;
true
).
assertn(D/S):-
(openL(D/_); closeL(D/_)), !
;
assert(openL(D/S)). % assert sau asertz
% cu asserta algoritmul se transforma intr-un algoritm DepthFirst !
afisare_solutia([]).
afisare_solutia([H|T]):- write(H), nl, afisare_solutia(T).
compune_solutia(L):- goal(G), compune_solutia(G,[G],L).
compune_solutia(nil,[H|X],X).
compune_solutia(S,L,X):- closeL(S/P), compune_solutia(P,[P|L],X).
retract elimin din baza de date prima clauz unifiabil cu predicatul citat ca argument;
totodat are loc i instanierea corespunztoare a variabilelor. Dac n baza de date nu exist
nici o clauz unifiabil cu predicatul citat, atunci predicatul retract este inconsistent.
goal(S) testeaz dac starea S este soluie. Dac DA, toate informaiile necesare
construciei soluiei se afl n lista Close.
go:-
start(Start),
goal(Goal),
assert(openL(Start/nil)),
breadth_first([Start/nil], [ ]).
breadth_first([ ], _ ):-
write(Problema nu are solutie!), nl.
breadth_first([S/Cum| Tail0 ], CloseL ):-
( goal(S), !, explica()S/Cum|CloseL]));
(findall(D/T, succesor(S, D, T, Tail0, CloseL),L),
append(Tail0, L, NewOpenL),
breadth_first(NewOpenL, [S/Cum|CloseL]).
succesor ([S, D, C, OpenL, CloseL ):-
object(R),
move(S, D,C),
\+ member(D, R), \+ member(D/_, OpenL), \+ member(D/_, CloseL).
IASE 11/16 Cap. 4. Structuri i strategii de cutare
s s
d1 d2 dk d1 d2 dk
dj
f(dj)=min f(d)
decendenii cu valorile f minimale
Algoritmul Hill Climbing Algoritmul Beam search
Atunci cnd spaiul strilor este foarte mare, acesta nu poate fi memorat sau parcurs
ntr-un timp rezonabil.
Cutarea euristic este incomplet, dar informaional. Avnd n vedere caracterul
incomplet al cutrii, un algoritm de cutare euristic poate conduce la o soluie suboptimal
sau poate chiar eua, n sensul c nu poate determina o soluie. Cu toate acestea, n multe
situaii cutarea euristic constituie singurul mod de rezolvare a unei mod a unei probleme.
Cutarea euristic poate fi:
complet sau incomplet. Cele incomplete pot fi cu 1 descendent (Hill Climbing)
sau cu civa (cei mai buni Beam search);
cu revenire sau fr revenire (Hill Climbing).
Exemplul 1: TICTACTOE
Se consider c maina (calculatorul) joac prima (cu simbolul ), iar juctorul cu
caracterul o. Euristica se definete astfel: unei stri oarecare i se atribuie ca valoare euristic
numrul posibilelor combinaii (linii+coloane+diagonale) ctigtoare ale calculatorului, deci
numrul liniilor/coloanelor/diagonalelor care conin i nu conin simbolul o.
IASE 12/16 Cap. 4. Structuri i strategii de cutare
Maina
Jucatorul A o o
o o o o o o o o
3 4 4 5 5 4 4 4
Exemplul 2: 8 puzzle
h1(s) numrul jetoanelor care nu se gsesc pe poziia corect.
h2(s) suma deplasrilor jetoanelor spre poziia corect.
h1(s) = 8. Starea s
h2(s) = 1+1+3+3+1+1+3+3 = 16. 1 2 3 8 1 6
4 5 6 3 2 7
Notaii i noiuni utilizate 4
7 8 5
PC = (S, T, , , s0, F) problema de
cutare;
Soluia: (ti1, ti2, ..., tin), tik T, k = 1..n;
ti1 ti 2
s0 s j1 L t
s j2 s jn F
i2n
n
s0 s jn , sjn derivabil n n pai din starea s0.
n lungimea soluiei.
Spunem c starea s are adncimea n dac aceasta a fost derivat (generat) printr-o
derivaie de lungime n. n unele situaii este posibil s definim o funcie cost: cost:T R +.
n
n astfel de cazuri: C(s)=cost(ti1, ti2, ..., tin)= cost (tik ) pentru soluia s:
k =1
ti1 ti 2 ti 2 n
s0 s j1 s j 2
L
s jn = s .
Definiia 1: Un algoritm de cutare denumit admisibil dac n orice context garanteaz
gsirea soluiei de cost minim.
Definiia 2: Un algoritm de cutare denumit defensibil dac acesta garanteaz gsirea
soluiei de lungime minim.
Definiia 3: Un algoritm de cutare denumit concesibil dac acesta garanteaz gsirea
unei soluii indiferent dac este minimal sau nu (evident, dac problema are soluie).
Observaie: Dac operatorilor de tranziie nu li s-a asociat un cost, atunci conceptele de
admisibilitate i defensibilitate coincid. n acest caz putem presupune c fiecare operator este
de cost unitar: C(ti)=1, tiT.
IASE 13/16 Cap. 4. Structuri i strategii de cutare
Exemplul 1: 8 puzzle
h(s) numrul pieselor care nu se gsesc n poziia corect (fr a include spaiul liber);
Funcia de evaluare va fi de forma f(s) = g(s) + h(s):
g(s) adncimea sau costul cu care a fost generat starea s;
h(s) estimare euristic a costului soluiei pornind din starea s.
Starea curent Starea final (goal)
2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5
h=5 h=3 h=5
f=6 f=4 f=6
g=1
2 8 3 2 8 3 2 8 3
1 6 4 1 4 1 6 4
7 5 7 6 5 7 5
h=4 h=3 h=3
f=6 f=5 f=5
g=2
2 8 3 2 3 2 8 3
1 4 1 8 4 1 4
7 6 5 7 6 5 7 6 5
h=2 h=4
f=5 f=7
g=3
2 3 2 3
1 8 4 1 8 4
7 6 5 7 6 5
IASE 15/16 Cap. 4. Structuri i strategii de cutare