Documente Academic
Documente Profesional
Documente Cultură
CURS 2
2.4.1 Introducere
Fie s nodul iniţial (numit şi rădăcina grafului). Prin aplicarea tuturor regulilor asupra lui s se
crează toţi descendenţii sau succesorii lui s. Metodele de căutare pe care le vom prezenta vor
permite generarea, plecând din s, a unui graf până când apare un nod acceptabil ca soluţie.
Fiecare nod va avea un pointer către ascendentul său (dintre mai mulţi posibili) care se găseşte
pe cel mai bun drum care duce de la radacina s la nodul în discuţie (vom preciza ulterior ce
înseamnă "cel mai bun"). Pentru succesorii lui n deja prezenţi în listele open sau closed se
pune problema dacă nu e convenabil să se modifice pointerul asociat. Nu este imposibil să se
găsească ulterior un drum mai convenabil de la s către el. Pentru nodurile deja prezente în
lista closed, şi care deci au fost dezvoltaţi anterior, se poate să se decidă modificarea sau nu a
pointerului către succesori.
PROCEDURE
BEGIN
Se iniţializează listele "open list" şi "closed list"; Se pune s în "open list";
REPEAT
BEGIN
IF ("open list" este vidă)
THEN Eşec;
ELSE BEGIN
n:=primul nod al "open list";
transferă nodul n din "open list" în "closed list";
IF (n=soluţia)
THEN Soluţie;
ELSE BEGIN
Se dezvoltă n;
M:=mulţimea succesorilor lui n;
Identificarea elementelor lui M care nu au apărut încă
nici în "open list" şi nici în "closed list";
2.4.1 Introducere
Pentru ilustrare considerăm un exemplu în continuare, în figurile 2.4 şi 2.5:
Nodurile haşurate sunt în list closed, celelalte în lista open. Săgeţile indică dezvoltarea
nodurilor, iar săgeţile conţinutul pointerilor aşa cum s-a descris anterior. Unicul
succesor al nodului n este a deja prezent în lista închisă. Să presupunem că asociem fiecărui
arc un cost unitar; drumul de la a la s generat anterior avea costul 4; noul drum descoperit prin
dezvoltarea lui n nu are decât un cost 2. Pointerul lui a va fi deci dirijat către n. Pe de altă
parte succesorul b al lui a avea poiterul lui către c în măsura în care costul drumului scb (care
este 4) este mai bun decât costul drumului sab (care este 5). Dar deschiderea drumului sna
repune în discuţie alegerea pentru că oferă un cost de numai 3. La fel se judecă şi pentru nodul
d.
s s
n n
c a a
c
b d
b d
Figura 2.5 Exemplu de dezvoltare a unui graf –
Figura 2.4 Exemplu de dezvoltare a unui graf pasul următor celui din figura 2.4
Limită de profunzime
Noduri inacceptabile ca
soluţie
Prin această metodă se asigură găsirea drumului cel mai scurt către soluţie (dacă există) dar cu
preţul dezvoltării unui număr considerabil de noduri. Timpul de calcul şi volumul de memorie
disponibilă devin importante.
2.4.4.1 Definiţii
Cele două strategii anterioare sunt strategii foarte generale care nu utilizează nici o informaţie
specifică (numită euristică) despre domeniul de aplicaţie. În acest fel eficacitatea lor este
limitată. Metoda best - first selecţionează la fiecare pas nodul cel mai promiţător din open list
în funcţie de un criteriu euristic ales corespunzător. Această metodă seamănă cu metoda depth
first, dar cu o deosebire esenţială: o ramură puţin promiţatoare nu este abandonată pentru că
se atinge o profunzime limită (destul de greu de predicţionat) a grafului ci pentru că funcţia
euristică de evaluare se degradează pe măsură ce se înaintează pe această ramură. La un
moment dat o altă ramură devine mai atrăgătoare.
(4) (2)
s s
(5) (5)
Fie f(n) această funcţie reală, euristică de evaluare pentru nodul n (măsoară cât de promiţător
este acest nod). În principiu această funcţie poate fi oricare. Ordonarea nodurilor în open list
dinaintea dezvoltării se face în ordinea crescătoare a valorilor lui f (care este deci asimilată
unui cost). În figura 2.8 se prezintă un exemplu de aplicaţie cu acest tip de strategie. Pentru
fiecare nod, între paranteze, este trecută valoare lui f.
2.4.4.2 Algoritmii A şi A*
Vom alege o funcţie de evaluare particulară: se va estima costul celui mai bun drum (deci
celui de cost minim) care pleacă din nodul rădăcină s şi conduce la nodul soluţie, trecând prin
nodul n. Funcţia nu e definită pentru nodurile pentru care un astfel de drum nu există. În
aceste puncte presupunem că f are valori infinite.
f(n)=g(n)+h(n)
unde:
g(n) este o estimare a costului g* a celui mai bun drum de la s la n, iar
h(n) este o estimare a costului h* a celui mai bun drum de la n la nodul soluţie.
O bună aproximaţie a lui g* este suma costurilor asociate arcelor de-alungul drumului de la s
la n în structura arborescentă generată prin procedura de căutare în graf (graph search). Acest
drum este cel mai bun drum dintre toate drumurile găsite deja până în acest moment prin
aplicarea procedurii. Această valoare g(n) poate, pentru anumite noduri, să descrească, să se
g(n) ≥ g*(n)
Din contră, pentru estimarea h(n) a lui h*(n), trebuie să ne bazăm pe informaţii euristice,
adică specifice domeniului aplicaţiei.
Procedura de căutare în graf care utilizează o astfel de funcţie de evaluare f(n) pentru a ordona
nodurile din open list este numită "algoritm A".
Se observă că dacă pentru un drum costul este chiar lungimea lui, măsurată în număr de
segmente, atunci g(n) ≡ profunzimea nodului n în graf şi h(n) ≡ 0 atunci algoritmul A
corespunde strategiei breadth first.
Se poate arăta că dacă h(n) este un prag inferior lui h*(n), deci dacă:
h(n) ≤ h*(n), ∀ n,
atunci algoritmul A (care se numeşte acum algoritmul A*) furnizează un drum optim către
soluţie.
Cum h(n) ≡ 0 este cu siguranţă un prag cu proprietatea de mai sus demonstraţia va fi în egală
măsură valabilă şi pentru strategia breadth-first (acolo "optimal" va însemna "cel mai scurt").
Fie f*(s) este costul unui drum optimal conducând la soluţie. În orice moment există în open-
list cel puţin un nod care aparţine drumului optimal. Fie n* nodul cel mai apropiat de s dintre
aceste noduri. Avem:
f(n*)=g(n*)+h(n*)
Ştim acum că A* a găsit drumul optimal de la s la n* şi că toţi ascendenţii lui n*, de pe acest
drum, sunt în closed list. Ca urmare:
g(n*)=g*(n*)
şi
f(n*)=g*(n*)+h(n*)
h(n*) ≤ h*(n*)
Deci:
f(n*) ≤ g*(n*) + h*(n*)
Şi
f(n*) ≤ f*(n*).
Dar
f*(n*)=f*(s) pentru că n* şi s aparţin drumului optimal.
f(n*) ≤ f* (s).
Să presupunem prin reducere la absurd că A* termină căutarea într-un nod t soluţie, fără a
găsi drumul optimal.
Avem deci:
Şi deci:
unde n* este un nod al drumului optimal şi care se găseşte obligatoriu în open list. Această
ultimă inecuaţie conduce la o concluzie absurdă pentru că A* ar fi selecţionat mai degrabă pe
n* decât pe t din open list.
Pentru a rezolva problemele complexe care pot fi descompuse într-o mulţime de probleme
mai simple, este interesant să se utilizeze reprezentarea prin grafuri AND/OR (ŞI/SAU). În
grafurile SAU (folosite până acum) nodurile reprezintă diferitele stări ale problemei în timp ce
arcele (direcţionale) indică operatorii care pot fi aplicaţi în fiecare nod. În conformitate cu
filozofia grafurilor SAU se caută un drum, deci o secvenţă de aplicări ale operatorilor, de la o
stare iniţială către o stare finală, care este soluţia. Aceasta semnifică că în fiecare nod
aparţinând respectivului drum, se aplică unul din operatorii disponibili.
P P – Problema iniţială
SPi – Subprobleme mai simple
Arcul ŞI se mai numeşte şi k conector dacă există k descendenţi şi se figurează ca o linie care
conectează componentele sale. Un graf ŞI/SAU este deci un graf SAU generalizat în care se
găsesc k conectori (k ≥ 1), şi nu numai 1 conectori ca în cazul clasic (figura 2.10). Algoritmul
A*, descris anterior, nu convine pentru căutarea soluţiei într-un astfel de graf ŞI/SAU.
Inconvenientul este acela că un arc care pleacă de la un nod la altul nu poate fi considerat
independent de celelalte arce cu care face parcte dintr-un arc ŞI. Pentru a exemplifica această
remarcă vom considera figura 2.11.
a b c
(6) (3) (3)
S
(16)
16
21
a b c
(15) (8) (11)
d e i j k l
(6) (7) (3) (3) (4) (5)
Între paranteze este scrisă valoarea lui h pentru fiecare nod. Atunci când costul pentru fiecare
arc simplu în parte este 1 şi costul unui arc ŞI este suma costurilor componentelor se poate
uşor calcula valoarea corespunzătoare a lui f. Se presupune h monotonă. Pentru A* s-ar fi
selecţionat nodul b pentru că f(b) are doar valoarea 3+1=4, dar în acelaşi timp va trebui
dezvoltat şi nodul c ceea ce va conduce la un cost global de 9. Deci e mai bine să fie dezvoltat
nodul a în ciuda faptului că f(a)=7.
Un alt exemplu este dat în figura 2.12, în care este indicat la nivelul lui s costul celor două
drumuri posibile. Se observă că i şi j trebuie rejectate deşi au valori mici pentru f, funcţia de
evaluare, şi deşi ascendentul lor direct este şi el bine plasat din acest punct de vedere.
(4) (4)
a b c a b c
(2) (1) (1) (5) (1) (1)
S
(5) d e
(6) (4) (5)
(5)
a b c
(5) (2) (1)
(3) (2)
d e i j K
(4) (5) (2) (0) (0)
S
(5)
(6)
(5)
a b c
(5) (2) (1)
(5)
(6) (3) (2)
d e i j K
(4) (5) (2) (0) (0)
Exemplificăm prin figura 2.13, unde conectorii făcând parte din cel mai bun drum sunt
marcaţi cu săgeţi. Fiecare nod are valoarea h corespunzătoare înscrisă între paranteze. O
soluţie pentru această problemă este producţia simultană a stărilor j şi k. În finalul acestei
scurte descrieri a algoritmului AO*, este interesant să arătăm un caz în care drumul către
soluţie nu este optimal: este cazul unor subprobleme interactive, în figura 2.14.
c
Figura 2.14 Exemplu de soluţie AO neoptimală
În exemplul de mai sus se presupune că se poate ajunge la soluţie şi prin a şi prin c. Dacă din
neşansă valoarea lui h din c este întotdeaina inferioară lui h din a, algoritmul se va propaga
prin a şi prin c, când este clar că ar fi suficient să meargă numai prin a.
Dar acest operator, în cele mai multe din cazuri, nu va fi direct aplicat în situaţia curentă,
decât în măsura în care precondiţia lui va fi îndeplinită:
¾ Din alegerea acestui operator se crează deci o subproblemă care constă în a produce
starea unde operatorul este aplicabil.
¾ Pe de altă parte operatorul nu furnizează cu necesitate exact starea finală dorită. Se
crează astfel o a doua subproblemă care constă în trecerea de la starea produsă de operator
(când acesta va fi aplicabil) la starea finală.
Fiecare dintre aceste subprobleme este, dacă operatorul este bine ales, mai simplă decât
problema iniţială. Se aplică acum recursiv metoda "means-end" la fiecare dintre aceste două
subprobleme. Se pot da priorităţi diferite la diferenţele măsurate în timpul aplicării
procedurii, în aşa fel încät să se obţină cele mai mari reduceri.