Sunteți pe pagina 1din 43

Metode de căutare

1. Rezolvarea problemelor prin căutare


2. Căutarea neinformată (oarbă)
3. Căutarea informată (euristică)
1. Algoritmul A*
2. Alți algoritmi
4. Concluzii

49
Căutarea informată (euristică)
 Factorii de ramificare mari sunt o problemă
serioasă
 Este necesară o modalitate de a reduce numărul
de noduri vizitate
 Metodele de căutare euristică încearcă alegerea
„inteligentă” a nodurilor care trebuie expandate

2
Euristică
 εὑρίσκειν = a găsi, εὕρηκα/evrika = am găsit
 O euristică este o metodă care furnizează rapid o
soluție, nu neapărat optimă
 Este o metodă aproximativă, spre deosebire de un
algoritm exact optim
 Deși nu garantează găsirea soluției optime, metodele
euristice găsesc de obicei o soluție acceptabilă și
deseori chiar soluția optimă

3
Metode neinformate vs.
metode informate
 Metodele neinformate (oarbe)
 Nu exploatează semnificațiile stărilor pentru a ordona
nodurile din frontieră
 Exploatează doar pozițiile nodurilor în arbore
 Tratează toate problemele la fel
 Metodele informate (euristice)
 Ordonează nodurile frontierei în funcție de semnificațiile
stărilor
 Cele mai promițătoare noduri sunt plasate la începutul
frontierei
 Utilizează cunoștințe specifice fiecărei probleme

4
Căutarea best-first
 Evaluează cât de bun (promițător) este un nod
 Utilizează o funcție de evaluare f care atribuie
fiecărui nod n un număr real f(n)  0
 f(n) este un cost estimat
 Cu cât este mai mic f(n), cu atât este mai bun nodul n
 Căutarea best-first sortează frontiera în ordinea
crescătoare a lui f
 Pentru f egale, se poate decide în mod aleatoriu

5
Definirea lui f
 Funcții utilizate în general
 g(n) este costul căii de la nodul inițial la n
 Este cunoscută
 h(n) este estimarea costului căii de la n la nodul scop
 Este o estimare euristică
 Căutarea de cost uniform (neinformată)
 f(n) = g(n)
 Căutarea greedy
 f(n) = h(n)
 Căutarea A*
 f(n) = g(n) + h(n)
 Reunește ideile căutărilor de cost uniform și greedy
 Problema principală: găsirea celei mai bune funcții h
6
Exemplu: căutarea greedy
(Arad – București)

7
Căutarea greedy
 Iași – Făgăraș: prin Piatra Neamț
 Dacă se permite revizitarea stărilor, apare o buclă infinită

9
Caracteristicile căutării greedy
 Nu este optimă
 Nu este completă

10
Calitatea căutării este dată de h
 Când h = costul până la scop
 Sunt expandate doar nodurile de pe calea corectă
 Se găsește soluția optimă

 Când h < costul până la scop


 Sunt expandate noduri suplimentare
 Se găsește soluția optimă

 Când h > costul până la scop


 Se poate găsi o soluție suboptimă

11
Euristici admisibile
 Fie h*(n) costul căii optime de la n la nodul scop
 Funcția euristică h(n) este admisibilă dacă:
0  h(n)  h*(n)
 Dacă G este scopul, atunci h(G) = 0
 O funcție euristică admisibilă este întotdeauna
optimistă (niciodată nu supraestimează)

12
Căutarea A*
 f(n) = g(n) + h(n), unde:
 g(n) = costul celei mai bune căi găsite până la n
 h(n) = o funcție euristică admisibilă
 Presupunem că: p, c,  : cost(p, c)   > 0
 Între două noduri diferite există întotdeauna un cost pozitiv
 Căile infinite au cost infinit
 Folosește două liste: lista deschisă și lista închisă
 Mulțimea nodurilor din lista deschisă reprezintă frontiera,
iar cele din lista închisă, nodurile deja vizitate

13
Greedy vs. A*
 f(n) = g(n) + h(n)

 f(B) = 15 + 20 + 30 = 65
 f(C) = 15 +10 + 35 = 60

 Greedy alege nodul B


(h = 30)
 A* alege nodul C
(f = 60)

14
Structuri de date

15
Structuri de date

16
Pseudocod A* simplificat

17
Pseudocod A* optimizat

18
Pseudocod A* optimizat

19
Important: Algoritmul A* nu
expandează nodurile arborelui în
mod greedy, ci după valorile
funcției f ale nodurilor din lista
deschisă. Deoarece aceasta este
o listă de priorități, căutarea
poate „sări” dintr-un subarbore
în altul, de exemplu, Râmnicu
Vâlcea – Făgăraș. A se vedea și
exemplul următor.

20
Revizitarea stărilor
 Euristica h este
c=1 2 admisibilă
h = 100 1

2 Pentru acest exemplu,


1 
90 euristica ar putea fi distanța
în linie dreaptă, iar nodul cu
100 h = 1 ar putea fi lângă scop,
dar despărțit de acesta de
0 un obstacol

21
Revizitarea stărilor
c=1 2

f = 1+100 2+1
h = 100 1

2
1
90 4+90

100
?
0 104

Dacă eliminăm acest nod, algoritmul


expandează nodul scop vecin și
returnează o soluție suboptimă
22
Revizitarea stărilor

1 2

1+100 2+1
100 1

2
1
90 2+90 4+90

100

0 102 104

Dacă nu eliminăm nodurile care revizitează


stările, căutarea se termină cu soluția optimă

23
Cum funcționează A*
Iterația 1
A open list: A (0+0:0)
1 closed list:
2 expand A (0+0:0)
successor(A): B (1+100:101)
add to open list: B (1+100:101)
100 B C 1
successor(A): C (2+1:3)
add to open list: C (2+1:3)
2
1 add to closed list: A (0+0:0)
D. 90
Iterația 2
open list: C (2+1:3) B (1+100:101)
100 closed list: A (0+0:0)
expand C (2+1:3)
successor(C): A (4+0:4)
E. 0 skip: parent pruning
successor(C): D (4+90:94)
add to open list: D (4+90:94)
add to closed list: C (2+1:3)

24
Cum funcționează A*
Iterația 3
A open list: D (4+90:94) B (1+100:101)
1 closed list: A (0+0:0) C (2+1:3)
2 expand D (4+90:94)
successor(D): B (5+100:105)
skip: lower G in open list
100 B C 1
successor(D): C (6+1:7)
skip: parent pruning
2
1 successor(D): E (104+0:104)
D. 90 add to open list: E (104+0:104)
add to closed list: D (4+90:94)

100 Iterația 4
open list: B (1+100:101) E (104+0:104)
closed list: A (0+0:0) C (2+1:3) D (4+90:94)
E. 0 expand B (1+100:101)
successor(B): A (2+0:2)
skip: parent pruning
successor(B): D (2+90:92)
add to open list: D (2+90:92)
add to closed list: B (1+100:101)
25
Cum funcționează A*
Iterația 5
A open list: D (2+90:92) E (104+0:104)
1 closed list: A (0+0:0) C (2+1:3) D (4+90:94) B (1+100:101)
2 expand D (2+90:92)
successor(D): B (3+100:103)
skip: parent pruning
100 B C 1
successor(D): C (4+1:5)
skip: lower G in closed list (& parent pruning)
2
1 successor(D): E (102+0:102)
D. 90 add to open list: E (102+0:102)
replace in closed list: D (2+90:92)

100 Iterația 6
open list: E (102+0:102) E (104+0:104)
closed list: A (0+0:0) C (2+1:3) D (2+90:92) B (1+100:101)
E. 0 expand E (102+0:102)
solution: A - B - D - E

26
Euristici monotone
p
 O euristică h este monotonă cost(p,c)
(sau consistentă) dacă:
 p un nod și c un fiu al lui p: c h(p)

h(p)  cost(p, c) + h(c) h(c)


 O euristică monotonă este și
admisibilă (inegalitatea în triunghi)

 O euristică monotonă devine din ce în ce mai precisă


cu cât înaintează în adâncimea arborelui de căutare
 În multe cazuri (dar nu întotdeauna), monotonia
euristicii accelerează găsirea soluției, deoarece
nodurile închise nu mai sunt redeschise
27
A
1 2

Ecuația pathmax 100 B C 1

2
1
 Ecuația pathmax: la generarea unui nod fiu c al lui p D. 90
 f(c) = max( f(p), g(c) + h(c) ) 100
 În exemplul anterior: nodul D
E. 0
 f(D) = max( f(C), g(D) + h(D) ) = max(3, 94) = 94
 f(D) = max( f(B), g(D) + h(D) ) = max(101, 92) = 101
 Ecuația pathmax face ca valorile lui f să fie monoton
nedescrescătoare pe căile traversate din arborele de căutare
 Dacă există mai multe căi prin care se poate ajunge la scop,
valorile f pot rămâne nemonotone pentru căile netraversate încă

28
Exemplul anterior: comparație
A
1 2

100 B C 1

2
1
D. 90
Fără pathmax Cu pathmax
Iterația 4
100
Iterația 4
open list: B (1+100:101) E (104+0:104) open list: B (1+100:101) E (104+0:104)
closed list: A (0+0:0) C (2+1:3) D (4+90:94)
E. 0 closed list: A (0+0:0) C (2+1:3) D (4+90:94)
expand B (1+100:101) expand B (1+100:101)
successor(B): A (2+0:2) successor(B): A (2+0:101)
skip: parent pruning skip: parent pruning
successor(B): D (2+90:92) successor(B): D (2+90:101)
add to open list: D (2+90:92) add to open list: D (2+90:101)
add to closed list: B (1+100:101) add to closed list: B (1+100:101)

29
Efectul euristicilor monotone

30
Proprietăți
 A* este complet și optim dacă nodurile care
revizitează stările nu sunt eliminate
 Timp: calitatea euristicii h scade timpul necesar
 Cazul cel mai favorabil: h este perfectă, O(d)
 Cazul cel mai defavorabil: h = 0, O(bd) ~ BFS

 Spațiu
 Cazul cel mai defavorabil: O(nS), unde nS este numărul de
stări

31
Cazul cel mai defavorabil
 Exemplu de caz cel mai defavorabil pentru A* cu
euristici inconsistente: familia Martelli – G5
 O(2n) expandări de noduri pentru găsirea soluției pentru
calea de la n5 la n0

În noduri: h()
Pe arce: cost()

32
 După expandarea lui n5 (fără pathmax), lista deschisă este:
n1 (11+0), n2 (9+3), n3 (6+7), n4 (1+13)
 Înainte de găsirea soluției, lista deschisă este: n0 (23+0), n0 (24+0),
n0 (26+0), n0 (27+0), n0 (28+0), n0 (29+0), n0 (30+0)
 Soluția: n5 - n4 - n3 - n2 - n1 - n0 , 17 noduri expandate
 Cu pathmax, după expandarea lui n5, lista deschisă este:
n1 (11+0:23), n2 (9+3:23), n3 (6+7:23), n4 (1+13:23)
 Dacă ordinea în care sunt adăugați în listă succesorii este cea mai
favorabilă (n4, n3, n2, n1), soluția este găsită doar cu 6 noduri
expandate
*2011_Felner - Inconsistent heuristics in theory and practice.pdf
33
Optimizări
 Optimizarea listelor
 Căutarea celui mai bun nod, de fiecare dată, este ineficientă
 Lista deschisă trebuie să fie o listă sortată sau un arbore heap*
 Lista închisă poate fi un tabel de hash (hashtable**)
 Optimizarea spațiului de căutare
 Cel mai simplu caz: parent pruning – evitarea expandării ca succesor a
părintelui unui nod, prin care s-ar reveni în starea imediat anterioară
 Dacă se ignoră succesorii care au o stare deja vizitată, nu se mai
garantează optimalitatea algoritmului
* Un heap este un arbore “binar” complet care are proprietarea că valoarea fiecărui vârf este mai mare sau egală cu valoarea
fiecărui fiu al său.
** Tabela hash este o structură de date prin care valorile cu care lucrăm sunt transformate în valori numerice dintr-un interval
numeric stabilit printr-un algoritm unidirecțional, numit funcție de dispersie, și adăugate într-o structură de date care de regulă
are dimensiuni mici și care este identificată prin valoarea funcției de dispersie. Astfel, mulțimea valorilor este partiționată astfel
încât toate valorile dintr-o submulțime a partiției dau aceiași valoare prin funcția de dispersie. 34
Optimizări
 Aplicarea pe grid, de exemplu pentru jocuri, este costisitoare.
Factorul de ramificare este mare: 4, 8 sau 6 pentru grid
hexagonal. Există foarte multe stări dacă gridul este mare
 Multe căi au aceeași lungime. A* le poate explora pe toate.
Când valorile f sunt egale, se compară după valorile h
 Altă metodă pentru departajare: se preferă căile apropiate de
linia dreaptă între starea inițială și starea scop
 h poate fi mărită puțin, devenind neadmisibilă. Dacă funcția
rezultată h’ supraestimează rareori funcția h* cu o valoare mai
mare decât v, atunci algoritmul va găsi rareori o soluție al cărei
cost este mai mare cu v decât costul optim

35
Algoritmul HPA*
 A* ierarhic cvasi-optim (Near-Optimal Hierarchical
Pathfinding) - Botea_Near Optimal Hierarchical Path-Finding.pdf
 HPA* (Hierarchical Path-Finding A*) = abordare ierarhică pentru
reducerea complexității problemelor de căutare a traseelor pe hărți
bazate pe grile
 tehnica abstractizează o hartă în clustere locale legate între ele
 la nivel local, distanțele optime pentru traversarea fiecărui cluster sunt
calculate în prealabil și stocate în memoria cache
 la nivel global, clusterele sunt traversate într-un singur pas mare

36
Algoritmul IDA*
 Căutarea iterativă în adâncime A* (Iterative
Deepening A*)
 Principiu similar cu acela al căutării iterative în
adâncime (neinformate)
 În loc de niveluri în arbore, se folosesc contururi de
cost ale funcției f
 În cadrul unui contur, se face o căutare în adâncime

37
Algoritmul MM
 Algoritm euristic bidirecțional în care căutările se întâlnesc
garantat la mijloc (Bidirectional Search that Is Guaranteed
to Meet in the Middle)
 Algoritmul face două căutări similare cu A* din starea
inițială, respectiv finală, deschizând la un moment dat
nodul cu prioritatea cea mai mică din cele două cozi
 Prioritatea este definită drept: pr(n) = max(f(n), 2g(n))
 Termenul 2g împiedică nodurile să se depărteze foarte
mult de starea inițială, favorizând intersectarea la mijlocul
distanței

38
Crearea de euristici
 O euristică admisibilă poate fi costul soluției optime a
unei probleme relaxate prin eliminarea
constrângerilor
 De exemplu, pentru navigare:
 Distanța Manhattan* corespunde
eliminării obstacolelor
 Distanța euclidiană corespunde
eliminării obstacolelor și a
constrângerilor de mișcare pe grid

* https://ro.wikipedia.org/wiki/Distan%C8%9B%C4%83_Manhattan
39
Euristici pentru 8-puzzle
1 2 3
Starea
curentă 4 5 6
7 8 11 22 33
Numărul de căsuțe
diferite (fără a 44 55 66
include spațiul) 1 2 3
Starea
77 8 8
scop
4 5 6
7 8
N N N
Doar 8 este plasat diferit, deci funcția
euristică este evaluată la 1 N N N
Euristica ne spune că o soluție ar putea fi N D
găsită în (cel puțin) o mutare: h(scrt) = 1

40
Euristici pentru 8-puzzle
3 2 8 3 3
Starea
curentă 4 5 6 2 spații
Distanța 7 1
Manhattan (fără
a include spațiul) 8
1 2 3
Starea 3 spații
scop
4 5 6
8
7 8
1
Doar căsuțele 3, 8 și 1 sunt plasate greșit, deci
funcția euristică întoarce 8 3 spații
Euristica ne spune că o soluție ar putea fi 1
găsită în cel puțin 8 mutări: h(scrt) = 8
Total 8
41
Modalități suplimentare de
alegere a funcției euristice
 Abordarea maximă, cu m euristici diferite
 h(n) = max( h1(n), … , hm(n) )
 Abordarea statistică
 De exemplu, dacă în 90% din cazuri când h(n) = 14,
h*(n) = 18, atunci când valoarea lui h(n) este 14,
returnăm 18
 Complexitatea euristicii nu trebuie să afecteze
eficiența căutării

42
Concluzii
 Metodele neinformate nu utilizează cunoștințe
specifice fiecărei probleme și deci tratează toate
problemele la fel
 Metodele informate sau euristice utilizează cunoștințe
specifice fiecărei probleme și expandează mai întâi
cele mai promițătoare noduri
 Funcțiile euristice care direcționează căutarea pot fi
construite prin simplificarea problemei inițiale, adică
eliminarea unor constrângeri

43

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