Sunteți pe pagina 1din 97

Inteligenţă artificială

Lector Doctor Lucian Sasu

2008-2009
Universitatea Transilvania din Braşov
Facultatea de Matematică şi Informatică
2
Cuprins

1 Definiţii. Rezolvarea problemelor prin căutare 7


1.1 Definiţii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1 Sisteme care acţioneaza precum oamenii . . . . . . . . . . . . . . . 7
1.1.2 Sisteme care gândesc ca oamenii . . . . . . . . . . . . . . . . . . . . 8
1.1.3 Sisteme care gândesc raţional . . . . . . . . . . . . . . . . . . . . . 8
1.1.4 Sisteme care acţionează raţional . . . . . . . . . . . . . . . . . . . . 9
1.2 Fundamentele inteligenţei artificiale . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Starea actuală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Rezolvarea de probleme de către agenţi . . . . . . . . . . . . . . . . . . . . 10
1.5 Formularea unei probleme de căutare . . . . . . . . . . . . . . . . . . . . . 11
1.6 Exemple de probleme de căutare . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.1 Probleme “de jucărie” . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.2 Probleme “din lumea reală” . . . . . . . . . . . . . . . . . . . . . . 13
1.7 Căutarea soluţiei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.8 Măsurarea performanţelor algoritmilor de căutare . . . . . . . . . . . . . . 18

2 Strategii de căutare neinformată 19


2.1 Căutarea “mai ı̂ntâi ı̂n lăţime” . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Căutarea după costul uniform . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3 Căutarea “mai ı̂ntâi ı̂n adâncime” . . . . . . . . . . . . . . . . . . . . . . . 22
2.4 Căutarea cu adâncime limitată . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5 Căutarea “mai ı̂ntâi ı̂n adâncime” cu adâncire iterativă . . . . . . . . . . . 25
2.6 Căutare bidirecţională . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 Problema stărilor duplicat . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3 Căutare informată 31
3.1 Strategii de căutare informată . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Căutarea euristică lacomă . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3 Algoritmul A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3
4 CUPRINS

3.4 Variaţii ale lui A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40


3.5 Funcţii euristice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6 Algoritmi de căutare locală şi probleme de optimizare . . . . . . . . . . . . 43
3.6.1 Căutarea prin metoda ascensiunii . . . . . . . . . . . . . . . . . . . 44
3.6.2 Recoacerea simulată . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.6.3 Algoritmi genetici . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.6.4 Căutare locală ı̂n spaţii continue . . . . . . . . . . . . . . . . . . . . 52

4 Probleme de satisfacere a constrângerilor 53


4.1 Probleme de satisfacere a constrângerilor . . . . . . . . . . . . . . . . . . . 53
4.2 Căutare backtracking pentru PSC . . . . . . . . . . . . . . . . . . . . . . . 56
4.2.1 Ordonarea valorilor şi a variabilelor . . . . . . . . . . . . . . . . . . 57
4.2.2 Propagarea informaţiilor prin constrângeri . . . . . . . . . . . . . . 58
4.3 Căutare locală pentru PSC . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4 Structura problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5 Agenţi logici 67
5.1 Motivaţie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.2 Agenţi bazaţi pe cunoaştere . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.3 Jocul "lumea monstrului . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.4 Logica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.5 Logica propoziţională . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.1 Sintaxa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.5.2 Semantica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5.3 Exemplu: lumea monstrului ı̂n logica propoziţională . . . . . . . . . 73
5.5.4 Inferenţa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.5.5 Echivalenţă, validitate şi satisfiabilitate . . . . . . . . . . . . . . . . 74
5.6 Tipare de raţionament ı̂n logica propoziţională . . . . . . . . . . . . . . . . 75
5.6.1 Rezoluţia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.7 Forma normală conjunctivă . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.8 Algoritmul de rezoluţie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.9 Înlănţuirea ı̂nainte şi ı̂napoi . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.10 Inferenţă propoziţională efectivă . . . . . . . . . . . . . . . . . . . . . . . . 82
5.10.1 Algoritm bazat pe backtracking . . . . . . . . . . . . . . . . . . . . 82
5.10.2 Algoritm bazat pe căutare locală . . . . . . . . . . . . . . . . . . . 87

6 Logica de ordinul ı̂ntâi 89


6.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
CUPRINS 5

6.2 Sintaxa şi semantica logicii de ordinul ı̂ntâi . . . . . . . . . . . . . . . . . . 90


6.2.1 Modele pentru logica de ordinul ı̂ntâi . . . . . . . . . . . . . . . . . 90
6.2.2 Simboluri şi interpretări . . . . . . . . . . . . . . . . . . . . . . . . 91
6.2.3 Termeni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.2.4 Propoziţii atomice . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.2.5 Enunţuri complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.2.6 Cuantificatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.3 Procesul de management al cunoştinţelor . . . . . . . . . . . . . . . . . . . 93
6.4 Inferenţa propoziţională comparată cu inferenţa de ordinul ı̂ntâi . . . . . . 94
6.4.1 Reguli de inferenţă pentru cuantificatori . . . . . . . . . . . . . . . 95
6.4.2 Reducerea la inferenţa propoziţională . . . . . . . . . . . . . . . . . 95
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6 CUPRINS
Capitolul 1

Definiţii. Rezolvarea problemelor prin


căutare

1.1 Definiţii
Dăm câteva definiţii care au fost formulate de-a lungul timpului ı̂n diverse lucrări,
precum şi comentarii asupra lor. Există patru tipuri de abordări pentru sistemele cu
inteligenţă artificială: sisteme care gândesc precum oamenii, sisteme care gândesc raţional,
sisteme care acţionează precum oamenii, sisteme care acţionează raţional. Remarcăm că
există o diferenţă ı̂ntre a acţiona ca un om şi a acţiona raţional; deşi inteligenţa umană
şi raţionalitatea nu sunt disjuncte, acţiunile oamenilor nu sunt ı̂ntotdeauna ı̂nscrise ı̂n
totalitate ı̂n legile raţiunii.

1.1.1 Sisteme care acţioneaza precum oamenii


Definiţia 1 Arta creării de maşini care ı̂ndeplinesc funcţii ce necesită inteligenţă atunci
când sunt ı̂ndeplinite de către oameni.

Definiţia 2 Studiul asupra cum se poate ca un calculator să facă lucruri la care, pentru
moment, oamenii sunt mai buni.

Testul Turing, propus de către Alan Turing ı̂n 1950 a fost conceput pentru a da o
definiţie operaţională a inteligenţei. Testul care trebuie trecut de către un sistem inteligent
constă ı̂n a pune un om ı̂n imposibilitate de a decide dacă interlocutorul (sistemul artificial)
este om sau nu.
Deducem că un asemenea sistem ar trebui să posede următoarele abilităţi:

1. procesarea limbajului natural - pentru a putea comunica ı̂ntr-o limbă folosită de


oameni

7
8 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

2. reprezentarea cunoştinţelor - pentru a stoca ceea ce se ştie sau află

3. raţionamentul automat - pentru a putea deduce noi concluzii pe baza informaţiilor


acumulate şi pentru a răspunde ı̂ntrebărilor

4. ı̂nvăţarea automată - pentru a se adapta noilor condiţii, pentru a detecta modele


sau şabloane (pattern-uri).

Testul de mai sus nu presupune un contact direct ı̂ntre om şi sistemul artificial. Dacă
acest lucru este dorit, atunci mai e nevoie de:

1. vedere artificială (engl: computer vision) - pentru perceperea vizuală a obiectelor

2. robotică - pentru a manipula obiecte

Cu toate că testul Turing nu a fost ı̂ncă trecut, există interes destul de scăzut din
partea cercetătorilor ı̂n această direcţie; există opinia că e mai important a se studia
principiile care stau la baza inteligenţei decât să se duplice un exemplar.

1.1.2 Sisteme care gândesc ca oamenii


Definiţia 3 Efortul provocator de a face calculatoarele să gândească [. . . ] maşini cu
minte, ı̂n sens literal.

Definiţia 4 [Automatizarea] activităţilor pe care le asociem cu gândirea umană, activităţi


precum luarea deciziilor, rezolvarea problemelor, ı̂nvăţarea[. . . ]

Pentru a putea spune că un program gândeşte precum un om, ar trebui să ştim cum
anume gândesc oamenii - problemă deloc simplă. Sunt două moduri: prin introspecţie şi
prin experimente psihologice.

1.1.3 Sisteme care gândesc raţional


Definiţia 5 Studiul facultăţilor mentale pe baza utilizării modelelor computaţionale.

Definiţia 6 Studiul calculelor care fac posibile percepţia, raţionamentul, acţionarea.

Această abordare se bazează pe maturizarea domeniului numit “logică” ı̂n secolul


al 19-lea – introducerea de notaţii şi silogisme care permit redactarea unor enunţuri şi
relaţii ı̂ntre diferite obiecte. Există ı̂nsă probleme la trecerea din teorie la practică: de
exemplu, ce se ı̂ntamplă cu situaţiile ı̂n care există incertitudine? apoi, există diferenţe
ı̂ntre a rezolva o problemă “ı̂n principiu” (teoretic) şi a o rezolva ı̂n practică - resursele
computaţionale necesare pot fi prohibitive chiar pentru probleme de dimensiuni modeste
- a se vedea de exemplu algoritmii şi discuţiile captolul 2.
1.2. FUNDAMENTELE INTELIGENŢEI ARTIFICIALE 9

1.1.4 Sisteme care acţionează raţional


Definiţia 7 Inteligenţa computaţională este studiul design-ului agenţilor inteligenţi.

Definiţia 8 IA [. . . ] se preocupă de comportamentul inteligent ı̂n artifacte.

Pe această direcţie se introduce de obicei conceptul de agent - un sistem artificial, care


spre deosebire de programele obişnuite acţionează autonom, percep mediul, persistă pe
o perioadă mai mare de timp, se adaptează la schimbări şi care urmăresc un scop. Un
agent raţional este unul care acţionează pentru a obţine cel mai bun rezultat, sau, acolo
unde există incertitudinea, cel mai bun rezultat mediu.
Nu toate acţiunile unui astfel de agent sunt neapărat raţionale; există cazuri ı̂n care se
ştie că nu există nici o acţiune raţională, dar totuşi se decide a se acţiona cumva. Astfel,
inferenţele corecte sunt doar o parte a acţiunii raţionale.

1.2 Fundamentele inteligenţei artificiale


Prezentăm succint o listă a disciplinelor care au contribuie la dezvoltarea IA:

1. Filozofie - intervine cu ı̂ntrebări şi discuţii despre:

• Pot fi regulile formale folosite pentru a extrage concluzii valide?


• Cum se creează activitatea mentală plecând de la creier?
• De unde vine cunoaşterea?
• Cum duce cunoaşterea la acţiune?

2. Matematica - tratează problemele:

• Care sunt regulile formale pentru a extrage concluzii valide?


• Ce poate fi calculat?
• Cum raţionăm plecând de la informaţii nesigure?

3. Ştiinţele economice - preocupate de:

• Cum ar trebui să decidem astfel ı̂ncât să maximizăm câştigul?


• Cum ar trebui să decidem atunci când câştigul este pe termen lung?

4. Neuroştiinţa care ı̂ncearcă să răspundă la “Cum procesează creierul informaţia?”

5. Psihologia - cum gândesc şi acţionează animalele?

6. Ingineria calculatoarelor - cum putem crea un calculator eficient?

7. Lingvistică - cum este legat limbajul de gândire?


10 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

1.3 Starea actuală


Unde este de folos IA? O listă neexhaustivă este dată mai jos:

• planificare autonomă - folosită de exemplu ı̂n navetele lansate spre Marte

• jocuri - supercalculatorul Deep Blue de la IBM a fost folosit pentru rularea unui
program specializat ı̂n jocul de şah, ı̂nvingându-l pe camionul mondial, Garry Kas-
parov

• control autonom - folosit pentru a conduce o maşină de-a lungul SUA, realizând o
conducere autonomă pentru 98% din perioada totală.

• diagnostic - diagnostic medical bazat pe sisteme expert

• robotică - se folosesc roboţi asistenţi ı̂n microchirurgie, implant de proteze.

• ı̂nţelegerea limbajului şi rezolvarea problemelor - rezolvare de cuvinte ı̂ncrucişate.

1.4 Rezolvarea de probleme de către agenţi


Să presupunem că un agent inteligent are de rezolvat o problemă: cum anume se
poate ajunge din Arad ı̂n Bucureşti (figura 1.4 este o hartă simplificată a României),
folosind drept căi de comunicaţie şoselele din România. Vom considera faptul că se cunosc
distanţele existente ı̂ntre câteva perechi de oraşe (cele care sunt direct legate) şi că se pot
schiţa câteva scenarii de drum pe baza cărora să aleagă o soluţie. Ca rezultat se va obţine
o secvenţă de acţiuni a căror ı̂ndeplinire duce la rezolvarea problemei.
Paşii care trebuie urmaţi ı̂n rezolvarea unei probleme de căutare sunt:

1. formularea problemei - ı̂n secţiunea 1.5 se arată modul ı̂n care poate fi exprimată o
problemă de căutare;

2. căutarea soluţiei - aici se folosesc algoritmi decăutare specifici, având ca rezultat


returnarea unei singure soluţii;

3. executarea - pe baza soluţiei ce explicitează acţiunile ce trebuie executate ı̂n vederea


rezolvării problemei se implementeaza faza de execuţie. După ce se atinge scopul
problemei, se poate formula un nou scop.
1.5. FORMULAREA UNEI PROBLEME DE CĂUTARE 11

Figura 1.1: O hartă simplificată a României[1]

1.5 Formularea unei probleme de căutare


O problemă de căutare poate fi abstractizată precum mai jos, prin intermediul a patru
atribute.

1. Starea iniţială - starea din care se porneşte căutarea; de exemplu, pentru problema
drumului de la Arad la Bucureşti starea iniţială este In(Arad).

2. O descriere a acţiunilor pe care le poate ı̂ndeplini agentul. Acestea se pot formaliza


sub forma de operatori sau a unei funcţii succesor ce se aplică pe mulţimea stărilor
şi produce ca rezultat o mulţime de perechi de forma (acţiune, stare):

x → f unctie − succesor(x) = {(actiune1 , stare1 ), . . . , (actiunen , staren )}

unde actiunei este o acţiune ce se poate aplica ı̂n starea x, iar starei este starea ı̂n
care se ajunge din x aplicând actiunei .

Pentru problema exemplificată putem avea de exemplu:

f unctie − succesor(In(Arad)) = {(Go(Sibiu), In(Sibiu)),


(Go(T imisoara), In(T imisoara)),
(Go(Zerind), In(Zerind))}

Starea iniţială şi funcţia succesor determină spaţiul stărilor problemei - al acelor stări
care sunt accesibile din starea iniţială. O cale ı̂n spaţiul stărilor este o secvenţă de
stări conectate printr-o secvenţă de acţiuni.
12 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

3. Testul de scop - determină dacă o stare este stare scop, adică o stare ı̂n care problema
se consideră a fi rezolvată. Verificarea atingerii scopului se poate face ı̂n două
moduri:

(a) prin compararea stării curente cu mulţimea stărilor scop, enunţată explicit; de
exemplu, pentru problema de mai sus mulţimea stărilor scop este In{Bucuresti}.

(b) prin verificarea unor proprietăţi pe care trebuie să le ı̂ndeplinească starea pen-
tru a fi considerată stare scop; de exemplu, pentru jocul de şah stare scop este
aceea ı̂n care regele este atacat şi nu se mai poate misca fără a fi atacat.

4. O funcţie de cost a căii care asignează o valoare numerică fiecărei căi. Funcţia
serveşte ca măsură a performanţei succesiunii de acţiuni (a soluţiei); vom presupune
că costul unei căi este dat de suma costurilor acţiunilor conţinute, iar costul unei
acţiuni este o cantitate nenegativă.

O soluţie este o succesiune de acţiuni care permite agentului rezolvarea problemei, iar
o soluţie optimă este una ı̂n care costul soluţiei este minim posibil.

1.6 Exemple de probleme de căutare

1.6.1 Probleme “de jucărie”


Sunt folosite ı̂n special pentru demonstrarea conceptelor, având scop didactic.

1. Problema puzzle-ului: se dă o matrice de n linii şi tot atâtea coloane; ı̂n fiecare
celulă se află un singur număr de la 1 la n2 − 1, nu există două celule care să conţină
acelaşi număr, iar una din celule este goală. Pentru cazul n = 3 avem exemplificare
ı̂n figura 1.2(a). Se cere ca prin mutări succesive pe orizontală şi pe verticală ale
numerelor ı̂n locul spaţiului gol să se ajungă la o configuraţie finală, de exemplu ı̂n
care numerele sunt ordonate (citirea se face linie cu linie), iar spaţiul este pe ultima
poziţie.

(a) Starea (b) Starea


iniţială scop

Figura 1.2: Problema puzzle-ului pentru n = 3


1.6. EXEMPLE DE PROBLEME DE CĂUTARE 13

Starea iniţială este dispunerea dată; funcţia succesor generează toate miscările prin
care spaţiul alb este mutat ı̂n cadrul matricei, pe verticală sau orizontală, cu cate
o sigură poziţie; testul de scop este verificarea faptului că o stare coincide cu cea
aleasă drept finală; costul căii este egal cu numărul de mutări efectuate, deoarece se
poate considera că fiecare mutare are costul egal cu 1.

2. Problema reginelor pe tabla de şah: dându-se o tablă de şah de n linii şi tot atâtea
coloane, să se determine o poziţionare a reginelor astfel ı̂ncât să nu se atace reciproc.
Starea iniţială este cea ı̂n care tabla este goală; funcţia succesor este “adaugă o regină

Tabela 1.1: Problema dispunerii reginelor pe o tablă de 5x5

,
,
,
,
,

ı̂ntr-o celulă goală” (dar se pot găsi şi alte formulări mai inspirate); o stare scop este
aceea ı̂n care reginele nu se atacă reciproc.

1.6.2 Probleme “din lumea reală”


1. Problema determinării rutei: acest tip de problemă apare ı̂ntr-o varietate de aplicaţii,
precum crearea unui itinerar bazat pe zboruri cu avionul, planificarea operaţiilor mi-
litare, rutare ı̂n reţele de calculatoare, etc. Complexitatea acestor probleme provine
din multitudinea de factori ce trebuie luaţi ı̂n considerare. De exemplu, pentru
problema găsirii unui itinerar pe cale aeriană, specificaţiile ar putea fi:

• fiecare stare este reprezentată de o locaţie (un aeroport) şi momentul curent;
• starea iniţială: locul şi momentul plecării;
• funcţie succesor: dependentă de lista zborurilor care sunt programate dintr-o
anumită locaţie, la un moment ulterior;
• testul scop: se poate ajunge la destinaţie ı̂ntr-o perioadă de timp specifi-
cată/până la un moment maxim specificat?
• costul căii: depinde de costul biletelor ce trebuie achiziţionate, timpul de
aşteptare, durata totală a călătoriei, calitatea locurilor, tipul serviciului, modul
de rezolvare a ı̂mbarcării şi tranzitului, tipul avionului, etc
14 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

Trebuie ı̂nsă considerate posibilităţile (şi probabilităţile) de apariţie a unor eveni-


mente nedorite precum anularea/ı̂ntârzierea unor zboruri. Un bun planificator va
considera mai multe variante, va veni cu alternative şi soluţii de rezervă, ı̂mpreună
cu costurile suplimentare.

2. Problema comis-voiajorului - o persoană trebuie să facă un tur al unei mulţimi de


oraşe, fără a trece de două ori prin acelaşi loc, cu revenire ı̂n locaţia iniţială şi cu un
cost al drumului minim (ciclu Hamiltonian de cost minim). Se cunoaşte faptul că
problema este NP-completă, dar există foarte multe studii care ı̂ncearcă să rezolve
problema cât mai eficient, eventual cu sacrificarea optimalităţii soluţiei.

3. Dispunerea circuitelor VLSI1 , unde pe o plăcuţă de dimensiuni foarte mici trebuie


dispuse componente, realizate conexiuni, astfel ı̂ncât să nu existe cuplări nedorite
ı̂ntre componente, să se realizeze cu consum de material minim, să fie minimizate
lungimile circuitelor de transfer, etc. Problemele de căutare sunt extrem de complexe
datorită interdependenţelor sau restricţiilor.

4. Roboţi software pentru căutarea pe Internet; pe lângă faptul că trebuie să trateze
operarea ı̂ntr-o imensă bază de date cu grad mic de structurare, trebuie să rezolve
probleme care nu sunt simple nici pentru un om: răspunsuri la ı̂ntrebări, găsirea
preţurilor cele mai convenabile, găsirea informaţiilor ı̂nrudite cu ceva specificat, etc.

1.7 Căutarea soluţiei


Rezolvarea problemei este făcută prin căutare ı̂n spaţiul stărilor. Tehnicile de căutare
prezentate ı̂n acest capitol şi ı̂n capitolul 2 folosesc un arbore de căutare care are drept
rădăcină un nod corespunzând stării iniţiale a problemei, iar nodurile sunt generate pe
baza acţiunilor permise din starea curentă.
Vom considera ca exemplu problema găsirii drumului minim de la Arad la Bucureşti;
pentru moment, permitem existenţa unor noduri diferite, dar care au stări identice; o
discuţie asupra acestui aspect este prezentată ı̂n secţiunea 2.7.
Considerând câte o stare la un moment dat, vom proceda astfel: testăm să vedem dacă
starea curentă este stare scop; dacă da, oprim căutarea, construim soluţia şi o raportăm2 .
Dacă răspunsul este ı̂nsă negativ, atunci se va expanda starea curentă pe baza funcţiei
succesor, obţinând un nou set de stări. Modul de alegere a nodului determină strategia
de căutare.
1
VLSI: Very Large Scale Integration, crearea de circuite integrate prin combinarea de tranzistoare.
2
De remarcat că nu ne propunem determinarea tuturor sau măcar a mai multor soluţii, ci doar a
primeia pe care algoritmul de căutare o descoperă.
1.7. CĂUTAREA SOLUŢIEI 15

Arborele de căutare este format din noduri; un nod constă din următoarele compo-
nente:

• Stare: starea căruia ı̂i corespunde nodul curent

• Nod-Parinte: nodul din arborele de căutare care a generat nodul curent

• Actiune: acţiunea care a fost aplicată nodului părinte pentru a produce nodul
curent

• Costul-caii: costul cumulat al acţiunilor care duc de la nodul iniţial la nodul


curent;

• Adancime: numărul de paşi de-a lungul căii de la nodul iniţial

Nodul iniţial corespunde stării iniţiale, părintele şi acţiunea aferente acestui nod sunt
codificate convenabil (null, valoare neaplicabilă, etc). Componenta Costul-caii poate fi
ı̂n unele cazuri omisă, deoarece nu toate problemele cer determinarea unei soluţii de cost
optim.
Un exemplu al arborelui de căutare generat pentru a căuta drumul de la Arad la
Bucureşti este dat ı̂n figura 1.4. Mai trebuie să menţionăm că nu trebuie făcută confuzie
ı̂ntre noduri şi stări; ı̂n timp ce mulţimea stărilor poate fi finită (de exemplu mulţimea
oraşelor din România), numărul nodurilor poate fi infinit, dacă se permite generarea de
cicluri de forma: Arad – Sibiu – Arad, Arad – Sibiu – Arad – Sibiu – Arad, etc.
Nodurile care au fost obţinute prin expandarea altora, dar nu au fost la rândul lor
expandate (altfel zis: noduri frunză ı̂n arborele de căutare construit până la momentul
curent) sunt menţinute ı̂ntr-o colecţie numită colectieNoduri; natura acestei colecţii şi
politica de acces fac distincţia ı̂ntre o parte din algoritmii de căutare ce vor fi prezentaţi.
Forma generală a algoritmului de căutare este dată ı̂n figura 1.3.
Câteva comentarii relativ la cod:

1. Funcţiile insereaza, insereaza-toate, scoate-primul determină: inserare de


nod, inserare de colecţie de noduri, extragerea primului element conform politicii de
acces specifice tipului de date corespunzător lui colectieNoduri;

2. Notaţia X[Y] reprezintă valoarea atributului (proprietăţii) X pentru entitatea Y

3. Parametrul problema reprezintă o codificare a problemei conform celor din secţiunea


1.5.

4. Funcţia Cautare-in-arbore poate returna şi esuare, pentru cazul ı̂n care nu mai
există nici un nod care să fie expandat iar iteraţiile anterioare nu au descoperit
16 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

Figura 1.3: Algoritmul general de căutare.


1.7. CĂUTAREA SOLUŢIEI 17

(a) Nodul iniţial, corespunzător stării In(Arad)

(b) După expandarea nodului iniţial

(c) După expandarea nodului corespunzător stării In(Sibiu)

Figura 1.4: Creşterea arborelui de căutare pentru rezolvarea problemei găsirii rutei de
Arad la Bucureşti. Nodurile care au fost expandate sunt colorate gri; cele obţinute ı̂n
urma expandării unui nod părinte sunt cu linie continuă; cele care urmează a fi obţinute
prin expandare, la paşii următori sunt cu marcate cu linie ı̂ntreruptă. Nu se face evitarea
stărilor duplicat.
18 CAPITOLUL 1. DEFINIŢII. REZOLVAREA PROBLEMELOR PRIN CĂUTARE

starea scop printre stările explorate. Trebuie ı̂nsă spus că există situaţii şi strategii
de algoritmi de căutare care pot rula teoretic la infinit, sau din punct de vedere
practic duc la epuizarea memoriei disponibile.

1.8 Măsurarea performanţelor algoritmilor de căutare


Pentru algoritmii de căutare care urmează a fi discutaţi evaluarea se va face prin
prisma următoarelor patru caracteristici:

• Completitudinea – un algoritm de căutare este complet dacă se garantează că găseşte


soluţia problemei, ı̂n cazul ı̂n care aceasta există;

• Optimalitatea – un algoritm este optim dacă soluţia găsită este cu cost al căii optim;

• Complexitatea ı̂n timp

• Complexitatea de memorie

Complexitatea ı̂n timp este măsurată relativ la numărul de noduri generate ı̂n decursul
explorării, iar complexitatea de memorie este numărul maxim de noduri ce trebuie să fie
memorat până la rezolvare.
Cele două complexităţi se cuantifică prin intermediul notaţiei O. Definim notaţia
pentru cazul funcţiilor reale cu un singur argument. Fie o funcţie g : N → R+ ; notăm cu
O(g) mulţimea:

O(g) = {f : N → R+ |∃n0 ∈ N, ∃c > 0 : ∀n ≥ n0 , f (n) ≤ c · g(n)}

Pentru algoritmii de căutare ce urmează a fi prezentatţi complexitatea este dată ı̂n termeni
de:

• b, factor de ramificare reprezentând numărul maxim de succesori ai oricărui nod

• d, adâncimea celui mai puţin adânc nod soluţie (a cărui stare este stare scop)

• m, lungimea maximă a oricărei căi ı̂n arborele de căutare


Capitolul 2

Strategii de căutare neinformată

2.1 Căutarea “mai ı̂ntâi ı̂n lăţime”


Căutarea “mai ı̂ntâi ı̂n lăţime” 1 are ca particularitate folosirea structurii de date de tip
coadă (colecţie ı̂n care politica de acces este FIFO - First In, First Out - primul intrat,
primul ieşit) ı̂n cadrul funcţiei Cautare-in-arbore din secţiunea 1.7. Nodul de start
este expandat, apoi copiii acestui nod sunt expandaţi, apoi copiii copiilor, etc. Funcţia
Cautare-in-arbore va fi apelată cu parametrul colectieNoduri iniţializat cu o coadă
goală. Expandarea oricărui nod duce la crearea altor noduri care sunt puse la sfârşitul
cozii. În acest fel nodurile de la o adâncime mai mică ı̂n arborele de căutare sunt expandate
ı̂naintea celor cu adâncime mai mare. Putem vedea această explorare ca o expandare
radială ı̂n jurul nodului de plecare. Un exemplu de funcţionare a acestei strategii este
arătat ı̂n figura 2.1, pentru cazul ı̂n care arborele de căutare este de tip binar.
Se poate vedea faptul că dacă plecând de la nodul iniţial se ajunge la nodul final prin
urmărirea acţiunilor date de funcţia succesor, atunci funcţia va duce mai devreme sau
mai târziu la descoperirea lui; mai mult, drumul de la nodul iniţial la nodul scop este cu
număr minim de arce; altfel spus, algoritmul descoperă un nod scop care are adâncimea
minimă şi atunci opreşte căutarea.
Algoritmul este optimal doar dacă funcţia de cost a căii este nedescrescătoare2 faţă de
numărul de arce (adâncimea nodului). Acest lucru se ı̂ntâmplă, de exemplu, dacă costul
fiecărei acţiuni egal cu aceeaşi cantitate constantă. Un exemplu de funcţie de cost a căii
care nu este nedescrescător faţă de numărul de arce este dat ı̂n figura 2.1, unde costul căii
din nodul A ı̂n nodul C via B (deci cu două arce) este 20, pe când costul drumului direct
A—C (un singur arc) este 30.
Până acum comportamentul acestui algoritm este ı̂ncurajator. Pentru a vedea de ce
1
Engl: breadth-first search
2
O funcţie f : R → R este nedescrescătoare dacă ∀x, y ∈ R, x < y avem că f (x) ≤ f (y).

19
20 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

A A

B C B C

D E F G D E F G

(a) Expandarea nodului rădăcină. (b) După expandarea nodului


rădăcină; acesta dispare din coada
colectieNoduri, ı̂n schimb sunt
adăugate nodurile B şi C.

A A

B C B C

D E F G D E F G

(c) După expandarea nodului B; acesta (d) După expandarea nodului C; acesta
dispare din coadă, dar se adaugă la dispare din coadă, dar se adaugă la
sfârşitul lui colectieNoduri nodurile sfârşitul lui colectieNoduri nodurile F şi
D şi E. G.

Figura 2.1: Modul de alegere a nodurilor ce se expandează conform strategiei de căutare


“mai ı̂ntâi ı̂n lăţime”. Nodurile marcate cu gri sunt eliminate din coada colectieNoduri,
cele marcate prin linie discontinuă vor fi obţinute prin expandare la paşii următori, no-
durile ı̂n dreptul cărora este desenată o săgeată urmează a fi expandate, iar celelate sunt
noduri aflate ı̂n coada colectieNoduri.

Figura 2.2: Exemplu de funcţie de cost care nu este nedescrescătoare faţă de numărul de
arce. Pe fiecare arc este scris costul său.
2.2. CĂUTAREA DUPĂ COSTUL UNIFORM 21

nu este o alegere bună ı̂n toate cazurile facem analiza complexităţilor. Considerăm un caz
ı̂n care fiecare stare are exact b succesori. Nodul rădăcină generează b noduri copil, fiecare
dintre aceştia are la rândul lui b copii (deci la adâncimea 2 avem b2 noduri), prin inducţie
se poate arăta ca la adâncimea h avem bh noduri. Să presupunem că soluţia se află la
adâncimea d. Cazul cel mai defavorabil este acela ı̂n care acest nod corespunzând soluţiei
este chiar ultimul care se expandează de pe nivelul lui, deci avem: cele bd noduri de pe
nivelul d, fiecare din cele b − 1 noduri de pe nivelul nodului soluţie (noduri expandate
ı̂naintea nodului soluţie) produce copii care se pun ı̂n colecţieNoduri, deci ı̂ncă (bd − 1) · b
noduri de pe nivelul d + 1. În total numărul de noduri generate este:

1 + b + b2 + . . . + bd + (bd+1 − b) = O(bd+1 ).

Fiecare nod generat trebuie de asemenea să fie păstrat ı̂n memorie, pentru a putea fi
folosit la reconstituirea drumului - nu avem de unde să ştim care din aceştia sunt efectiv
folosiţi ı̂n refacerea drumului, deci nu ne permitem să ştergem din memorie până când se
reface drumul de la starea iniţială la cea finală; alfel zis, complexitatea ı̂n spaţiu este tot
O(bd+1 ).
Complexităţile nu sunt ı̂ncurajatoare, deoarece pentru un factor de ramificare b = 10
şi adâncime a nodului soluţie d = 8 este nevoie de 31 de ore de rulare şi 1 teraoctet de
memorie RAM (la o rată de producere a nodurilor de 10000 noduri/secundă şi 1000 octeţi
pentru fiecare nod). Ca atare, acest tip de explorare nu se foloseşte ı̂n practică decât
pentru probleme de dimensiuni mici.

2.2 Căutarea după costul uniform


Căutarea “mai ı̂ntâi ı̂n lăţime” alege spre expandare cel mai puţin adânc nod care nu
este expandat. Pentru cazul ı̂n care costul căii nu este nedescrescător faţă de adâncimea
nodului, strategia de alegere poate sa rateze găsirea căii optime. Se poate ı̂nsă corecta
acest aspect dacă la fiecare pas se alege nu cel mai puţin adânc nod neexpandat, ci nodul
neexpandat cu costul căii cel mai mic. Acest lucru se poate face dacă colecţia de noduri
este menţinută ca o coadă de priorităţi (colecţie sortată după costul căii fiecărui nod; orice
adăugare de nod se face nu neapărat la sfârşit – ca pentru o coadă clasică – ci astfel ı̂ncât
să se păstreze proprietatea de ordonare a colecţiei; extragerea produce nodul cu costul
căii cel mai mic).
Astfel, căutarea după costul uniform nu descoperă căile cu număr minim de arce, ci
pe cel cu cost minim. Dacă costul fiecărui pas (acţiuni) este cel puţin egal cu o constantă
ε > 0, atunci căutarea este atât completă cât şi optimă.
Complexitatea ı̂n timp şi spaţiu de memorie nu mai poate fi caracterizată de adâncimea
22 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

nodului; ı̂n schimb


 este
 implicat costul soluţiei optime, C . Complexitatea

de timp şi

spaţiu este O b1+[ ε ] care este deseori mai mare decât O bd+1 .
C


2.3 Căutarea “mai ı̂ntâi ı̂n adâncime”


Căutarea “mai ı̂ntâi ı̂n adâncime” 3 va alege pentru expandare “cel mai adânc” nod
din arbore care nu a fost expandat. Colecţia de noduri neexpandate din algoritmul
Cautare-in-arbore se poate implementa ca o stivă (LIFO - Last In, First Out sau
ultimul intrat, primul ieşit). Pentru cazul unui arbore binar ordinea de parcurgere este
exemplificată ı̂n figura 2.3.
Necesarul de memorie pentru acest algoritm este deosebit de modest: dacă factorul de
ramificare este b şi adâncimea maximă m atunci numărul de noduri ce trebuie reţinute ı̂n
colectieNoduri este 1 + b · m, deci complexitatea este O(b · m).
Există o variantă şi mai redusă ca necesar de memorie bazat pe acest tip de căutare;
algoritmul este cunoscut sub numele de “backtracking” şi are particularitatea că nu face
expandarea tuturor nodurilor copil pentru nodul extras din stivă, ci doar a unui copil;
dacă explorarea pe acest copil este nefructuasă, atunci se ı̂ncearcă al doilea copil, etc.
Avantajul vine din faptul ca stiva nu se ı̂ncarcă decât cu nodurile care chiar fac parte din
calea de căutare curentă. Complexitatea ı̂n spaţiu este O(m). Mai mult, se poate doar
menţine nodul curent (dacă pasul ı̂napoi, de la copil spre părinte este uşor de refăcut)
şi atunci complexitatea ı̂n spaţiu este O(1) – memorie constantă ocupată, indiferent de
adâncimea curentă a nodului.
Problema cu acest tip de căutare este că poate să parcurgă un număr mare de arce
până la găsirea nodului soluţie, dacă ordinea de alegere a nodurilor este “neinspirată”;
de exemplu, strategia de căutare poate să ducă la descoperirea unui nod scop de cost
suboptimal, dar dacă ı̂nscrierea ı̂n stivă a nodurilor copil obţinute la expandare se face
după altă ordine, atunci s-ar putea ca primul nod soluţie descoperit să fie de cost mai
bun sau chiar optim. Mai mult chiar, poate să caute la nesfârşit ı̂n arbore, dacă nu
se face evitarea stărilor duplicat. Pentru problema oraşelor, este posibilă următoarea
parcurgere: Arad, apoi Sibiu, apoi Arad, iar Sibiu, etc. Putem deci spune că algoritmul
nu este complet, nici optimal, iar dacă se termină atunci ı̂n cel mai defavorabil caz are
complexitatea ı̂n timp O(bm ), unde m este lungimea maximă a unei căi ı̂n arborele de
căutare. Mai trebuie zis că m poate să fie mult mai mare decât d, adâncimea celui mai
puţin adânc nod scop, deci complexitatea de timp poate să fie mai mare decât cea pentru
căutarea “mai ı̂ntâi ı̂n lăţime” sau chiar şi cea a costului uniform. Rămâne ı̂nsă de remarcat
compexitatea de memorie cerută: liniară.
3
În limba engleză, ı̂n original: depth first search.
2.3. CĂUTAREA “MAI ÎNTÂI ÎN ADÂNCIME” 23

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(a) Expandarea nodului rădăcină. (b) După expandarea nodului


rădăcină; acesta dispare din stiva
colectieNoduri, ı̂n schimb sunt
adăugate nodurile C şi apoi B (ordinea
aceasta poate să difere şi atunci
desenele ce urmează diferă).

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(c) După expandarea nodului B, pre- (d) După expandarea nodului D; acesta
luat din vârful stivei; acesta dispare din dispare din stivă, dar se adaugă la vârful
stivă, dar se adaugă la vârful ei nodu- ei nodurile I şi apoi H. Următoarea
rile E şi apoi D (a se vedea remarca des- operaţie este expandarea (şi deci elimi-
pre altă ordine de adăugare la stivă din nare din stivă) a nodului H, ceea ce
subfigura anterioară). nu duce la adăugarea de alte noduri ı̂n
colectieNoduri.

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(e) Se extrage vârful stivei, adică no- (f) După expandarea nodului I; acesta
dul H şi se ı̂ncearcă expandarea lui; dispare din stivă şi nu se adaugă nici
deaorece el nu are descendenţi, stiva un alt nod la stivă.
colectieNoduri rămâne nemodificată

Figura 2.3: Modul de alegere a nodurilor ce se expandează conform strategiei de


căutare “mai ı̂ntâi ı̂n adâncime”. Nodurile colorate cu negru/gri sunt eliminate din stiva
colectieNoduri, cele marcate prin linie discontinuă vor fi obţinute prin expandare la
paşii următori, nodurile ı̂n dreptul cărora este desenată o săgeată urmează a fi expandate,
iar celelalte sunt noduri aflate ı̂n stiva colectieNoduri.
24 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(a) După expandarea nodului E; acesta (b) După expandarea nodului J; acesta
dispare din stiva colectieNoduri, ı̂n dispare din stiva colectieNoduri şi
schimb sunt adăugate nodurile K şi apoi deoarece nu are descendenţi nu produce
J. noi elemente ı̂n stivă.

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(c) După expandarea nodului K; acesta (d) După expandarea nodului C; acesta
dispare din stiva colectieNoduri şi dispare din stivă, dar se adaugă la
deoarece nu are descendenţi nu pro- vârful ei nodurile G şi apoi F.
duce noi elemente ı̂n stivă.

A A

B C B C

D E F G D E F G

H I J K L M N O H I J K L M N O

(e) Se extrage vârful stivei, adică no- (f) Expandările frunzelor M şi L re-
dul F şi se expandează, adăugând-se la duc numărul de elemente din stivă
stivă nodurile M şi apoi L. cu cate o unitate, urmează expanda-
rea nodului G (deci scoaterea lui din
stiva colectieNoduri) şi introduce-
rea frunzelor O şi N. După expandarea
acestor frunze (deci eliminarea lor din
stivă) colectieNoduri devine vidă şi
căutarea se opreşte.

Figura 2.4: Parcurgerea “mai ı̂ntâi ı̂n adâncime” - continuare.


2.4. CĂUTAREA CU ADÂNCIME LIMITATĂ 25

2.4 Căutarea cu adâncime limitată


Căutarea “mai ı̂ntâi ı̂n adâncime” din secţiunea 2.3 are un mare atu: foloseşte extrem
de puţină memorie. Dar are şi un dezavantaj major, posibilitatea de a căuta la infinit
ı̂n arbore, datorită stărilor duplicat. Acest dezavantaj este eliminat simplu: vom limita
adâncimea maximă la care poate să coboare explorarea ı̂n arbore. Vom folosi deci un
parametrul l (număr ı̂ntreg) reprezentând adâncimea maximă de explorare. Nodurile de la
adâncimea l sunt tratate ca şi cum nu ar avea succesori. Însă acest algoritm mai introduce
un tip de rezultat: tăiere4 , pentru cazul ı̂n care avem d > l iar căutarea epuizează toate
nodurile din subarborele de adâncime l; ı̂n acest caz nu se poate spune că se eşuează,
pentru că o adâncime de căutare mai mare ar fi permis găsirea nodului scop (şi deci
problema s–ar fi putut rezolva).
Algoritmul căutării cu adâncime limitată5 este dat ı̂n figura 2.4. Funcţiile solutie,
expandeaza sunt aceleaşi ca la algoritmul de cautare ı̂n arbore (secţiunea 1.3, pagina 16).
Algoritmul nu este complet dacă l < d; pentru l ≥ d el este complet, dar nu neaparat
optim. Complexitatea ı̂n timp este O(bl ), iar cea ı̂n spaţiu O(b·l) (moştenite amândouă de
la parcurgerea “mai ı̂ntâi ı̂n adâncime”). Ceea ce este ı̂nsă de remarcat e că nu mai avem
risc de căutare infinită datorată ciclurilor (vizitării repetate a aceloraşi stări). Împreună
cu consumul de memorie redus ne fac să sperăm că problema de căutare devine rezolvabilă
cu cerinţe de memorie rezonabile.
Se pune ı̂ntrebarea: de unde stim care este adâncimea maximă la care vom permite
căutarea? Pentru câteva probleme, din ı̂nsăşi enunţul lor se poate deduce care este o
valoare rezonabilă pentru limita maximă. De exemplu, pentru problema Arad–Bucureşti
putem observa că numărul de oraşe de pe hartă este 20, deci l = 19 este o alegere bună.
Chiar mai mult, se poate observa că pentru orice pereche de oraşe se poate să se ajungă
dintr-unul ı̂n celălalt prin maxim 9 paşi, deci adâncimea poate fi şi mai mult redusă.

2.5 Căutarea “mai ı̂ntâi ı̂n adâncime” cu adâncire ite-


rativă
Problema necunoaşterii apriorice a adâncimii la care să se facă căutarea este tratabilă
prin următoarea strategie: se dau valori succesive lui l ı̂ncepând cu 0, din ce ı̂n ce mai mari
până ce rezultatul este de tip esuare sau solutie. Găsirea soluţiei ı̂nseamnă determinarea
nodului soluţie cel mai puţin adânc. Varianta de algoritm combină părţile bune ale
căutării ı̂n adâncime şi ı̂n lăţime: memorie necesară mică şi respectiv, completitudine
4
În engleză, ı̂n original: cutoff
5
În limba engleză, ı̂n original: depth–limited search
26 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

Figura 2.5: Algoritmul căutării cu adâncime limitată.

şi optimalitate pentru cazul ı̂n care functia de cost a căii este nedescrescătoare faţă de
numărul de arce pentru cale.
2.5. CĂUTAREA “MAI ÎNTÂI ÎN ADÂNCIME” CU ADÂNCIRE ITERATIVĂ
(a) Evoluţia arborelui de căutare pentru l = 0

(b) Evoluţia arborelui de căutare pentru l = 1; se reconstruieşte rădăcina şi apoi se obţin cele două
noduri copil B şi C.

(c) Evoluţia arborelui de căutare pentru l = 2; se reconstruiesc rădăcina, cei doi copii ai ei B şi C şi
apoi se obţin cele patru noduri nepot D, E, F şi G.

Figura 2.6: Evoluţia arborelui de căutare pentru diferite valori ale lui l.

27
28 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

Strategia algoritmului căutarea “mai ı̂ntâi ı̂n adâncime” cu adâncire iterativă6 ar putea
părea neeficientă, deoarece se creează toate nodurile de la adâncimea i − 1 atunci când se
caută la adâncimea i. Putem observa ı̂nsă că cu cât un nivel de noduri se recreează mai
des, cu atât este de fapt adâncimea lui mai mică (deci numărul de noduri corespunzător
este mai redus). Putem calcula numărul de noduri care sunt expandate astfel: nodurile
de la adâncimea d sunt generate o singură dată (de fapt, la ultima iteraţie s-ar putea să
nu fie chiar toate generate), cele de la nivelul d − 1 sunt generate de două ori, etc, cele de
la nivelul 0 (adică rădăcina) de d ori; numărul de noduri este dat ca:

N (CAR) = bd · 1 + bd−1 · 2 + . . . + b · d + 1 · (d + 1) = O(bd )

pe când la căutarea “mai ı̂ntâi ı̂n lăţime” numărul de noduri generate este O(bd+1 ).
Am obţinut deci un algoritm de căutare care este complet, este optim dacă funcţia de
cost este nedescrescătoare faţă de numărul de arce ale drumului, are cerinţe de memorie
modeste şi complexitate ı̂n timp mai mică decât cea a algoritmilor anterior prezentaţi. În
practică se consideră că algoritmul de căutare mai ı̂ntâi ı̂n adâncime cu adâncire iterativă
este algoritmul preferat de căutare atunci când spaţiul de căutare este mare iar adâncimea
nodului soluţie este necunoscută.

2.6 Căutare bidirecţională


Căutarea bidirecţională se bazează pe strategia: se ı̂ncep simultan două căutari, atât
dinspre nodul de start spre scop cât şi invers. Dacă se produce “ı̂ntâlnirea” celor două
căutari (şi ı̂n acest caz punctul comun celor două parcurgeri este la distanţa d/2 dintre
cele două noduri de pornire), atunci complexitatea ı̂n timp este O(bd/2 + bd/2 ) = O(bd/2 ),
care este mult mai mic decât O(bd ). Procedeul este ilustrat ı̂n figura 2.7.

Figura 2.7: Căutare bidirecţională. Aria ı̂nsumată a celor două cercuri este mai mică
decât aria unui cerc mare care pleacă din nodul de start şi ajunge ı̂n nodul de scop.

Start Goal

La fiecare expandare de nod se verifică dacă acesta nu a fost cumva atins de căutarea
din sens contrar. Dacă da, atunci soluţia (secvenţa de acţiuni care duce dinspre nodul
6
În limba engleză, ı̂n original: iterative deepening depth-first search.
2.7. PROBLEMA STĂRILOR DUPLICAT 29

de start spre cel de scop) se reface pe baza drumurilor construite spre nodul comun.
Determinarea faptului că un nod se găseşte ı̂ntr-o lista de noduri se face ı̂n timp constant,
dacă se foloseşte o tabelă de dispersie. Dar tocmai faptul că necesarul de memorie este
O(bd/2 ) face acest algoritm să nu poată fi aplicat ı̂n practică. În rest ı̂nsă, algoritmul este
complet şi optimal dacă fiecare din cele două căutări este efectuată prin parcurgere “mai
ı̂ntâi ı̂n lăţime” (şi desigur, cu ipoteza suplimentară cerută de algoritmul menţionat). Alte
variante de combinare pot face algoritmul neoptim sau incomplet.
Mai trebuie zis aici că algoritmul poate fi folosit doar ı̂n cazul ı̂n care se poate calcula
uşor funcţia de predecesor, opusul funcţiei succesor care face parte din definiţia problemei
- lucru care nu se ı̂ntâmplă la toate problemele. Încă un aspect merită menţionat - dacă
există mai multe noduri scop care pot fi enumerate (nu doar teoretic, ci şi practic) atunci
se poate crea o stare scop nouă, unică, al cărui pas de predecesor să ducă ı̂n stările scop
originale. Dacă mulţimea stărilor scop este foarte largă sau validarea nodurilor scop se
face faţă de un predicat, atunci căutarea bidirecţională este greu sau imposibil de aplicat,
ı̂n lipsa unei descrieri compacte a proprietăţii de a fi stare scop.

2.7 Problema stărilor duplicat


Algoritmul general de căutare nu evită explorarea ı̂n mod repetat a aceloraşi stări
(deci obţinerea de noduri diferite, dar pentru care stările corepsunzătoare au mai fost
vizitate anterior). Acest lucru face ca, de exemplu, explorarea ı̂n adâncime să poată să
nu determine soluţie, cu toate că una există. Pentru ceilalţi algoritmi vizitarea repetată
a unor stări se traduce prin ineficienţă.
Un exemplu de “explozie” a numărului de noduri datorate stărilor duplicat este dat
ı̂n figura 2.8. Din fiecare punct avem 4 variante de continuare; dacă nu facem evitarea
stărilor duplicat, atunci la o parcurgere de adâncime d obţinem 4d noduri; dacă se face
evitarea stărilor duplicat, atunci obţinem 4 · d2 noduri. Pentru d = 20, diferenţa este
uriaşă: 1.099.511.627.776 faţă de 1600 de noduri!

Figura 2.8: Reţea pentru care neevitarea stărilor duplicat duce la o explozie exponenţială
a numărului de noduri cu stări repetate.

Detectarea se face prin căutarea stării nodului ce urmează a fi expandat ı̂n lista stărilor
care au fost deja expandate. Dacă un algoritm evită stările duplicat, atunci poate fi văzut
30 CAPITOLUL 2. STRATEGII DE CĂUTARE NEINFORMATĂ

ca o căutare ı̂n graf. Algoritmul este dat ı̂n figura 2.9 şi foloseşte o mulţime a stărilor deja
expandate numită stariVechi. Algoritmul nou obţinut se numeşte Cautare-in-graf.

Figura 2.9: Algoritmul de căutare in graf.

Algoritmul Cautare-in-graf nu pune probleme ı̂n privinţa completitudinii; comple-


xitatea ı̂n timp şi spaţiu sunt proporţionale cu numărul stărilor distincte, iar asta poate să
fie mult mai mic decât O(bd ). Remarcăm ı̂nsă că pentru căutarea “mai ı̂ntâi ı̂n adâncime”
sau cu adâncime limitată, datorită menţinerii acestei liste de noduri vechi, necesarul de
memorie nu mai este liniar (dar se evită ciclarea).
În ceea ce priveşte optimalitatea, lucrurile stau astfel: algoritmul va elimina noua cale
descoperită către o stare care a mai fost ı̂ntâlnită ı̂nainte. Deoarece prima cale descope-
rită s-ar putea să fie suboptimală, rezultă că nu se poate garanta optimalitatea soluţiei
determinate. Acest lucru nu se ı̂ntâmplă atunci când avem căutarea costului uniform sau
când se foloseşte căutarea “mai ı̂ntâi ı̂n lăţime” pentru cost constant al acţiunilor. Pentru
celelate metode ar trebui ca ajungerea la o stare care a mai fost parcursă să declanşeze o
verificare asupra faptului că noua cale produce un rezultat mai bun; dacă este adevărat,
atunci trebuie ca toate nodurile care au ca ascendent (direct sau prin tranzitivitate) nodul
curent să ı̂şi reactualizeze costurile.
Capitolul 3

Căutare informată

3.1 Strategii de căutare informată

Strategiile euristice prezentate ı̂n acest capitol pornesc de la o idee simplă: ce s-ar
ı̂ntâmpla dacă s-ar explora ı̂ntr-o direcţie care pare mai promiţătoare pentru rezolvarea
problemei? am putea astfel să evităm explorarea unor noduri care au o şansă mică de
ajungere ı̂n nodul scop, cu efect benefic asupra complexităţii ı̂n timp şi spaţiu. Este o
strategie des folosită de experţii umani, care pe baza experienţei şi intuiţiei evită explo-
rarea tuturor posibilităţilor şi decid o căutare ı̂n anumite direcţii, cele estimate a fi mai
promiţătoare.
În cazul problemelor de căutare formalizate ı̂n capitolul 1, vom considera pentru fiecare
nod n capacitatea estimată a lui de a duce spre un nod scop. Concret, pentru fiecare nod
n se calculează o funcţie de evaluare f (n). Nodul cu cea mai mică valoare a acestei funcţii
este ales pentru expandare. Ca atare, algoritmul de căutare pe arbore poate fi folosit cu
o modificare minoră: lista de noduri colectieNoduri trebuie să fie organizată ca o coadă
de priorităţi.
Există o clasă ı̂ntreagă de algoritmi bazaţi pe această idee. O componentă comună a
acestora este o funcţie euristică notată tradiţional cu h(n). h(n) reprezintă costul estimat
al celei mai “ieftine” căi care duce de la nodul curent la un nod scop1 . În mod firesc, vom
impune ca h(n) = 0 dacă n este nod scop.
De exemplu, pentru problema drumului din Arad ı̂n Bucureşti putem să vedem această
funcţie ca fiind distanţa pe drum drept de la oricare oraş către Bucureşti. Figura 3.1
conţine atât harta schematizată a României, cât şi un tabel cu distanţele pe drum drept
dintre oraşe şi Bucureşti.

1
Dacă problema este de minimizare, atunci h(n) este costul estimat al celei mai scurte căi; dacă este
problemă de maxim, atunci este costul estimat al celei mai “scumpe” căi

31
32 CAPITOLUL 3. CĂUTARE INFORMATĂ

3.2 Căutarea euristică lacomă


Căutarea euristică lacomă2 alege pentru expandare nodul care are valoarea calculată
pentru funcţia h cea mai mică. Altfel spus, alegem ca f (n) = h(n), pentru orice nod n.
Pentru problema drumului minim de la Arad la Bucureşti paşii sunt daţi ı̂n figura
3.2. Distanţele folosite drept euristică sunt scrise ı̂n figura 3.1. Primul nod care se
expandează este Sibiu, deoarece are distanţa pe drum drept de la el la Bucureşti minimă,
253 km. Următorul nod expandat este Făgăraş, deoarece din mulţimea nodurilor aflate
ı̂n colectieNoduri el este cel mai apropiat de Bucureşti. Expandarea lui Făgăraş duce
la obţinerea nodului Bucureşti, care la iteraţia următoare este cel ales pentru expandare
(având costul 0) şi care termină iteraţia din algoritmul Cautare-in-arbore (secţiunea
1.7). Dar drumul optim este următorul: Arad — Sibiu — Râmnicu Vâlcea — Piteşti —
Bucureşti, cu 32 de kilometri mai mic decât cel descoperit anterior.
Putem observa că minimizarea lui h poate duce la căutare cu număr infinit de paşi:
de exemplu, dacă se doreşte a se ajunge din Iaşi la Făgăraş, prima destinaţie este Neamţ;
dar de aici nu mai există nici un alt drum, decât ı̂napoi ı̂napoi ı̂n Iaşi, ceea ce duce la
un ciclu infinit dacă nu se evită stările repetate; dacă se evită, atunci se descoperă calea
optimă: Iaşi, Vaslui, Urziceni, Bucureşti, Făgăraş.
Caracterisiticle acestui algoritm: incomplet – deoarece poate intra ı̂ntr–un ciclu infinit,
neoptim – a se vedea exemplul dat mai sus –, complexitate ı̂n timp şi spaţiu O(bm ), unde m
este adâncimea maximă a unui drum ı̂n arborele de căutare. În practică ı̂nsă, o euristică
bine aleasă poate să ducă la viteză crescută şi memorie necesară rezonabilă, iar costul
soluţiei determinate, chiar dacă nu e optim, este deseori foarte apropiat de el.

2
În limba engleză, ı̂n original: greedy best-first search.
3.2. CĂUTAREA EURISTICĂ LACOMĂ
Straight−line distance
Oradea to Bucharest
71
Neamt Arad 366
87 Bucharest 0
Zerind 151 Craiova
75 160
Iasi Dobreta 242
Arad 140 Eforie 161
92 Fagaras 178
Sibiu 99 Fagaras Giurgiu 77
118 Hirsova
Vaslui 151
80
Iasi 226
Rimnicu Vilcea Lugoj
Timisoara 244
142 Mehadia 241
111 211 Neamt 234
Lugoj 97 Pitesti
Oradea 380
70 98 Pitesti 98
146 85 Hirsova
Mehadia 101 Urziceni Rimnicu Vilcea 193
75 138 86 Sibiu 253
Bucharest Timisoara 329
120
Dobreta
90 Urziceni 80
Craiova Eforie Vaslui 199
Giurgiu Zerind 374

Figura 3.1: Harta României şi distanţele pe drum drept dintre oraşe şi Bucureşti.

33
34
(a) Nodul eles pentru expandare este unic, (b) După expandarea nodului rădăcină; nodul ce urmează a fi
rădăcina expandat este Sibiu, având costul f (= h) cel mai mic.

CAPITOLUL 3. CĂUTARE INFORMATĂ


(c) După expandarea nodului Sibiu; nodul ce urmează a fiu expandat este
Făgăraş, având costul f cel mai mic.

(d) După expandarea nodului Făgăraş; se ajunge ı̂n oraşul Bucureşti, care
va fi ales la următoarea iteraţie din algoritmul Cautare-in-arbore.

Figura 3.2: Paşi ı̂n executarea algoritmului de căutare euristică lacomă. Valorile scrise sub noduri provin din figura 3.1
3.3. ALGORITMUL A* 35

3.3 Algoritmul A*
Cea mai cunoscută formă a acestor algoritmi de căutare informată este algoritmul A*,
pentru care funcţia f (n) este dată ca:

f (n) = g(n) + h(n)

unde g(n) este costul real al drumului de la nodul de start la nodul n – un nod din
arborele de căutare conţine deja această valoare – iar h(n) este, precum anterior, costul
estimat al celei mai bune căi de la nodul n la un nod scop. Avem deci că f (n) este costul
estimat al celui mai bun drum de la nodul de start la un nod scop, drum ce trece prin n.
Pentru câteva condiţii impuse lui h se obţine că algoritmul A* este optim şi complet; ı̂n
practică, rezultatele obţinute sunt foarte bune, prin comparaţie cu strategiile de căutare
oarbă studiate anterior.
Vom considera funcţii h care sunt euristici admisibile, adică h(n) niciodată nu supra-
estimează (depăşeşte) costul unei soluţii de la nodul n la nod scop3 . Prin natura lor, acest
tip de funcţii sunt optimiste – ele permanent subestimează costul real al drumului. Deoa-
rece funcţia g cuantifică efortul exact de a ajunge din nodul iniţial ı̂n nod scop, deducem
că valoarea f (n) nu supraestimează efortul de a ajunge din nodul iniţial ı̂n nod scop via
nodul intermediar n.
Un exemplu de funcţie euristică admisibilă este cea care estimează efortul de ajungere
din nodul n ı̂n Bucureşti ca fiind distanţa pe drum drept de la n la Bucureşti. Este evident
că orice rută s-ar alege, ea nu poate avea cost mai mic decât costul drumului drept.
Evoluţia algoritmului A* pentru problema ajungerii de la Arad la Bucureşti este re-
prezentată ı̂n figurile 3.3 şi 3.4.

3
Aceasta este definiţia pentru problemă ı̂n care se cere minimizarea căii; pentru probleme de maximi-
zare, o euristică admisibilă nu subestimează efortul real de ajungere la nod scop.
36
(a) Nodul eles pentru expandare este unic, (b) După expandarea nodului rădăcină; nodul ce urmează a fi expan-
rădăcina dat este Sibiu, având costul f cel mai mic.

CAPITOLUL 3. CĂUTARE INFORMATĂ


(c) După expandarea nodului Sibiu; nodul ce urmează a fiu expandat este
Râmnicu Vâlcea, având costul f cel mai mic.

(d) După expandarea nodului Râmnicu Vâlcea; nodul ce urmează a fi expandat este
Făgăraş.

Figura 3.3: Paşi ı̂n executarea algoritmului A*. Valorile scrise sub noduri reprezintă valorile funcţiei f = g + h.
3.3. ALGORITMUL A*
(a) După expandarea nodului Făgăraş.

(b) După expandarea nodului Piteşti. Bucureşti este următorul nod expandat, dar şi nod scop,
deci căutarea se opreşte

Figura 3.4: Paşi ı̂n executarea algoritmului A* (continuare).

37
38 CAPITOLUL 3. CĂUTARE INFORMATĂ

Vom demonstra următoarea propoziţie:

Teorema 1 Dacă algoritmul A* se termină, atunci nodul scop la care s-a ajuns are cost
optim.

Demonstraţie Fie G şi G2 noduri scop aflate ı̂n colectieNoduri, G2 suboptimal (adică
cu valoarea drumului până la el mai mare decât este necesar) şi G optimal. Avem
următoarele:
f (G2 ) = g(G2 ) + h(G2 ) = g(G2 )

deoarece am impus ı̂ncă de la ı̂nceput ca h(nodScop) = 0. Din acelaşi motiv:

f (G) = g(G)

Apoi:
g(G2 ) > g(G)

deoarece G2 este suboptimal. Din cele de mai sus avem că:

f (G2 ) > f (G)

deci G va fi expandat ı̂naintea lui G2 de către algoritmul A*.

Condiţia din teorema anterioară este satisfăcută dacă există un număr finit de noduri
pentru care f (·) ≤ f (G).
Dacă se foloseşte algoritmul Cautare-in-Graf ı̂n locul algoritmului Cautare-in-Arbore,
optimalitatea nu mai este neapărat valabilă. Reamintim că algoritmul parcurgerii pe graf
evită stările repetate astfel: un nod din coleţia de noduri se expanda doar dacă starea
sa nu se regăse ı̂ntr-o listă de stări deja parcurse. Problema cu această abordare este că
se poate astfel că prima ajungere ı̂ntr-o anumită stare să se facă cu un cost suboptimal,
iar următoarele drumuri care conduc la aceeaşi stare sunt neglijate, chiar dacă ar duce la
ı̂mbunătăţirea costului pentru acea stare.
Există două soluţii care se pot aplica. Prima constă ı̂n menţinerea căii care are costul
cel mai bun. Se poate scrie asemenea algoritm, chiar dacă este mai complex (presupune
de exemplu ca să se modifice şi costurile nodurilor care sunt descendenţi ai nodurilor cu
cost ı̂mbunătăţit). A doua soluţie cere ca să ne asigurăm că prima cale care duce la o
anumită stare este ı̂ntotdeauna cu cost optim, ca atare putem neglija drumurile ulterioare
care redescoperă starea. Vom detalia ı̂n cele ce urmează care sunt condiţiile care trebuie
să fie ı̂ndeplinite de către funcţia h pentru a aplica această variantă.

Definiţia 9 O funcţie h se numeşte consistentă dacă pentru orice nod n şi orice succesor
n′ generat de o acţiune a avem că:

h(n) ≤ c(n, a, n′ ) + h(n′ )


3.3. ALGORITMUL A* 39

unde c(n, a, n′ ) este costul acţiunii a care permite mutarea din starea n ı̂n starea n′ – a
se vedea figura 3.5.

n
c(n,a,n’)
h(n)
n’
h(n’)
G

Figura 3.5: Inegalitatea triunghiului pentru o funcţie consistentă

O funcţie consistentă se mai numeşte şi monotonă. Este o formă a inegalităţii triun-
ghiului, triunghi format de vârfurile n, n′ şi nodul scop cel mai apropiat de n. Se poate
arăta că orice funcţie consistentă este şi admisibilă. Reciproca nu este adevărată, dar
trebuie destul de multă ingeniozitate pentru a crea o funcţie care este admisibilă şi nu
este şi monotonă.
Pentru problema drumului Arad–Bucureşti, funcţia euristică dată de distanţa pe drum
drept de la oraşul curent la Bucureşti este de asemenea şi consistentă, deoarece satisface
inegalitatea triunghiului din geometria plană.
Arătăm că dacă h este monotonă, atunci valorile lui f de-a lungul unui drum sunt
nedescrescătoare. Fie n′ un succesor al lui n; atunci:

g(n′ ) = g(n) + c(n, a, n′ )

(conform definiţiei lui g, unde a este acţiunea care permite schimbarea stării curente din
n ı̂n n′ ) şi

f (n′ ) = g(n′ ) + h(n′ ) = g(n) + c(n, a, n′ ) + h(n′ ) ≥ g(n) + h(n) = f (n)

Enunţăm fără demonstraţie teorema:

Teorema 2 Dacă h este consistentă, atunci A* folosind funcţia Cautare-pe-Graf este


optimal.

Fie C ∗ costul soluţiei optime. Se mai poate arăta că:

• A* expandează toate nodurile cu f (n) < C ∗ ;

• se poate ca A* să expandeze câteva noduri care au f (n) = C ∗ ı̂nainte ca să expandeze
nod scop (şi deci să se termine algoritmul);
40 CAPITOLUL 3. CĂUTARE INFORMATĂ

• A* nu expandează noduri n cu f (n) > C ∗ .

Ultima observaţie este deosebit de importantă, deoarece arată că se evită expandarea
unui nod care are costul mai mare decât costul optim, chiar dacă acest cost optim nu este
cunoscut decât la terminarea algoritmului! De exemplu, nodul aferent oraşului Timişoara
nu este niciodată expandat, având cost prea mare. Datorită monotoniei funcţiei f avem că
nici oraşele care descind direct din Timişoara nu vor fi expandate, de fapt nici un nod de
pe vreo rută care include Timişoara ca nod intermediar nu va fi expandat; se face astfel o
“retezare” a arborelui de căutare, prin eliminarea unor variante care nu ar fi dus oricum la
un rezultat optim. Geografic, realizăm că toată partea Banatului este exclusă din arborele
de căutare, deoarece costurile nodurilor din această regiune sunt oricum prea mari faţă
de costul optim (momentan necunoscut, determinat doar la sfârşitul algoritmului) C ∗ .
Algoritmul este complet, dacă nu cumva sunt infinit de multe noduri n care au f (n) ≤
C ∗ . Este şi optimal; mai mult decât atât, este optimal eficient pentru orice funcţie
euristică dată – adică nici un alt algoritm optimal nu garantează expandarea unui număr
mai mic de noduri decât A*, abstracţie făcând de numărul de noduri n pentru care
f (n) = C ∗ . Dacă am avea un un algoritm care nu expandează toate nodurile n cu
f (n) < C ∗ , atunci ar exista riscul ca să se rateze o cale optimă.
Există totuşi o problemă: numărul de noduri care au f (·) < C ∗ creşte exponenţial cu
lungimea soluţiei. Un caz ı̂n care nu se ı̂ntâmplă aşa ceva este când:

|h(n) − h∗ (n)| ≤ O (log (h∗ (n)))

unde h∗ (n) este costul real al ajungerii de la nodul n la scop. Din păcate, cele mai multe
euristici folosite ı̂n practică sunt măcar proporţionale cu costul căii, ca atare obţinem
număr de noduri exponenţial – şi toate trebuie ţinute ı̂n memorie, pentru a putea reface
soluţia. De multe ori algoritmul epuizează toată memoria pusă la dispoziţie, ı̂nainte de
ca timpul pus la dispoziţie să se scurgă.

3.4 Variaţii ale lui A*


Există câteva variaţii ale algoritmului A*, recent obţinute, care determină soluţia
optimă cu un necesar de memorie neprohibitiv. Primul dintre ele este Recursive best–
first search (RBFS) care are complexitate de memorie liniară, dar suferă de regenerarea
excesivă a nodurilor. Practic, acest algoritm suferă din cauză că foloseşte prea puţină
memorie.
Algoritmii MA* (Memory–bounded A*) şi SMA* (Simplified memory–bounded A*)
vin să corecteze problema, ei folosind toată memoria care li se pune la dispoziţie. Algo-
ritmul este complet dacă soluţia poate fi atinsă cu memoria dată; este optimal ı̂n aceeaşi
3.5. FUNCŢII EURISTICE 41

condiţie, iar dacă memoria pusă la dispoziţie este prea puţină, atunci va returna cea mai
bună soluţie (suboptimală) pe care a putut-o descoperi. Pe de altă parte, ı̂nsă, o problemă
poate deveni intratabilă datorită complexităţii de timp crescute.

3.5 Funcţii euristice


Vom studia funcţii euristice pentru problema puzzle-ului (a se vedea definiţia problemei
de la pagina 12). Pentru un puzzle de 3x3, factorul mediu de ramificare este 3 (4 noduri
descendente dacă spaţiul este la mijloc, 2 noduri descendente dacă spaţiul este ı̂ntr-un
colţ, 3 noduri altfel). Numărul mediu de mutări pentru rezolvare este de 22; o căutare
exhaustivă ar cere vizitarea a 322 adică aproximativ 3, 1·1010 stări. Prin eliminarea stărilor
duplicat problema s-ar reduce la 9!/2=181.440 stări distincte. Numărul este acceptabil,
dar pentru un puzzle de 4x4, un calcul asemănător duce la aproximativ 1013 stări distincte.
Ca atare, ne ı̂ntrebăm ce funcţie euristică am putea folosi şi cât de bună este ea.
Cele mai populare euristici sunt:

• h1 — numărul de piese poziţionate greşit. h1 este o euristică admisibilă, deoarece


este clar că orice căsuţă cu poziţionare greşită trebuie să suporte cel puţin o mutare.

• h2 — suma distanţelor dintre poziţiile actuale şi cele din starea finală a pieselor.
Deoarece piesele se pot mişca doar pe orizontală şi verticală, nu vom folosi distanţa
euclidiană – precum ı̂n problema drumului de la Arad la Sibiu – ci distanţa L1 (sau
distanţa Manhattan):

L1 ((x1 , y1 ), (x2 , y2 )) = |x1 − x2 | + |y1 − y2 |

Din nou se observă că este o euristică admisibilă, deoarece pentru mutarea unei
piese la poziţia corectă se fac cel puţin mutările pe orizontală şi pe verticală.

O modalitate de a caracteriza calitatea unei euristici este factorul efectiv de ramificare,


b∗ . Dacă numărul de noduri pentru o instanţă particulară a unei probleme este N , atunci
b∗ se defineşte ca factorul de ramificare (nu neapărat număr ı̂ntreg) pentru care un arbore
uniform de adâncime d conţine cele N noduri; pe scurt, b∗ este soluţia ecuaţiei:

N = 1 + b∗ + (b∗ )2 + . . . + (b∗ )d

De exemplu, dacă A* descoperă soluţia la adâncime 5 generând 52 de noduri, atunci


b∗ ≃ 1.92. Numărul se obţine de fapt ca o medie peste diferite instanţe, dar este o valoare
relativ constantă. Scopul este de a obţine un factor de ramificare cât mai apropiat de 1.
De exemplu, pentru instanţe ı̂n care numărul de paşi este 12, numărul de noduri ge-
nerat pentru căutarea “mai ı̂ntâi ı̂n adâncime” cu adâncire iterativă generează 3.644.035
42 CAPITOLUL 3. CĂUTARE INFORMATĂ

noduri, algoritmul A*(h1 ) generează 227 noduri, iar A*(h2 ) generează 73 noduri. Pen-
tru adâncime 24, algoritmul de căutare oarbă clachează din lipsă de memorie, A*(h1 )
generează 39135 noduri, iar A*(h2 ) generează 1641 noduri.
Dacă există mai multe euristici ne putem pune problema dacă e vreuna mai bună
decât celelalte. Pentru h1 şi h2 , de pildă, avem că h2 (n) ≥ h1 (n), ∀n. Din cauză că A*
expandează fiecare nod care are f (n) < C ∗ (echivalent: h(n) < C ∗ − g(n)), rezultă că
orice nod expandat pentru funcţia h2 este sigur expandat şi pentru funcţia h1 . Ceea ce
ne ı̂ndeamnă a căuta funcţii euristice care să aibe valori cât mai mari, dar să rămână ı̂ncă
admisibile (sub valoarea reală). Problema cu o asemenea abordare este că funcţia, deşi
devine mai “bună”, poate cere de asemenea resurse computaţionale prea mari. Pentru
cazul ı̂n care ı̂ntre două euristici există relaţia h2 ≥ h1 spunem că h2 domină pe h1 4 .
Se pune ı̂ntrebarea: cum se pot inventa funcţii euristice? Este posibil a se inventa
asemenea funcţii ı̂n mod automat? Modul ı̂n care s–au descoperit este simplu: s–au
relaxat restricţiile problemei. Dacă problema se enunţă sub forma unor condiţii, precum:
“o piesă se mută din locaţia A ı̂n B dacă A este vecin orizontal sau vertical al lui B şi
B este spaţiu liber” atunci putem realiza trei variante relaxate prin eliminarea la o parte
din condiţii:

1. o piesă se poate muta de la poziţia A la B dacă A este vecin cu B

2. o piesă se poate muta de la poziţia A la B dacă B este spaţiu

3. o piesă se poate muta de la poziţia A la B

Prima variantă corespunde euristicii h2 , iar cea de-a treia este pentru euristica h1 .
Folosind această tehnică (şi alte strategii), s–a obţinut un program capabil de a găsi
variante relaxate de probleme, unele conducând la euristici superioare celor cunoscute.
Ce se ı̂ntâmplă când avem mai multe euristici, dar niciuna nu domină pe toate celelelate
(adică: avem h1 , h2 , . . . , hm şi pentru orice i, j, 1 ≤ i, j ≤ m, i 6= j există x, y astfel ı̂ncât
hi (x) ≤ hj (x) dar hi (y) > hj (y))? Putem considera funcţia h definită punctual ca:

h(n) = max{h1 (n), . . . hm (n)}

care domină pe toate celelalte; mai mult decât atât, se poate arăta că această funcţie este
şi consistentă!
O altă metodă de obţinere a euristicilor este de a pleca de la subprobleme ale problemei
iniţiale. De exemplu, putem să ne concentrăm atenţia doar asupra unora din piesele de pe
puzzle, pe care ı̂ncercăm să le aducem la poziţia corectă, ı̂n timp ce celelate pot ajunge ı̂n
4
Din nou, reamintim că ne-am fixat pe probleme ı̂n care dorim să obţinem soluţie de cost minim.
Pentru probleme de maxim dominarea ı̂nseamnă schimbarea sensului inecuaţiei.
3.6. ALGORITMI DE CĂUTARE LOCALĂ ŞI PROBLEME DE OPTIMIZARE 43

orice poziţie. Pentru multe cazuri, rezultatul este mai bun decât dacă se foloseşte distanţa
Manhattan.
Se poate merge mai departe pe ideea acestor subprobleme: având ı̂n vedere că au
considerabil mai puţine stări decât problema originală, se poate să memorăm ı̂ntr-o bază
de date aceste stări, ı̂mpreună cu costul de ajungere de la ele la starea finală. Construirea
acestei baze5 poate fi laborioasă, dar efortul se amortizează rapid dacă trebuie rezolvate
mai multe probleme.

3.6 Algoritmi de căutare locală şi probleme de optimi-


zare
Algoritmii precedenţi fac o căutare mai mult sau mai puţin sistematică pentru a des-
coperi dacă un nod scop poate fi ajuns plecând de la nodul iniţial. Când acest lucru se
ı̂ntâmplă, se reconstituie calea dintre nodul de start şi nodul scop.
De multe ori, ı̂nsă, secvenţa de paşi care duce din starea iniţială ı̂n starea finală este
irelevantă. De exemplu, pentru problema reginelor pe tabla de şah (secţiunea 1.6.1, pa-
gina 12) nu ne interesează cum s–a ajuns la plasarea acestor regine, ci doar dispunerea lor
efectivă pe tabla de şah. În aceeaşi categorie intră şi designul circuitelor integrate, pro-
gramarea itinerarului optim prin magazine, stabilirea rutelor pentru vehicule, optimizarea
reţelelor de telecomunicaţii, etc.
Pentru asemenea cazuri vom considera o clasă diferită de algoritmi. Căutarea locală
foloseşte doar o singură stare, cea curentă – ceea ce din start ı̂nseamnă că memoria
consumată este redusă; mutările se fac doar ı̂n stare vecină cu cea curentă, iar căile
urmate nu se memorează. Pe lângă cantitatea mică de memorie cerută (de obicei o
cantitate constantă), se pot aborda şi probleme unde căutarea sistematică sau euristică
nu sunt fezabile (de exemplu probleme pe spaţii continue).
De asemenea, se pot folosi algoritmii prezentaţi ı̂n această secţiune şi pentru cazul
problemelor de optimizare, unde să dă o funcţie obiectiv. Deşi nu totdeauna soluţiile
obţinute sunt optime, rezultatele practice sunt satisfăcătoare.
Optimul poate să fie minim sau maxim; avem ı̂n vedere că:

min(f ) = − max(−f )

şi deci exemplificările se vor face cu optimizări convenabil alese, dată fiind trecerea de la
un tip de optim la altul. Vom considera profilul funcţiei obiectiv (figura 3.6); dorim ca
pentru funcţia reprezentată să determinăm care este maximul.
5
Numită bază de tipare, original: pattern database
44 CAPITOLUL 3. CĂUTARE INFORMATĂ

Precum la metodele de căutare prezentate anterior, ı̂n acest context un algoritm de


căutare este:

• complet, dacă ı̂ntotdeauna găseşte un scop, dacă acesta acesta există;

• optimal, dacă găseşte un minim/maxim global

Figura 3.6: Profilul unei funcţii obiectiv; se doreşte obţinerea unsi stări ı̂n care valoarea
funcţiei obiectiv este maximă. Punctul marcat pe grafic reprezintă valoarea aferentă stării
curente, pentru care o modificare poate să ducă la creşterea sau scăderea valorii funcţiei
obiectiv.

3.6.1 Căutarea prin metoda ascensiunii


Metoda ascensiunii6 se bazează pe o idee simplă: ı̂ncearcă să modifici poziţia curentă
printr-o deplasare mică, astfel ı̂ncât să se producă o ı̂mbunătăţire a valorii funcţiei obiectiv.
Pentru profilul reprezentat ı̂n figura 3.6, unde se doreşte maximizarea valorii funcţiei,
dorim ca starea următoare să corespundă unei mişcări spre stânga pe graficul funcţiei
obiectiv.
Algoritmul este dat ı̂n figura 3.7. Algoritmul nu construieşte un arbore de căutare, iar
căutarea acţiunii următoare nu se face mai departe de vecinul imediat. Este ı̂ndreptăţită
deci asemănarea acestui algoritm cu “urcarea pe Everest ı̂ntr-o ceaţă subţire, suferind de
amnezie”. Metoda se mai numeşte şi căutare locală lacomă. Algoritmul se termină atunci
când se ajunge ı̂ntr-un optim, care poate fi local. Căutarea vecinului se face ı̂n imediata
vecinătate, “salturi” prea mari ar putea duce la ratarea unor configuraţii cu valoarea bună.
6
În engleză, ı̂n original: hill climbing.
3.6. ALGORITMI DE CĂUTARE LOCALĂ ŞI PROBLEME DE OPTIMIZARE 45

Figura 3.7: Algoritmul de căutare prin ascensiune (urcarea pe panta cea mai abruptă).
Dacă pentru nodul curent există un vecin de valoarea mai bună, atunci el este ı̂nlocuit cu
vecinul.

Strategia se poate folosi pentru problema damelor pe o tablă de şah (a se vedea


secţiunea 1.6.1, pagina 12). Pentru fiecare pătrat se calculează care ar fi numărul total de
atacuri de pe tabla de şah care are rezulta după plasarea reginei de pe coloana respectivă
ı̂n acel pătrat. Evident, dorim să determinăm configuraţia ı̂n care numărul de atacuri este
minim, ideal 0. Dacă pentru o stare (dispunere a reginelor) oarecare există mai multe
“cele mai bune mutări” se poate alege aleator oricare dintre ele.
Problemele pe care le are algoritmul bazat pe ascensiune sunt:

1. maximele locale: un maxim local este un vârf care este mai ı̂nalt decât punctele
situate ı̂ntr-o vecinătate a lui, dar este mai mic decât maximul global. Algoritmul
se termină atunci când nodul curent nu poate fi ı̂mbunătăţit printr-o mutare ı̂n
apropiere.

2. zonă plată: o zonă plată este o regiune din spaţiul stărilor ı̂n care funcţia de evaluare
este constantă. Poate fi un platou de unde nu există posibilitate de urcare, sau o
coamă de unde se poate obţine un progres. Aşa cum este dat algoritmul din figura
3.7, se produce valoarea constantă din platou.

3. creste7 ; rezultă ı̂n secvenţă de maxime locale pentru care direcţia corectă este dificil
de ales (figura 3.9).

Pentru problema celor opt regine, căutarea prin ascensiune duce la un optim local ı̂n
86% din cazuri; rezolvare cu funcţia de cost nulă se atinge doar ı̂n 14% din cazuri. Trebuie
7
În limba engleză ı̂n original: ridges.
46 CAPITOLUL 3. CĂUTARE INFORMATĂ

(a) O aşezare a opt regine pe tabla de (b) Un minim local pentru problema ce-
şah, cu costul euristic estimat 17. Pen- lor opt regine. Starea prezentată are va-
tru fiecare pătrat se arată valorea acestei loarea 1. Orice mutare din această stare
funcţii dacă s–ar face mutarea reginei de nu micşorează valoarea funcţiei.
pe coloana corespunzătoare ı̂n ea. Cele
mai bune mutări din această poziţie duc
la valoarea 12.

h=5 h=2 h=0

(c) Rezolvarea problemei celor 4 regine. Soluţia obţinută este de cost 0, deci dispunerea este corectă.

Figura 3.8: Rezolvarea problemei reginelor pe tabla de şah prin căutare prin ascensiune.
Se caută un minim al funcţiei care contorizează numărul de atacuri reciproce pe tablă.
3.6. ALGORITMI DE CĂUTARE LOCALĂ ŞI PROBLEME DE OPTIMIZARE 47

Figura 3.9: Creste, una din configuraţiile problematice pentru un algoritm de ascensiune.

să menţionăm totodată că numărul mediu de mutări ı̂n care se ajunge la un minim local
este 3 iar din 4 mutări se ajunge la o rezolvarea a problemei.
Algoritmul, aşa cum a fost enunţat, se opreşte atunci când ajunge ı̂n zonă de platou
sau de coamă. Pentru coamă, ı̂nsă, dacă s-ar permite căutarea pe zona plată, s-ar putea
ajunge din nou la o situaţie de urcuş. O variantă a algoritmului din figura 3.7 este cea
ı̂n care se permit paşi laterali pe zonă plată. Pentru a preveni plimbarea la infinit pe un
platou, se poate impune o limită a numărului de paşi succesivi care păstrează valoarea
funcţiei obiectiv. De exemplu, dacă se stabileşte această limită la 100, pentru problema
damelor se găseşte rezolvare corectă ı̂n 94% din cazuri. Numărul mediu de paşi creşte,
ı̂nsă: 21 de paşi pentru o rezolvare şi 64 pentru eşuare ı̂n minim local.
De asemenea mai există varianta ascensiunii stochastice: dintr-un punct se alege pro-
babilist panta pe care se face urcarea; cu cât panta este mai abruptă, cu atât este mai
mare şansa de alegere a ei ca direcţie următoare (dar nu e imposibil să se aleagă pante
de ı̂nclinaţie mai mică, adică să se ajungă ı̂n stări ı̂n care valoarea nu este cea mai mare
dintre toţi vecinii).
Algoritmii descrişi până acum sunt incompleţi – ei nu găsesc soluţia mereu, deoarece
se blochează ı̂n optime locale. Ascensiunea cu repornire aleatoare stabileşte puncte de
plecare aleator ı̂n spaţiul stărilor. Abordarea duce la un algoritm care este complet cu o
probabilitate ce tinde către 1, din motivul că repornirile aleatoare pot duce la alegerea
unui nod de start corespunzător unui nod scop. Dacă procentul de succes pentru o pro-
48 CAPITOLUL 3. CĂUTARE INFORMATĂ

blemă este p, atunci este nevoie de 1/p reporniri. Pentru problema celor opt regine, unde
p = 0.14, avem nevoie de aproximativ 7 iteraţii pentru a găsi o stare scop (de cost 0),
adică 6 porniri care duc la minim local şi 1 care duce la rezolvare (numerele date trebuie
ı̂nţelese ca valoari medii). Numărul mediu de paşi este 22. Dacă se foloseşte algoritmul
ce permite paşi laterali, un calcul asemănător duce la 25 de paşi necesari (ı̂n medie) pen-
tru rezolvarea problemei. Pentru o problemă de 3 milioane de regine, această abordare
(repornire aleatoare cu căutare cu paşi laterali) descoperă o soluţie ı̂n mai puţin de un
minut!
Problemele din lumea reală deseori au un profil al funcţiei obiectiv cu maxime şi
minime multiple, “ı̂ndesate” pe domeniul de definiţie; algorimul căutării prin ascensiune
duce, de regulă, ı̂ntr-un maxim local suficient de bun pentru tipul de calcul consumat.

3.6.2 Recoacerea simulată


Un algoritm de căutare prin ascensiune este incomplet, deoarece se poate cantona
ı̂ntr-un mimim local. Ar fi de dorit să permitem algoritmului să efectueze mişcări şi
ı̂ntr-o direcţie nefavorabilă, ı̂n speranţa că va permite ieşirea dintr-un minim local. Ca
suport intuitiv, să ne imaginăm o un relief bidimensional ı̂n care dorim să descoperim
minimul local. Lăsăm o bilă să plece dintr-un punct oarecare, dar vom face şi scuturarea
suprafeţei atunci când se ajunge ı̂ntr-un minim, cu intenţia de a scoate bila din minim.
Aceste scuturări sunt suficient de viguroase pentru a scoate bila din minimul local, dar
totuşi nu foarte tari pentru a scoate bila din minim global. O reprezentare este dată ı̂n
figura 3.10.

Figura 3.10: Algoritmul coacerii simulate. Perturbările vor permite scoaterea bilei din
minimele locale.

Algoritmul este inspirat din metalurgie, ı̂n care se ı̂ncălzeşte un metal până la o tempe-
ratură ı̂naltă; pentru a durifica metalul se lasă apoi să se răcească foarte lent, permiţând
3.6. ALGORITMI DE CĂUTARE LOCALĂ ŞI PROBLEME DE OPTIMIZARE 49

structurii cristaline să ajungă ı̂ntr-o stare stabilă. Este important ritmul ı̂n care scade
temperatura.
Algoritmul pentru minimizarea unei funcţii este formalizat ı̂n figura 3.11. Dacă muta-
rea curentă duce ı̂ntr-o situaţie cu valoarea mai mică, atunci se acceptă; dacă noua situaţie
este defavorabilă, atunci se acceptă o mutare cu o anumită probabilitate. Probabilitatea
scade exponenţial cu lipsa de calitate a noii configuraţii şi cu “temperatura” curentă (va-
riabilă). Se poate arăta că dacă temperatura scade suficient de lent, atunci algoritmul
va găsi un optim local cu probabilitatea 1 [3]. Planificarea care apare ca parametu al
algoritmului este o funcţie descrescătoare faţă de timpul t.

Figura 3.11: Algoritmul de coacere simulată. Paşii defavorabili sunt permişi, dar proba-
bilitatea acestora este controlată. Parametrul planifiare determină valoarea temperaturii
T pentru timpul t.

3.6.3 Algoritmi genetici


Sunt inspiraţi din principiile evoluţionismului darwinian, care ı̂ncearcă să explice
evoluţia vieţuitoarelor pe Pământ. Rolul mediului este preluat de către funcţia scop.
Vom detalia algoritmul pentru maximizarea unei funcţii f : [a, b] ⇒ R+

. Indivizii care
alcătuiesc populaţia se numesc cromozomi şi sunt alcătuiţi din gene.
Se porneşte cu o populaţie iniţială, care este supusă apoi unui şir de procese de tipul:

1. selecţie: indivizii care sunt cei mai adecvaţi (faţă de valoarea funcţiei ce se vrea
50 CAPITOLUL 3. CĂUTARE INFORMATĂ

optimizată) sunt favorizaţi să apară de mai multe ori ı̂ntr-o populaţie nouă faţă de
indivizii mai puţin performanţi;

2. ı̂ncrucişare: are loc un schimb de gene ı̂ntre perechi de părinţi, formându-se copii;
aceştia se presupune că moştenesc şi combină performanţele părinţilor.

3. mutaţie: se efectuează nişte modificări minore asupra materialului genetic existent.

Pas 1. Crearea unei populaţii iniţiale de cromozomi. Se consideră mai multe va-
lori pentru variabila x ∈ [a, b]. Numărul acestor valori (numit dimensiunea populaţiei)
este dat ca parametrul al algoritmului, N R (ex. N R = 100). Toate valorile sunt
cuantificate prin cromozomi care sunt şiruri de k biţi (un bit se mai numeste şi
genă), k fiind alt parametru de intrare.
Generarea celor N R cromozomi se face aleator, prin setarea fiecărei gene la valoarea
0 sau 1, la ı̂ntâmplare. Se obţine astfel o populaţie iniţială formată din cromozomii
c1 , . . . , cN R .
Fiecare cromozom c (adica sir de k biţi) va produce un numar x(c) din intervalul
[a, b], astfel: daca valoarea ı̂n baza 10 a cromozomului este v(c), 0 ≤ v(c) ≤ 2k − 1,
atunci valoarea asociată din intervalul [a, b] este:
b−a
x(c) = a + v(c) · ∈ [a, b].
2k − 1

Pas 2. Evoluţia populaţiei. În acest pas se obţin generaţii succesive plecând de la
populaţia iniţială; populaţia de la generaţia g + 1 se obţine pe baza populaţiei de
la generatia g. Operatorii sunt selecţia, ı̂mperecherea (crosssover, ı̂ncrucişarea) şi
mutaţia.

Pas 2.1. Selecţia . Pentru fiecare cromozom din populatie se calculează funcţia
obiectiv vi = f (x(ci )), 1 ≤ i ≤ N R. Apoi se ı̂nsumează valorile funcţiilor
obiectiv obţinute pentru fiecare cromozom ı̂n parte:
NR
X
S= vi
i=1

Pentru fiecare din cei NR cromozomi se calculează probabilitatea de selecţie:


vi
pi = , 1 ≤ i ≤ NR
S
Pentru fiecare cromozom se calculează probabilitatea cumulativă de selecţie:
j
X
qj = pi , 1 ≤ j ≤ N R
i=1
3.6. ALGORITMI DE CĂUTARE LOCALĂ ŞI PROBLEME DE OPTIMIZARE 51

Remarcam că qN R = 1 iar şirul qj defineşte un şir crescător. Cu cât cromozomul


ci determină o valoare mai mare pentru funcţia f (adică valoarea f (v(ci )) este
mai mare), cu atât diferenţa dintre qi şi qi−1 este mai mare.
Se selectează N R numere aleatoare uniform distribuite ı̂n (0, 1]. Pentru fiecare
număr, dacă el se găseşte ı̂n intervalul (0, q1 ] atunci cromozomul c1 este ales
şi depus ı̂ntr-o populaţie nouă; dacă acest număr se află ı̂n intervalul (qi , qi+1 ]
atunci se alege cromozomul ci+1 . Remarcăm ca numărul de cromozomi prezenţi
ı̂n noua populaţie este tot N R, iar cu cât valoarea asociată unui cromozom este
mai mare, cu atât cresc şansele lui spre a fi selectat şi depus ı̂n noua populaţie.
Este foarte probabil ca un astfel de cromozom valoros (valoarea unui cromozom
este cu atât mai mare cu cât valoarea functiei f calculată pentru cromozomul
respectiv este mai mare) să apară de mai multe ori in populaţia nouă; de
asemenea, este foarte probabil ca un cromozom cu o valoare mică pentru funcţia
f să nu apară deloc.
Pas 2.2. Încrucişarea. Pentru fiecare cromozom care a rezultat la pasul ante-
rior se alege o valoare aleatoare, uniform distribuită ı̂n intervalul (0, 1]. Dacă
această valoare este mai mică decât un parametru pc (parametru al aplicaţiei,
e.g. 0.1), atunci cromozomul este ales pentru incrucişare. Se procedează ast-
fel încât să se obţină un număr par de cromozomi (de exemplu se renunţă la
ultimul dacă numărul lor este impar).
Cromozomii aleşi se ı̂ncrucisează astfel: primul selectat cu al doilea selectat, al
3-lea cu al 4-lea, etc. Încrucişarea decurge astfel:
• se alege un număr aleator t intre 0 şi numărul de gene (toţi cromozomii au
acelasi număr de gene k)
• se obţin 2 cromozomi copii astfel: primul va conţine primele t gene ale
primului părinte şi ultimele k − t gene ale celui de–al doilea părinte; al
doilea copil conţine primele t gene ale celui de–al doilea părinte şi ultimele
k − t gene ale primului părinte
• cei doi cromozomi copii vor ı̂nlocui ı̂n populaţie pe părinţi
Pas 2.3. Mutaţia. Populaţiei obţinute i se aplică operator de mutaţie, astfel: pen-
tru fiecare genă a fiecărui cromozom se alege o valoare aleatoare, uniform distri-
buită ı̂n (0, 1]; dacă acest număr este mai mic decât o probabilitate de mutaţie
pm (parametru al aplicaţiei), atunci se modifică valoarea curentă a genei cu
complementul său faţă de 1.

Populaţia obtinută ı̂n pasul 2 reia ciclul de evoluţie. După ce se execută câteva astfel
de evoluţii (sau număr de generaţii, parametru al programului), se raportează valoarea
52 CAPITOLUL 3. CĂUTARE INFORMATĂ

celui mai bun cromozom din ultima generaţie8 .


Se observă că se combină căutarea locală cu explorarea aleatoare şi schimbul de
informaţie ı̂ntre indivizi. Avantajul primar al algoritmilor genetici constă ı̂n acest schimb
de informaţie, adică schimbarea de blocuri de date care au evoluat astfel ı̂ncât să se
ı̂mbunătăţească valoarea produsă. O utilizare eficientă a algoritmilor genetici prespune
crearea unor structuri de date pentru gene şi a unor operatori adecvaţi problemei ce
trebuie rezolvate9 .

3.6.4 Căutare locală ı̂n spaţii continue


Algoritmii de căutare prezentaţi până acum funcţionează ı̂ntr-un univers discret şi ı̂n
care funcţia succesor returnează un set finit de paşi care pot fi efectuaţi dintr-o stare
oarecare. Cele mai multe probleme, ı̂nsă, sunt de tip continuu şi deci posibilităţile de
alegere a următorilor paşi sunt infinite.
Pentru o funcţie reală de mai multe variable f (x1 , . . . , xn ), maximul se regăseşte printre
punctele x = (x1 , . . . , xn ) pentru care ∇f (x) = 0, unde:
!
∂f ∂f
∇f (x) = ,...,
∂x1 ∂xn
De cele mai multe ori acest gradient se poate calcula doar local, nu şi global, deci abor-
darea aceasta directă nu este ı̂ntotdeauna posibilă. Chiar şi aşa, se poate aplica metoda
ascensiunii, luând ca stare următoare:

x ← x + α∇f (x)

unde α este o constantă mică, a cărei valoare poate fi stabilită printr-o multitudine de
metode (volumul de studiu dedicat este impresionant).
Pentru multe probleme, cel mai bun algoritm este bazat pe metoda Newton–Raphson,
folosită pentru determinarea rădăcinilor ecuaţiilor de forma g(x) = 0 (g fiind funcţie de o
singură variabilă). Se calculează o nouă estimare a lui x prin:
g(x)
x←x−
g ′ (x)
Pentru a găsi un maxim al lui f (funcţie de mai multe variabile) următoarea valoarea a
lui x se determină astfel:
x ← x − Hf−1 (x)∇f (x)

unde Hf (x) este matricea hessiană, cu Hij = ∂ 2 f /∂xi ∂xj . Totuşi, inversarea matricilor
este computaţional intensivă pentru un număr mare de variabile.
8
Sau se foloseşte strategia elitistă: se returnează cel mai bun individ al tuturor generaţiilor.
9
S-a stabilit “ecuaţia” Algoritmi genetici + structuri de date = programare evoluţionistă, [4].
Capitolul 4

Probleme de satisfacere a
constrângerilor

Prezentul capitol tratează probleme ı̂n care stările se supun unor restricţii impuse.
Spre deosebire de reprezentările date la metodele de căutare din capitolele anterioare
(reprezentări care ţin cont de particularităţile problemei pentru care se face căutarea
soluţiei), problemele de satisfacere a constrângerilor au o formă mult mai generală, iar
euristicile sunt larg aplicabile.

4.1 Probleme de satisfacere a constrângerilor


O problemă de satisfacere a constrângerilor (PSC) este definită ca un set de variabile
X1 , . . . , Xn şi un set de constrângeri C1 , . . . Cm . Fiecare variabilă are un domeniu nevid
de valori Di . O constrângere se referă la un subset de variabile şi exprimă condiţii asupra
combinaţiilor de valori pentru variabilele ı̂n discuţie. O stare a problemei este o asignare
de forma {Xi = vi , Xj = vj , . . .}. O stare ı̂n care valorile respectă orice restricţie Ck , 1 ≤
k ≤ m se numeşte consistentă sau legală. O soluţie a problemei este o asignare consistentă
şi care dă valori pentru fiecare variabilă. Uneori este implicată şi o funcţie obiectiv care
trebuie optimizată.
Tratarea unei probleme ca o PSC poate fi benefică: ı̂n primul rând, se poate formaliza
foarte usor metoda generală de rezolvare, iar aplicarea ei pe o problemă concretă ı̂nseamnă
scrierea adecvată a funcţiilor de succesor şi a testului de scop (a se vedea algoritmul
general); ı̂n al doilea rând, se dau niste euristici generice care nu sunt dependente de
domeniul problemei (secţiunea 4.2.1 şi următoarele).
Exemplu: dorim să colorăm harta regiunilor Australiei (figura 4.1) cu 3 culori, astfel
ı̂ncât să nu existe două regiuni vecine care au aceaşi culoare. Variabilele pot fi considerate
aprevierile pentru regiuni, respectiv: W A, N T , Q, N SW , V , SA, T , domeniul fiecărei

53
54 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

variabile este {rosu, verde, albastru}, iar restricţiile se pot exprima sub forma unor perechi
de forma X 6= Y unde X, Y ∈ W A, N T, Q, N SW, V, SA, T şi X, Y vecine pe hartă.

Northern
Territory
Western Queensland
Australia

South
Australia
New South Wales

Victoria

Tasmania

Figura 4.1: Regiuni din Australia.

Deseori se recurge la reprezentarea acestor restricţii sub forma de graf ı̂n care două
variabile sunt legate printr-o muchie dacă se supun unei constrângeri. De exemplu, pentru
problema colorării regiunilor se leagă prin muchii noduri reprezentând regiuni vecine (şi
care trebuie colorate diferit) - fig 4.2.

NT
Q
WA

SA NSW

V
Victoria

Figura 4.2: Graf de constrângeri pentru problema colorării hărţii Australiei.

O PSC se poate formula astfel:

• stare iniţială: mulţimea vidă, corespunzătoare lipsei de asignări de valori oricărei


variabile;

• funcţie succesor : se asignează unei variabile ce nu are valoare dată (numită variabilă
liberă) o valoare din domeniul asociat, cu condiţia ca asignarea nou obţinută să fie
consistentă (să nu ı̂ncalce restricţiile impuse);

• test scop: asignarea curentă este completă, nu mai există variabile libere
4.1. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR 55

• costul căii: o constantă pentru fiecare asignare de variabilă

Deoarece fiecare soluţie are toate cele n variabile cu valori asignate rezultă că adâncimea
soluţiei este n. Algoritmii folosiţi pentru rezolvarea acestui tip de probleme sunt cei de
căutare ı̂n adâncime (adâncimea se cunoaşte, iar cicluri nu putem avea, deoarece la fiecare
pas considerăm o altă variabilă liberă). De asemenea, algoritmii pentru căutare locală dau
rezultate bune.
Domeniile de valori pot fi discrete şi finite (precum mai sus) sau nu, şi ı̂n acest al doilea
caz restricţiile se dau folosind un limbaj care permite descrierea relaţiilor (de exemplu
x + y < z şi x − y = 4). Problemele cu domenii de tip continuu sunt studiate de către
cercetările operaţionale.
O constrângere poate fi unară – dacă se referă la o singură variabilă – şi atunci este
simplu de tratat, pentru că se modifică corespunzător domeniul de valori asociat prin
excluderea valorilor care nu satisfac restricţia. Deseori se dau restricţii binare, care implică
exact două variabile. De exemplu, pentru graful din figura 4.2 orice muchie reprezintă o
restricţie binară.
Există, desigur, şi restricţii de ordin mai mare, implicând cel puţin trei variabile.
Avem asemenea situaţie ı̂n problema următoare1 : să se substituie fiecare literă printr-o
cifră diferită, astfel ı̂ncât ecuaţia să fie adevărată

unu+
patru =
-----
cinci

Constrângerea ca valorile caracterelor diferite să fie diferite poate fi redusă la câteva de tip
binar - u 6= i, u 6= n, etc; apoi, pentru fiecare din cele cinci coloane avem câte o restricţie:



 u + u = i + 10x1





 n + r + x1 = c + 10x2


u + t + x = n + 10x3
2 (4.1)

a + x3 = i + 10x4






p + x4 = c

unde xi reprezintă (eventualul) transport de la suma de cifre. Restricţiile pot fi repre-


zentate sub forma de hipergraf, precum in figura 4.3. Se poate arăta că problemele cu
domenii finite pot fi reduse la probleme cu restricţii binare prin introducerea unor vari-
abile auxiliare. Din acest motiv ne vom concentra asupra problemelor cu constrângeri
binare.
1
Problemă de criptaritmetică.
56 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

Figura 4.3: Hipergraf de constrângeri ataşat problemei de criptaritmetică. Pătratele


definesc restricţii la care participă variabilele - pătratul de pe primul rând este reprezentare
a condiţiei ca valorile caracterelor diferite să fie diferite, iar cele de pe penultimul rând
reprezintă constrângerile din sistemul 4.1.

4.2 Căutare backtracking pentru PSC


Formularea dată pentru PSC (ı̂n special prezenţa unei funcţii succesor) ne permite
să sperăm că putem trata problemele de acest tip prin orice algoritm de căutare de care
dispunem. Totuşi, acest tip de probleme trebuie abordat cu o anumită schemă de căutare.
Să plecăm de la o PSC ı̂n care avem n variabile care pot lua valori dintr-o mulţime
finită cu d elemente. Dacă vrem să folosim căutarea ı̂n lăţime, atunci:

• la nodul rădăcină (cel care nu are nici o variabilă nu are valoare fixată) avem n · d
posibilităţi de a continua, deoarece avem n variabile şi pentru fiecare poate fi stabilită
o valoare din cele d;

• la nivelul următor avem (n − 1)d alegeri, pentru că au rămas mai puţine variabile

• ı̂n total obţinem n! · dn frunze

Numărul de frunze este mult mai mare decât dn care s-ar obţine prin enumerarea tuturor
posibilităţilor de asignare de valori pentru cele n variabile. Ca atare, aplicarea unei metode
de căutare oarecare poate să nu fie o idee bună.
Numărul supraestimat de frunze a apărut din cauză că la fiecare pas permitem luarea
ı̂n considerare a tuturor variabilelolor posibile, pe când soluţia unei PSC nu este senzitivă
la ordine. Este admisibil ca la fiecare pas să se ia ı̂n considerare doar o variabilă. Aşa
numărul de frunze devine dn .
Căutarea de tip backtracking este de fapt o căutare de tip “mai întâi ı̂n adâncime” care
generează un singur nod descendent. Deoarece reprezentarea PSC este standardizată, ea
se poate aplica independent de specificul domeniului. Algoritmul este dat ı̂n figura 4.4.
Fiind un algoritm de căutare neinformată, ı̂n practică el nu se comportă bine pentru
probleme de dimensiune mare. Există ı̂nsă nişte metode generale care măresc eficienţa
4.2. CĂUTARE BACKTRACKING PENTRU PSC 57

Figura 4.4: Algoritmul backtracking pentru probleme de satisfacere a constrângerilor.

lor. Metodele reprezintă răspunsuri la următoarele ı̂ntrebări:

1. Care variabilă ar trebui luată ı̂n considerare la pasul curent, şi ı̂n ce ordine ar trebui
ı̂ncercate valorile?

2. Care sunt implicaţiile asignării curente de valoare pentru o variabilă pentru alte
variabile ce ı̂ncă nu au valori asociate?

4.2.1 Ordonarea valorilor şi a variabilelor


Algoritmul backtracking conţine linia:

var<-selecteaza-variabila-neasignata(variabile[psc], asignare, psc)

dar nu se spune cum anume se face selectarea de variabilă. Se poate, desigur, opta,
pentru o ordine fixă a variabilelor. Dar putem observa că dacă asignăm W A = rosu şi
N T = verde, pentru SA rămâne o singură valoare care poate fi asignată, deci are sens
să considerăm la pasul următor variabila SA, mai degrabă decât Q, N SW sau V . După
acest pas, Q, N SW şi V au domeniu de alegere al valorilor restrâns la câte o variabilă.
Intuitiv, ar trebui să considerăm la fiecare pas variabila care are cele mai puţine valori
candidat.
Strategia numită “minim de valori rămase”(MVR) decide alegerea variabilei care are
cele mai puţine variante, astfel se ı̂ncearcă producerea unei eşuări cât mai devreme posibil
58 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

ı̂n calea de căutare curentă, astfel ca să se reteze căile care nu duc la soluţii. De exemplu,
dacă avem o variabilă care are 0 valori rămase, atunci algoritmul o va alege pe aceasta
şi se va detecta eşuare. Acest lucru este corect, deoarece oricum mai devreme sau mai
târziu se ajunge la imposibilitatea de a da valoare pentru variabila ı̂n cauză, deci astfel
se evită nişte căutări care nu ar putea produce soluţie.
În practică, această strategie simplă duce la ı̂mbunătăţiri ale vitezei de 3 până la
3000 de ori. Se discută ı̂n secţiunea 4.2.2 modul ı̂n care contorizarea numărului de valori
disponibile rămase se poate face eficient.
Euristica nu este utilă la alegerea primei variabile, deoarece fiecare regiune poate avea
trei culori. Într-un asemenea moment se foloseşte euristica gradului care indică alegerea
acelei variabile care are cele mai multe contrângeri cu alte variabile fără valori asignate.
Noţiunea de grad face aici referire la valori definite ı̂n teoria grafurilor. De exemplu,
pentru harta din figura 4.1 avem că SA are gradul 5, alte variabile au valori 2, 3, 0. Ca
atare, se va alege ca primă variabilă SA (şi paşii următori, cu aceeaşi euristică duc la
rezolvarea problemei fără a fi nevoie să se revină). Strategia MVR este mult mai efectivă
decât aceasta, dar euristica gradului este utilă la deciderea următorului pas ı̂ntr-o situaţie
de egalitate.
Odată ce s–a ales variabila pentru care se va dă valoare trebuie determinat care este
ordinea de considerare a valorilor. Pentru asta se aplică strategia celei mai puţin con-
strângătoare valori. Concret, se preferă valorile care produc cele mai puţine eliminări
de valori pentru alte varibile neasignate. Ideea este de a se lăsa maximum de flexibili-
tate (posibilităţi) pentru alegerile următoare. De exemplu, dacă luăm W A = verde şi
N T = verde, iar pentru Q setăm culoarea albastră, atunci SA rămâne fără posibilitate
de a i se atribui valoare. Evident, dacă se cere generarea tuturor soluţiilor pentru PSC
sau dacă problema nu are nicio soluţie, strategia este inutilă.

4.2.2 Propagarea informaţiilor prin constrângeri


Până acum algoritmul a considerat constrângerile pentru o variabilă doar când ea era
aleasă de către selecteaza-variabila-neasignata. Dacă se iau ı̂n considerare aceste
constrângeri mai repede de acest moment, atunci se poate reduce foarte mult spaţiul de
căutare.

Verificare ı̂nainte

Ori de câte ori unei variabile X i se asignează o valoare, pentru fiecare variabilă Y
care este conectată cu X printr–o restricţie se şterge din domeniul lui Y valorile care sunt
inconsistente cu proaspăta valoare a lui X. Tabelul 4.1 arată evoluţia căutării cu verificare
4.2. CĂUTARE BACKTRACKING PENTRU PSC 59

ı̂nainte. Se poate observa că după ce se asignează W A = rosu şi Q = verde, domeniile
pentru N T şi SA conţin doar un singur element; am redus deci factorul de ramificare
pentru aceste două variabile. Este clar că această verificare ı̂nainte face pereche bună cu
strategia MVR, pentru care următoarele variabile luate ı̂n considerare sunt SA şi N T .
Verificarea ı̂nainte este un mod eficient de calcularea a informaţiei de care MVR are nevoie.
Mai observăm că după ce setăm V = albastru domeniul lui SA este gol. Deci verifi-
carea ı̂nainte a determinat că asignarea parţială {W A = rosu, Q = verde, V = albastru}
este inconsistentă cu cerinţele problemei, necesitând un pas ı̂napoi.

WA NT Q N SW V SA T
Domeniile iniţiale RVA RVA RVA RVA RVA RVA RVA
După W A = rosu R VA RVA RVA RVA VA RVA
După Q = verde R A V RA RVA A RVA
După V = albastru R A V R A RVA

Tabela 4.1: Evoluţia in problema colorării hărţilor folosind verificarea ı̂nainte. R este
roşu, V este verde, A este albastru.

Propagarea constrângerilor

Cu toate că verificarea ı̂nainte depistează inconsistenţe, ea nu le depistează pe toate.


De exemplu, să considerăm a treia linie a tabelului 4.1: când W A = rosu şi Q = verde,
atât N T cât şi SA sunt limitate la culoarea albastră; dar întrucât ele sunt şi regiuni vecine,
trebuie să fie de culori diferite. Deci verificarea ı̂nainte nu este suficient de pătrunzătoare
ı̂n a detecta incompatibilităţi. Propagarea constrângerilor este un termen general, de-
semnând propagarea restricţiilor pentru o variabilă conform constrângerilor pentru alte
variabile. Mai clar, propagăm de la W A şi Q la N T şi SA (precum la verificarea ı̂nainte),
dar luăm ı̂n considerare şi constrângerea dintre N T şi SA pentru a detecta inconsistenţa.
Evident, dorim să facem o asemenea propagare de constrângeri cu efort computaţional
cât mai mic.
Consistenţa arcului este o metodă rapidă de propagare a constrângerilor care este mult
mai puternică decât verificarea ı̂nainte. Un arc se referă la o legătură direcţionată de la
o variabilă la alta. Date fiind două variabile X şi Y cu domeniile de valori aferente, un
arc de la X la Y este consistent dacă pentru orice valoare din domeniul lui X avem că
există măcar o valoarea compatibilă (consistentă) ı̂n domeniul lui Y . De exemplu, pentru
a treia linie din tabelul 4.1 se observă că domeniul pentru SA este {albastru}, iar pentru
N SW este {rosu, albastru}. Pentru SA = albastru avem o asignarea consistentă a lui
N SW şi anume N SW = rosu. Invers, ı̂nsă, nu este adevărat: pentru N SW = albastru
60 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

nu avem nici o valoare potrivită ce poate fi asignată lui SA. Arcul (N SW, SA) poate fi
făcut consistent prin eliminarea lui albastru din domeniul de valori al lui N SW .
Acelaşi proces se poate aplica şi perechii de variabile SA şi N T (ele fiind legate printr-o
restricţie): tot din linia 3 a tabelului 4.1 se observă că amândouă variabilele au domeniul
{albastru}, şi deci acţionarea pentru a menţine consistenţa oricărui arc (de la SA la N T
sau invers) duce la domeniu de valori vid pentru una din variabile. Se va produce deci
un pas ı̂napoi, datorită detectării devreme a imposibilităţii de continuare. Consistenţa
arcului “vede mai departe” decât propagarea ı̂nainte.
Procesul de verificare a consistenţei arcelor trebuie aplicat ı̂n mod repetat până când
nu mai există inconsistenţe. Acest proces se poate face ı̂nainte de ı̂nceperea căutării
sau după fiecare asignare de valoare. Ori de câte ori se face ştergerea unei valori din
domeniul unei variabile X, trebuie verificate toate arcele de la variabile Y la X. Algoritmul
consistenţei arcelor AC-3 este dat ı̂n figura 4.5 şi foloseşte o coadă care menţine arcele
ce trebuie să fie verificate din punct de vedere al consistenţei. Fiecare arc (Xi , Xj ) este
cercetat pe rând pentru consistenţă. Dacă se şterge vreo valoare din domeniul lui Xi ,
atunci toate arcele de forma (Xk , Xi ) ce indică spre variabila Xi sunt adăugate la coadă.
Complexitatea este O(n2 d3 ) [1]; beneficiile obţinute prin folosirea acestei strategii acoperă
efortul computaţional. Tot ı̂n [1] se explică de ce consistenţa arcelor nu determină toate
inconsistenţele.
Se pot efectua verificări de k-consistenţe, ı̂n care pentru orice set de k − 1 variabile
care au o asignare consistentă, o oricare a k-a variabilă poate să primească o valoare
consistentă (pentru k = 2 avem obţinem chiar consistenţa arcelor). Totuşi, cu cât k este
mai mare cu atât verificările sunt mai complexe.

4.3 Căutare locală pentru PSC


Algoritmii de căutare locală se dovedesc a fi foarte eficienţi ı̂n rezolvarea multor PSC.
Ei pornesc de la o asignare pentru toate variabilele iar funcţia succesor modifică valoarea
unei variabile la fiecare pas.
Cea mai evidentă euristică pentru selectarea valorii undei variabile este alegerea unei
valori care produce numărul minim de conflicte cu alte variabile — euristica conflicte-
minime. Algoritmul este dat ı̂n figura 4.6.
Euristica este extrem de productivă pentru problema celor n regine; dacă se face
abstracţie de timpul cerut pentru poziţionarea iniţială a reginelor, atunci timpul de rulare
este relativ independent de dimensiunea problemei. De exemplu, poate rezolva problema
pentru 1 milion de regine in 50 de paşi. Trebuie spus ı̂nsă că această problemă are
mulţimea soluţiilor densă ı̂n mulţimea stărilor, deci o soluţie este uşor de găsit. Strategia
4.3. CĂUTARE LOCALĂ PENTRU PSC 61

Figura 4.5: Algoritmul AC-3 pentru consistenţa arcelor. După aplicarea lui fiecare arc
este consistent sau există variabile al căror domeniu este gol (şi ı̂n acest ultim caz PSC
nu poate fi rezolvată).

Figura 4.6: Algoritmul corespunzător euristicii conflicte-minime. Funcţia conflicte conto-


rizează numărul de constrângeri ı̂ncălcate de o valoare particulară.
62 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

Problemă Backtracking BT+MVR Verificare ı̂nainte VI+MVR Conflicte-minime


SUA (> 1000K) (> 1000K) 2K 60 64
n-regine (> 40000K) 13500K (> 40000K) 817K 4K
Zebra 3859K 1K 35K 0.5K 2K
Random 1 415K 3K 26K 2K
Random 2 942K 27K 77K 15K

Tabela 4.2: Comparaţie pentru diferitele variante de backtracking pentru probleme de


satisfacere a constrângerilor. K este abreviere pentru kilo; “Backtracking” se referă la ba-
cktracking clasic, “BT+MVR” este folosirea euristicii valorii minime rămase; “VI+MVR”
se referă la verificare ı̂nainte + strategia valorilor minime rămase; “Conflicte-minime” este
algoritmul din secţiunea 4.3. Numerele din paranteză arată că nu s-a putut determina o
soluţie ı̂n timpul alocat pentru rulare.

funcţionează bine şi pentru probleme “grele”: de exemplu, planificarea operaţiilor din
decursul unei săptămâni pentru telescopul Hubble a fost redusă la 10 minute, de la 3
săptămâni.
Un alt avantaj al căutării locale este că permite cătarea unei soluţii atunci când o parte
din restricţii se schimbă “pe loc”. De exemplu, pentru o problemă de planificare a zbo-
rurilor, dacă un aeroport devine indisponibil (accidente, condiţii meteo) atunci restricţia
corespunzătoare poate fi uşor introdusă şi plecând de la o planificare precedentă se poate
obţine una adecvată pentru situaţia actuală ı̂n timp foarte scurt.
Tabelul 4.2 conţine o comparaţie a performanţelor diferitelor variante de backtrac-
king pentru un set de probleme. Compararea se face pe baza numărului de verificări de
consistenţă. Prima problemă este găsirea unei colorări adecvate a hărţii SUA pentru 50
de state şi 4 culori. A doua problemă se referă la reolvarea problemei celor n regine,
pentru n ∈ [2, 50]. A treia problemă este jocul “Puzzle Zebra” [1]. Ultimele două sunt
probleme artificiale alese aleator. Rezultatele sugerează că verificarea ı̂nainte ı̂mpreună
cu MVR este mai bună decât orice altă strategie backtracking, dar nu ı̂ntotdeauna mai
bună decât căutarea locală cu conflicte minime.

4.4 Structura problemei


Vom examina modul ı̂n care structura problemei poate fi de ajutor pentru găsirea ra-
pidă a unei soluţii. Un caz simplu este acela ı̂n care problema este compusă din mai multe
subprobleme care se pot rezolva independent; de exemplu, pentru problema colorării hărţii
Australiei, Tasmania este o subproblemă care poate fi rezolvată separat. Reducerile de
complexitate pot fi mari, iar timpii de rulare obţinuti sunt acceptabili. Singura problemă
4.4. STRUCTURA PROBLEMEI 63

este că o asemenea situaţie este rar ı̂ntâlnită.


Un alt caz simplu de rezolvat este acela ı̂n care graful constrângerilor formează un
arbore. Se poate arăta că:

Teorema 3 Dacă graful de constrângeri nu are cicluri, atunci PSC poate fi rezolvată cu
complexitatea O(n · d2 ).

Sporul de performanţă este evident prin comparaţie cu performanţa generală a algorit-


mului backtracking, O(dn ).
În acest punct ne putem pune problema cum anume reducem o problemă la una care
are graful structurat ca un arbore. Există două metode: una se bazează pe eliminarea
unor variabile, cealaltă pe crearea de grupări de noduri.
Prima variantă funcţionează astfel: se determină un set de noduri prin a cărui elimi-
nare se ajunge la un graf de tip arbore; de exemplu, pentru graful din figura 4.2 dacă se
elimină nodul corespunzător variabilei SA, atunci graful obţinut este cel din figura 4.7,
pentru care teorema de mai sus ne asigură de existenţa unui comportament foarte bun.
Eliminarea nodului se face prin asignarea unei valori din domeniul asociat şi ştergerea
valorilor incompatibile din domeniile variabilelor care sunt unite prin restricţie cu nodul
eliminat. Desigur, valoarea aleasă pentru SA poate să ducă la imposibilitatea de re-
zolva problema, dar aceste valori pot fi ı̂ncercate pe rând (conform principiului general al
metodei backtracking).
Schiţat, algoritmul arată astfel:

1. alege un subset S din V ariabile[P SC] astfel ı̂ncât graful să devină un arbore după
eliminarea nodurilor din S şi a arcelor corespunzătoare. S se va numi set de eliminare
a ciclurilor.

2. Pentru fiecare asignare posibilă pentru variabilele din S care satisfac constrângerile
PSC:

(a) elimină din domeniul variabilelor rămase valorile care sunt inconsistente cu
asignările pentru S

(b) dacă PSC rămasă are o soluţie, returneaz–o ı̂mpreună cu asignările pentru S

Găsirea celui mai mic set de eliminare a ciclurilor este o problemă NP-grea, dar există
algoritmi eficienţi pentru obţinerea unor aproximări. Dacă acest set are dimensiunea c,
atunci complexitatea variantei de mai sus este O(dc · (n − c)d2 ).
A doua variantă porneşte de la construirea unei descompuneri a grafului de con-
strângeri ı̂ntr–un arbore format dintr-un set de probleme interconectate. Fiecare sub-
problemă se rezolvă independent, apoi soluţiile rezultate sunt combinate. Figura 4.8
64 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR

NT
Q
WA

NSW

V
Victoria

Figura 4.7: Prin eliminarea variabilei SA, graful de constrângeri din figura 4.2 devine un
arbore, pentru care rezolvarea se face ı̂n timp liniar.

Figura 4.8: O descompunere sub formă de arbore a grafului de constrângeri din figura 4.2

arată descompunerea problemei de colorare a hărţii Australiei. Descompunerea trebuie


să ı̂ndeplinească următoarele trei condiţii:

1. fiecare variabilă din problema originală trebuie să apară ı̂n cel puţin una din sub-
probleme;

2. dacă două variabile sunt conectate printr-o constrângere ı̂n problema originală,
atunci ele trebuie să apară ı̂mpreună ı̂n cel puţin una dintre subprobleme;

3. dacă o variabilă apare ı̂n două subprobleme din arbore, atunci ele trebuie să apară
ı̂n fiecare subproblemă de-a lungul unei căi care conectează aceste subprobleme.

Fiecare din subprobleme se rezolvă independent; dacă una dintre ele nu are soluţie,
4.4. STRUCTURA PROBLEMEI 65

atunci ı̂ntreaga problemă nu are soluţie. Constrângerile care trebuie respectate se rezolvă
prin interpretarea fiecărei subprobleme ca o variabilă mai mare şi aplicarea algoritmului
eficient de rezolvare pentru arbore. Constrângerile pentru acest graf arbore reprezintă
condiţia ca subprobleme cu variabile comune să aibe aceeaşi valoare pentru variabilele
partajate.
66 CAPITOLUL 4. PROBLEME DE SATISFACERE A CONSTRÂNGERILOR
Capitolul 5

Agenţi logici

5.1 Motivaţie

Capitolul introduce agenţii bazaţi pe cunoaştere. Conceptele care se discută sunt


reprezentarea cunoaşterii şi procesele de raţionare – preocupări centrale ale inteligenţei
artificiale.

Spre deosebire de agenţii care aplică metodele de căutare prezentate ı̂n capitolele
anterioare, agenţii logici beneficiază de cunoaştere exprimată ı̂n cele mai variate forme,
combinând şi recombinând informaţia pentru a răspunde unor scopuri diverse. În plus,
cunoaşterea şi raţionarea de asemenea joacă un rol crucial ı̂n lucrul cu medii parţial
observabile. Un agent bazat pe cunoaştere poate să producă noi cunoştinţe pe baza
cunoştinţelor generale şi a percepţiilor ; de exemplu, un medic poate să pună un diagnostic
unui pacient, plecând de la simptomele acestuia şi cunoştinţele pe care i le-a asigurat
formarea medicală. Dar, deşi simptomele sunt cunoscute, un medic nu cunoaşte absolut
tot despre pacientul tratat – şi de aici rezultă o altă caracteristică a agenţilor logici:
necesitatea de a lucra cu observaţiile parţiale.

Un alt motiv pentru care se studiază agenţii bazaţi pe cunoaştere este flexibilitatea
produselor rezultate. Astfel de agenţi sunt ı̂n stare să accepte noi sarcini şi să câştige
rapid noi competenţe prin ı̂nvăţare sau prin descoperire de noi informaţii.

Principalul mod ı̂n care se abordează agenţii logici este bazat pe logică (propoziţională,
apoi de ordinul ı̂ntâi). Spectrul abordărilor curente este ı̂nsă mult mai bogat, deoarece ı̂n
lumea reală apar probleme legate de incertitudine, aici intervenind teoria probabilităţilor
şi sistemele fuzzy, iar partea de ı̂nvăţare se abordează de regulă prin teoria aferentă
domeniului ı̂nvăţării automate - reţele neuronale, arbori de decizie (vezi [5], [6]).

67
68 CAPITOLUL 5. AGENŢI LOGICI

5.2 Agenţi bazaţi pe cunoaştere

Componenta centrală a unui agent este baza de cunoştinţe (BC), adică un set de
enunţuri care fac parte din domeniul de lucru al agentului. Fiecare enunţ este exprimat
ı̂ntr–un limbaj numit limbaj de reprezentare a cunoştinţelor şi reprezintă nişte aserţiuni
despre lume.
Mai este nevoie de un mecanism care să adauge noi propoziţii la BC şi unul care să
determine ce se cunoaşte (sau ce anumte trebuie să se facă la pasul curent). Numele
lor este Spune şi Intreaba. Al doilea mecanism presupune inferenţe – metode prin care
pornind de la cunoştinţe se deduc altele.
Figura 5.1 conţine o schiţă a unui program bazat pe cunoaştere. El preia o percepţie
ca intrare şi returnează o acţiune. Agentul menţine o BC care iniţial este formată din
cunoştinţele de bază şi care se ı̂mbogăţeste pe măsură ce i se comunică percepţii sau
propoziţii. Primul pas este de a comunica bazei de cunoştinţe ceea ce s-a perceput; la
pasul al doilea se ı̂ntreabă ce ar trebui făcut. La pasul al treilea i se comunică BC că s-a
efectuat acţiunea indicată la pasul anterior; această a doua comunicare este utilă pentru
a ţine BC ancorată ı̂n contextul curent.

Figura 5.1: Un agent generic ce acţionează plecând de la o bază de cunoştinţe.

Creeaza-enunt-perceptie translatează ı̂n limbajul formal specific bazei de cunoştinţe


percepţia curentă; demn de remarcat este că timpul apare şi el ca o dimensiune a percepţiei.
Creeaza-interogare-actiune contruieşte o propoziţie care interoghează BC ce acţiune
ar trebuie să se execute la momentul curent. În sfârşit, Creeaza-enunt-actiune con-
struieşte un enunţ care codifică faptul că acţiunea indicată a fost ı̂ndeplinită.
Iniţial, baza de cunoştinţe este construită printr-o succesiune de apeluri ale lui Spune,
prin care se comunică cunoştinţe generale şi principii. Este un mod declarativ de definire a
unui domeniu, care măreşte mult aria de aplicabilitate a acestor agenţi. O altă modalitate
de ı̂mbogăţire a BC este prin ı̂nvăţare automată pe baza percepţiilor.
5.3. JOCUL "LUMEA MONSTRULUI 69

5.3 Jocul "lumea monstrului


Secţiunea conţine o descriere a unui joc, folosită ca suport de exemplificare ı̂n restul
capitolului. Se dau mai multe camere dispuse ı̂ntr-o matrice; camerele comunică ı̂ntre
ele; ı̂ntr–o cameră se găseşte un monstru care mănâncă pe oricine intră acolo (şi jocul se
termină). În alte camere se află gropi; dacă se intră ı̂ntr–o asemenea groapă, atunci jocul
se termină. Într-o cameră se află aur; luarea lui determină sfârşitul jocului. Un personaj
ı̂narmat cu o săgeată are posibilitatea de a se muta dintr-o cameră ı̂n alta ı̂n căutarea
aurului.
Detaliile sunt:

• măsura de performanţă este dată de suma valorilor ataşate fiecărui eveniment: 1000
pentru preluarea aurului, -1000 pentru căderea ı̂ntr–o groapă sau omorârea de către
monstru, -10 pentru aruncarea săgeţii şi -1 pentru orice altă acţiune;

• mediul: o matrice de camere de 4 pe 4. Agentul ı̂ncepe ı̂n camera din stânga jos,
de coordonate [1, 1], cu faţa spre dreapta. Locaţia camerelor cu aurul, găurile şi
monstrul sunt alese aleator, dar se garantează că nu sunt ı̂n locaţia de pornire.

• acţiuni: agentul poate să se deplaseze ı̂n direcţia ı̂n care se află cu faţa, poate să se
ı̂ntoarcă la stânga sau la dreapta cu 90◦ . Personajul moare dacă intră ı̂n camera cu
monstrul viu. Dacă exact ı̂n faţa lui este un zid, atunci rămâne pe loc. Acţiunea
“apucă” este folosită pentru preluarea aurului, dacă se află ı̂n aceeaşi cameră cu el.
Acţiunea “trage” se poate folosi pentru a lansa săgeata ı̂n direcţia ı̂n care e orientat;
săgeată zboară până se izbeşte fie de zid, fie de monstru.

• senzori: agentul are cinci senzori:

– ı̂n pătratul care conţine monstrul şi ı̂n camerele vecine (dar nu pe diagonală)
se percepe miros;

– ı̂n camerele vecine (dar nu pe diagonală) cu o cameră care conţine o groapă se


simte briză de aer;

– ı̂n camera care conţine aurul se percepe strălucire

– când agentul se izbeşte de un zid, se aude bufnitură

– când monstrul este omorât, se aude ţipăt

Cele cinci percepţii determină un vector cu cinci elemente care se raportează ori de
câte ori agentul (personajul) intră ı̂ntr–o cameră.
70 CAPITOLUL 5. AGENŢI LOGICI

Cunoştinţele date mai sus se introduc ı̂ntr–o BC. De fiecare dată când agentul vizitează
o cameră se primeşte vectorul de percepţii şi se pot face deducţii de tipul: e posibil ca ı̂n
camera [2, 1] să fie o groapă, sau sigur ı̂n camera [3, 3] nu se află monstru, deducţii care
se adaugă la BC (pentru a evita “redescoperirea roţii”).

5.4 Logica
Secţiunea prezentă conţine generalităţi despre reprezentări logice şi raţionament. De-
taliile sunt specifice logicilor concrete ce se studiază (logica propoziţiilor, logica predica-
telor, logica temporală, logica fuzzy).
Orice logică trebuie să clarifice două aspecte: sintaxa şi semantica. Sintaxa reprezintă
o specificare a ceea ce este corect exprimat ı̂n logica respectivă şi se poate reprezenta sub
formă de diagrame sau propoziţii folosind simboluri.
Semantica defineşte ı̂n general semnificaţia unui enunţ. În cadrul logicii ea permite
stabilirea unei valori de adevăr pentru un enunţ care este corect formulat din punct de
vedere sintactic. Mai mult, semantica trebuie să specifice valoarea de adevăr pentru fiecare
enunţ faţă de fiecare lume posibilă; de exemplu, a > b este adevărată pentru a = 3 şi
b = 2, dar falsă pentru a = b = 4.
O “lume posibilă” (set de valori ataşat variabilelor) se va numi de acum ı̂nainte model
şi vom spune că m este un model al enunţului a dacă a este adevărat ı̂n lumea m.
Raţionamentul logic (sau deducţia, adică partea de interes major ı̂ntr-o logică) repre-
zintă modul ı̂n care se poate deduce un enunţ dintr-un altul. Definiţia formală a deducţiei
este:

Definiţia 10 Spunem că din α se deduce β şi notăm α |= β dacă ı̂n orice model al
enunţului α avem că şi β este adevărat.

De exemplu, din propoziţia a > b se poate deduce şi b ≤ a, deoarece pentru orice
combinaţie de numere a şi b care fac prima propoziţie adevărată şi al doilea enunţ este
adevărat. Pentru jocul cu lumea monstrului, să presupunem că agentul nu detectează
curent de aer ı̂n poziţia [1, 1] şi detectează curent de aer ı̂n [2, 1]. Acestea ı̂mpreună cu
regulile jocului1 formează baza de cunoştinţe. Agentul este interesat dacă ı̂n [1, 2], [2, 2],
[3, 1] se află găuri. Fiecare din camere poate să conţină sau nu gaură, deci ı̂n total avem
8 modele posibile. Vom considera acele modele pentru care baza de cunoştinţe nu este
contrazisă; există trei asemenea cazuri din cele 8 posibile şi ı̂n toate propoziţia “nu există
groapă ı̂n [1, 2]” este adevărată, pe când “nu există groapă ı̂n [2, 2]” şi “nu există groapă
1
Pentru moment nu ne interesează cum anume se exprimă formalizat aceste reguli, vom presupune că
ele sunt reprezentate convenabil.
5.5. LOGICA PROPOZIŢIONALĂ 71

ı̂n [3, 1]” nu sunt adevărate pentru toate cele trei cazuri; şi negaţiile lor sunt ı̂n situaţie
similară.
Această metodă de verificare a posibilităţii de deducere se numeşte algoritmul veri-
ficării modelelor. Vom dezvolta mai mulţi algoritmi de deduţie; dacă avem un astfel de
algoritm i, atunci vom scrie α |=i β şi vom citi “β este dedus (sau derivat) din α prin i”
sau “i ı̂l derivează pe β din α”.
Un algoritm inferenţial se numeşte temeinic 2 dacă obţine numai enunţuri care sunt
derivabile din baza de cunoştinţe. Este evident că algoritmul de verificare a modelelor
este temeinic.
O altă proprietate pentru un algoritm inferenţial este cea de completitudine – dacă
poate să deducă toate enunţurile care sunt derivabile din baza de cunoştinţe. O examinare
sistematică ı̂n cazul unei probleme ı̂n care mulţimea de concluzii posibile este finită duce,
evident, la un algoritm complet; proprietatea este ı̂nsă esenţială pentru problemele ı̂n care
mulţimea concluziilor posibile este infinită.

5.5 Logica propoziţională

5.5.1 Sintaxa
Enunţurile atomice din logica propoziţională3 sunt elemente sintactice indivizibile.
Fiecare simbol corespunde unei propoziţii care poate să fie adevărată sau falsă. Există
două simboluri propoziţionale cu semnificaţii fixate: Adevarat este propoziţia tot timpul
adevăratăşi Fals este propoziţia tot timpul falsă.
Enunţurile complexe sunt compuse din propoziţii simple folosind conectorii logici. Cei
cinci conectori sunt:

1. ¬ (non) — o propoziţie precum ¬A este negarea lui A. Un literal este fie un enunţ


atomic (literal pozitiv), fie negarea a unuia (literal negativ).

2. ∧ (şi) — o propoziţie formată din două propoziţii legate prin ∧ precum A ∧ B se


numeşte conjuncţie; A ∧ B se citeşte “A şi B”

3. ∨ (sau) — o propoziţie ce foloseşte ∨, precum A ∨ B, se numeşte disjuncţie; A ∨ B


se citeşte “A sau B”

4. ⇒ (implică) — o propoziţie precum A ⇒ B se numeşte implicaţie. Premisa sau


antecedentul implicaţiei este A, iar concluzia sau consecventul este B. A ⇒ B se
citeşte “A implică B” sau “dacă A atunci B”.
2
În limba engleză, ı̂n original: sound.
3
Numită şi logică booleană
72 CAPITOLUL 5. AGENŢI LOGICI

5. ⇔ (echivalent, dacă şi numai dacă) — propoziţia A ⇔ B se mai numeşte bicondiţională


şi se citeşte “A dacă şi numai dacă B” sau “A este echivalent cu B”.

Tabelul 5.1 dă sintaxa folosită ı̂n logica propoziţională ı̂n forma BNF (Backus-Naur
Form).

Enunţ → Enunţ atomic | Enunţ complex


Enunţ atomic → Adevarat | Fals | simbol
Simbol → P | Q | R | ...
Enunţ complex → ¬ (Enunţ)
| (Enunţ ∧ Enunţ)
| (Enunţ ∨ Enunţ)
| (Enunţ ⇒ Enunţ)
| (Enunţ ⇔ Enunţ)

Tabela 5.1: Gramatica BNF pentru enunţurile din logica propoziţională.

Parantezele sunt importante: fiecare propoziţie care este construită cu conector binar
este ı̂ncadrată ı̂ntre paranteze. Uneori acestea se pot omite, dar numai dacă nu duc
la ambiguităţi. Suplimentar, se defineşte şi prioritatea operatorilor; aceştia, ı̂n ordinea
precedenţei sunt: ¬, ∧, ∨, ⇒, ⇔. Astfel, A ⇒ ¬B ∨ C este totuna cu (A ⇒ (¬B ∨ C)).
Suplimentar, semantica ne poate permitem să scriem A ∧ B ∧ C deoarece ((A ∧ B) ∧ C)
are ı̂ntotdeauna aceeaşi valoare de adevăr ca şi (A∧(B ∧C)), dar arată că este ambiguitate
pentru expresia A ⇒ B ⇒ C.

5.5.2 Semantica
Semantica defineşte reguli pentru determinarea valorii de adevăr a propoziţiilor relativ
la un model concret. În logica propoziţională un model reprezintă valorile de adevăr ale
simbolurilor propoziţionale. De exemplu, dacă avem propoziţiile P1,2 , P2,2 , P3,1 , atunci
un model posibil este m = {P1,2 = f als, P2,2 = adevarat, P3,1 = adevarat}.
Calculul valorii de adevăr se face recursiv, deoarece orice propoziţie este alcătuită din
propoziţii atomice şi conectori. Pentru ı̂nceput, trebuie să se determine valoarea de adevăr
a unei propoziţii atomice:

• Adevarat are valoarea de adevăr “adevărat” pentru orice model; Fals are valoarea
de adevăr “fals” pentru orice model;

• valoarea de adevăr a unei unui simbol propoziţional trebuie să rezulte din modelul
curent.
5.5. LOGICA PROPOZIŢIONALĂ 73

Pentru propoziţiile compuse se foloseşte tabela de adevăr (dată ı̂n tabelul 5.2) care
arată cum se calculează valoarea propoziţiei plecând de la elementele care o formează.
Pe baza celor de mai sus se poate scrie o funcţie (Este-Adevarat) care stabileşte dacă
valoarea de adevăr a unei expresii s, plecând de la un model dat m este adevărat.

p q ¬p p∧q p∨q p⇒q p⇔q


adevărat adevărat fals adevărat adevărat adevărat adevărat
adevărat fals fals fals adevărat fals fals
fals adevărat adevărat fals adevărat adevărat fals
fals fals adevărat fals fals adevărat adevărat

Tabela 5.2: Tabela de adevăr pentru logica propoziţională.

S-a spus anterior că o bază de cunoştinţe este o mulţime de enunţuri. Dat fiind modul
de calcul al valorii de adevăr pentru o conjuncţie, se poate spune că o BC de forma α1 ,
. . . , αn se poate scrie ca: α1 ∧ . . . ∧ αn .

5.5.3 Exemplu: lumea monstrului ı̂n logica propoziţională


Pentru fiecare pereche de indici (i, j) corespunzând unei camere, vom seta Pi,j =adevărat
dacă şi numai dacă ı̂n camera de coordonate (i, j) este o groapă şi Bi,j va fi adevărată
dacă şi numai dacă se simte curent de aer ı̂n aceeaşi cameră. Conform regulilor jocului
din secţiunea 5.3, avem că:

• nu există nici o groapă in camera din care ı̂ncepe jocul, deci avem regula R1 : ¬P1,1

• ı̂ntr–o cameră se simte curent de aer numai dacă ı̂n vecinătatea ei se află o groapă;
deci avem:
R2 : B1,1 ⇔ (P1,2 ∨ P2,1 )

şi
R3 : B2,1 ⇔ (P1,1 ∨ P2,2 ∨ P3,1 )

• introducem percepţiile: nu se simte curent de aer ı̂n prima cameră (deci R4 : ¬B1,1 )
şi se simte curent ı̂n camera (2, 1) (deci R5 : B2,1 ).

Baza de cunoştinţe este R1 ∧ R2 ∧ R3 ∧ R4 ∧ R5 .

5.5.4 Inferenţa
Scopul unei inferenţe este de a detemina dacă BC |= α, pentru un α dat. Primul
algoritm pe care ı̂l dăm se bazează pe implementarea directă a definiţiei 10: se enumeră
74 CAPITOLUL 5. AGENŢI LOGICI

Figura 5.2: Algoritm de deducţie bazat pe construirea tabelei de adevăr.

toate modelele şi se verifică dacă α este adevărată ı̂n toate modelele ı̂n care BC este
adevărată. Pentru logica propoziţională, mulţimea tuturor modelelor se obţine dând
toate combinaţiile de valori de adevăr pentru simbolurile propoziţionale. În cazul nostru
avem simbolurile B1,1 , B2,1 , P1,1 , P1,2 , P2,1 , P2,2 şi P3,1 . Sunt deci 27 = 128 de modele;
se poate verifica faptul că pentru trei dintre ele BC este adevărată; ı̂n aceste trei modele
¬P1,2 este adevărată, deci nu este groapă ı̂n camera de coordonate (1, 2). Mai departe,
P2,2 este adevărată doar ı̂n două din cele trei modele, deci nu putem deduce nici P2,2 nici
¬P2,2 .
Figura 5.2 conţine un algoritm general pentru a determina dacă se poate deduce α din
BC. Este o căutare de tip backtracking; algoritmul este temeinic, deoarece implementează
direct definiţia; este de asemenea şi complet deoarece se termină pentru orice bază de
cunoştinţe şi α, numărul de modele fiind finit.
Complexitatea algoritmului este dictată de n, numărul de simboluri. Complexitatea
ı̂n timp este O(2n ) iar cea ı̂n spaţiu este O(n), deoarece avem o căutare de tipul “mai
ı̂ntâi ı̂n adâncime”. Vom prezenta algoritmi care ı̂n practică sunt mult mai eficienţi, dar
pentru toţi algoritmii inferenţiali cunoscuţi există un cel mai defavorabil caz care duce la
complexitate de timp exponenţială.

5.5.5 Echivalenţă, validitate şi satisfiabilitate


Conceptele următoare sunt folosite ı̂n alţi algoritmi care urmează a fi prezentaţi.
Primul concept este legat de echivalenţa logică, notată cu simbolul ≡. Două propoziţii
α şi β sunt echivalente dacă sunt adevărate ı̂n aceleaşi modele. Se poate vedea de exemplu
ca P ∧ Q este echivalentă cu Q ∧ P (se verifică pe tabela de adevăr).
5.6. TIPARE DE RAŢIONAMENT ÎN LOGICA PROPOZIŢIONALĂ 75

O definiţie alternativă a echivalenţei este: α ≡ β dacă şi numai dacă α |= β şi β |= α.


Tabelul 5.3 conţine echivalenţele logice standard.

(α ∧ β) ≡ (β ∧ α) comutativitatea lui ∧
(α ∨ β) ≡ (β ∨ α) comutativitatea lui ∨
((α ∧ β) ∧ γ) ≡ (α ∧ (β ∧ γ)) asociativitatea lui ∧
((α ∨ β) ∨ γ) ≡ (α ∨ (β ∨ γ)) asociativitatea lui ∨
¬(¬α) ≡ α eliminarea dublei negaţii
(α ⇒ β) ≡ (¬β ⇒ ¬α) contrapoziţie
(α ⇒ β) ≡ (¬α ∨ β) eliminarea implicaţiei
(α ⇔ β) ≡ ((α ⇒ β) ∧ (β ⇒ α)) eliminarea bicondiţională
¬(α ∧ β) ≡ (¬α ∨ ¬β) de Morgan
¬(α ∨ β) ≡ (¬α ∧ ¬β) de Morgan
(α ∧ (β ∨ γ)) ≡ ((α ∧ β) ∨ (α ∧ γ)) distributivitatea lui ∧ asupra lui ∨
(α ∨ (β ∧ γ)) ≡ ((α ∨ β) ∧ (α ∨ γ)) distributivitatea lui ∨ asupra lui ∧

Tabela 5.3: Echivalenţe logice standard.

Al doilea concept este validitatea. O propoziţie este validă dacă este adevărată ı̂n orice
model4 . Conceptul este util pentru următoare teoremă de deducţie:

Teorema 4 Pentru orice propoziţii α şi β, avem că α |= β dacă şi numai dacă propoziţia
α ⇒ β este validă.

Ultimul concept este satisfiabilitatea. O propoziţie este satisfiabilă dacă şi numai dacă
este adevărată ı̂n cel puţin un model. Dacă α este adevărată ı̂ntr–un model m, atunci
spunem că m satisface α, sau că m este un model al lui α.
A verifica dacă β se poate deduce din α (adică dacă α ⇒ β) este echivalent cu a vedea
dacă α ∧ ¬β este nesatisfiabilă - de fapt regăsim procedeul demonstraţiei prin reducere la
absurd.

5.6 Tipare de raţionament ı̂n logica propoziţională


Prezentăm tiparele standard care pot fi aplicate pentru a deriva noi propoziţii; aceste
tipare se mai numesc şi reguli de inferenţă.
Cea mai cunoscută regulă se numeşte Modus Ponens şi are forma:
α ⇒ β, α
β
4
O astfel de propoziţie se mai numeşte şi tautologie.
76 CAPITOLUL 5. AGENŢI LOGICI

adică: dacă din α se poate deduce β şi ştim că α este adevărată, atunci şi β este adevărată.
Altă regulă este eliminarea lui şi care spune că dintr–o conjuncţie oricare din termeni
poate să fie dedus:
α∧β
α
De asemenea, oricare din echivalenţele din tabelul 5.3 pot fi folosite ca reguli de
inferenţă; de exemplu echivalenţa pentru eliminarea bicondiţională duce la două reguli
de inferenţă:
α⇔β (α ⇒ β) ∧ (β ⇒ α)
şi
(α ⇒ β) ∧ (β ⇒ α) α⇔β
Exemplificăm utilizarea regulilor de inferenţă şi a echivalenţelor ı̂n lumea monstrului.
Continuăm lista prezentată ı̂n secţiunea 5.5.3. Aplicând eliminarea bicondiţională pentru
R2 obţinem:
R6 : (B1,1 ⇒ (P1,2 ∨ P2,1 )) ∧ ((P1,2 ∨ P2,1 ) ⇒ B1,1 )

Se aplică eliminarea lui şi pentru R6 şi se ajunge la:

R7 : ((P1,2 ∨ P2,1 ) ⇒ B1,1 )

Echivalenţa logică pentru contrapoziţie dă:

R8 : (¬B1,1 ⇒ ¬(P1,2 ∨ P2,1 ))

Se aplică regula Modus Ponens pentru R8 şi faptul dat ı̂n R4 , obţinându–se:

R9 ¬(P1,2 ∨ P2,1 )

Din regula lui de Morgan se obţine:

R10 : ¬P1,2 ∧ ¬P2,1

sau altfel zis, nici camera [1, 2] şi nici [2, 1] nu conţin groapă.
Derivarea precedentă se numeşte demonstraţie şi se bazează pe aplicarea unor reguli
de inferenţă. Oricare din algoritmii de căutare din capitolele 2 şi 3 poate fi folosit pentru
găsirea unei demonstraţii, folosind ca stare iniţială baza de cunoştinţe iar pas următor
oricare din regulile de inferenţă.
Deoarece inferenţa ı̂n logica propoziţională este NP-completă, s-ar putea spune că o
căutare de demonstraţie nu poate să fie mai eficientă decât enumerarea modelelor. În prac-
tică ı̂nsă, găsirea unei demonstraţii este mult mai eficientă, deoarece se evită propoziţiile
irelevante, indiferent de câte sunt. De exemplu, ı̂n demonstraţia anterioară nu s–a făcut
referire la propoziţiile care conţin simbolurile B2,1 sau P3,1 .
5.6. TIPARE DE RAŢIONAMENT ÎN LOGICA PROPOZIŢIONALĂ 77

5.6.1 Rezoluţia
În mod evident, regulile de inferenţă expuse anterior sunt temeinice; nu este ı̂nsă evi-
dent dacă sunt şi complete, adică dacă ele permit deducerea a orice poate fi demonstrat
pornind de la o bază de cunoştinţe. Aplicarea unui algoritm de căutare care este complet
având drept paşi următori regulile de inferenţă nu garantează obţinerea unui mecanism
inferenţial complet. De exemplu, dacă regula eliminării bicondiţionale nu ar fi fost pre-
zentă, atunci concluzia din demonstraţia anterioară nu s–ar fi putut dovedi.
Introducem o singură regulă de inferenţă, numită rezoluţie care produce un algoritm
de inferenţă complet, dacă este folosit ı̂n conjuncţie cu un algoritm de căutare complet.
Pentru lumea monstrului adăugăm următoarele fapte la baza de cunoştinţe:

R11 : ¬B1,2

şi
R12 : B1,2 ⇔ (P1,2 ∨ P2,2 ∨ P1,3 )

Printr-o demonstraţie asemănătoare cu cea de mai sus, avem că:

R13 : ¬P2,2

R14 : ¬P1,3

Se aplică eliminarea bicondiţională la R3 , apoi Modus Ponens cu R5 şi se obţine:

R15 : P1,1 ∨ P2,2 ∨ P3,1

Se observă că literalul ¬P2,2 din R13 se reduce cu literalul P2,2 din R15 şi obţinem:

R16 : P1,1 ∨ P3,1

Putem, de asemenea, să reducem ¬P1,1 din R1 cu P1,1 din R15 şi obţinem:

R17 : P3,1

Aceste reduceri exprimă regula rezoluţiei unitate, care se scrie formalizat astfel:
l1 ∨ · · · ∨ lk , m
l1 ∨ · · · li−1 ∨ li+1 ∨ · · · ∨ lk
unde fiecare l este un literal iar li şi m sunt literali complementari (unul este negarea
celuilalt). Deci regula rezoluţiei unitate preia o clauză (o disjuncţie de literali) şi un
literal şi produce o nouă clauză.
Regula de mai sus admite o generalizare imediată:
l1 ∨ · · · ∨ lk , m1 ∨ · · · ∨ mn
l1 ∨ · · · li−1 ∨ li+1 ∨ · · · ∨ lk ∨ m1 ∨ · · · ∨ mj−1 ∨ mj+1 ∨ · · · ∨ mn
78 CAPITOLUL 5. AGENŢI LOGICI

adică se pleacă de la două clauze şi se ajunge la una nouă ı̂n care avem toţi literalii clauzelor
iniţiale, mai puţin cei doi termeni care sunt complementari. Desigur, se presupune că se
aplică şi factorizare, adică o expresie de forma A ∨ A ∨ · · · este redusă la A ∨ · · ·.
Este uşor de văzut că regula de rezoluţie este temeinică: dacă li este adevărată, atunci
mj este falsă şi deci m1 ∨ · · · ∨ mj−1 ∨ mj+1 ∨ · · · ∨ mn trebuie să fie adevărată; analog,
dacă li este falsă, atunci l1 ∨ · · · li−1 ∨ li+1 ∨ · · · ∨ lk este adevărată. Deoarece li este ori
adevărată, ori falsă, obţinem că una din cele două concluzii are loc, deci şi disjuncţia lor
este adevărată; această din urmă disjuncţie este exact concluzia regulii.
Se poate arăta, de asemenea, că orice algoritm complet de căutare care aplică doar
regula de rezoluţie poate să demonstreze orice concluzie care se poate demonstra plecând
de la o bază de cunoştinţe ı̂n logica propoziţională.
Există totuşi un aspect practic care trebuie menţionat: dacă se dă de exemplu propoziţia
A adevărată, metoda rezoluţiei nu poate să deducă automat că şi A ∨ B este adevărată.
Mai general, rezoluţia poate fi folosită pentru a confirma sau infirma orice propoziţie, dar
nu poate să genereze singură toate propoziţiile care pot fi deduse pornind de la baza de
cunoştinţe.

5.7 Forma normală conjunctivă


Regula de rezoluţie se aplică numai disjuncţiilor de literali, deci s-ar părea că se aplică
doar bazelor de cunoştinţe şi interogărilor care constau din asemenea forme. Se poate arăta
că orice expresie din logica propoziţională poate fi rescrisă sub forma unei conjuncţii de
disjunţii, aşa numita formă normală conjunctivă (FNC).
De exemplu, pentru propoziţia: B1,1 ⇔ (P1,2 ∨ P2,1 ) se obţine FNC echivalentă prin
paşii:

1. Se aplică eliminarea bicondiţională:

(B1,1 ⇒ (P1,2 ∨ P2,1 )) ∧ ((P1,2 ∨ P2,1 ) ⇒ B1,1 )

2. Se elimină ⇒, prin α ⇒ β ≡ ¬α ∨ β

(¬B1,1 ∨ P1,2 ∨ P2,1 ) ∧ (¬(P1,2 ∨ P2,1 ) ∨ B1,1 )

3. Aplicând legea lui de Morgan pentru ¬(α ∨ β) ≡ (¬α ∧ ¬β) obţinem:

(¬B1,1 ∨ P1,2 ∨ P2,1 ) ∧ ((¬P1,2 ∧ ¬P2,1 ) ∨ B1,1 )

4. Aplicăm distributivitatea lui ∨ asupra lui ∧ şi obţinem FNC:

(¬B1,1 ∨ P1,2 ∨ P2,1 ) ∧ (¬P1,2 ∨ B1,1 ) ∧ (¬P2,1 ∨ B1,1 )


5.8. ALGORITMUL DE REZOLUŢIE 79

Figura 5.3: Algoritm de rezoluţie pentru logica propoziţională. Funcţia LP-Rezolva


returnează setul de clauze care se obţine prin combinarea celor două intrări.

5.8 Algoritmul de rezoluţie


Procedurile de inferenţă bazate pe rezoluţie lucrează pe principiul reducerii la absurd,
adică pentru a arăta că BC |= α, arătăm că (BC ∧ ¬α) este nesatisfiabilă.
Algoritmul este arătat ı̂n figura 5.3. Primul pas este de a converti BC ∧ ¬α ı̂n FNC.
Apoi, pentru fiecare pereche care conţine literali complementari se produce o nouă clauză,
care este adăugată la setul de clauze, dacă nu este deja prezentă. Procesul se repetă până
când se ı̂ntâmplă una din:

1. nu există noi clauze care să fie adăugate la setul de clauze; ı̂n acest caz din BC nu
se poate deduce α;

2. două clauze produc clauza vidă, caz ı̂n care din BC se poate deduce α.

Clauza vidă este echivalentă cu Fals, deoarece o clauză este adevărată dacă şi numai
dacă cel puţin un termen al ei este adevărat; nefiind cazul, ı̂nseamnă ca FNC dată de
BC ∧ ¬α evoluează la un enunţ care conţine conjuncţie cu Fals, deci valoarea de adevăr
este fals. Din principiul reducerii la absurd avem că BC |= α.
O aplicare parţială a algoritmului de rezoluţie pentru BC = R2 ∧ R4 şi α = ¬P1,2 este
dată ı̂n figura 5.4. Tot din figură observăm că obţinem, de exemplu, ¬B1,1 ∨ P1,2 ∨ B1,1
care se reduce la Adevarat ∨ P1,2 care se evaluează la Adevarat. Nu este utilă o asemenea
clauză, deoarece este cuprinsă ı̂ntr–o conjuncţie, iar conform tabelei de adevăr 5.2 avem
că Adevarat ∧ X este echivalent cu X, pentru orice expresie X.
80 CAPITOLUL 5. AGENŢI LOGICI

Figura 5.4: Aplicare parţială a algoritmului pentru BC = R2 ∧ R4 şi α = ¬P1,2 . Se arată


evoluţia până ı̂n momentul obţinerii clauzei vide.

Se defineşte ı̂nchiderea rezolutivă a unei propoziţii aflate ı̂n FNC ca fiind setul tuturor
clauzelor care se obţin din aplicarea repetată a regulii de rezoluţie peste propoziţie sau
clauze derivate din ea. Acestă mulţime este finită, deoarece numărul de combinaţii ı̂n
disjuncţii al unui set finit de simboluri este finit (se aplică şi factorizarea).
Completitudinea este dată de teorema:

Teorema 5 (Teorema de rezoluţie, [1]) Dacă un set de clauze este nesatisfiabil, atunci
ı̂nchiderea rezolutivă a acestor clauze conţine clauza vidă.

5.9 Înlănţuirea ı̂nainte şi ı̂napoi


De multe ori, bazele de cunoştinţe din lumea reală conţin clauze ı̂ntr–o formă parti-
culară numită clauză Horn. O clauză Horn este o disjuncţie de literali ı̂n care cel mult un
literal are formă pozitivă. De exemplu, ¬A ∨ ¬B ∨ C.
Restricţia poate părea cam dură, dar:

1. Fiecare clauză Horn poate fi scrisă ca o implicaţie a cărei premisă este o conjuncţie cu
literali pozitivi şi drept concluzie un singur literal pozitiv. De exemplu, ¬A∨¬B ∨C
este echivalentă cu A ∧ B ⇒ C – am aplicat eliminarea implicaţiei şi regula lui de
Morsgan. Această din urmă formă este naturală, motiv pentru care clauzele Horn
se regăsesc atât de uşor ı̂n bazele de cunoştinţe. Ele sunt element fundamental al
domeniului numit Programare logică.
Dacă o clauză Horn nu conţine nici un literal pozitiv (de exemplu: ¬A∨¬B), atunci
se poate scrie echivalent ¬A ∨ ¬B ∨ F als şi apoi ca A ∧ B ⇒ F als.

2. Inferenţele cu clauze Horn pot fi făcute cu doi algoritmi de de inferenţă care apar
ca naturali, ı̂nlănţuirea ı̂nainte şi ı̂nlănţuirea ı̂napoi.

3. Algoritmii de deducţie care folosesc clauze Horn sunt liniari ı̂n dimensiunea BC.

Algoritmul de ı̂nlănţuire ı̂nainte LP-InlantuireInainte(BC, q) determină dacă un


simbol propoziţional q poate fi dedus din baza de cunoştinţe aflate ı̂n formă Horn. Dacă
5.9. ÎNLĂNŢUIREA ÎNAINTE ŞI ÎNAPOI 81

premisele unei implicaţii sunt cunoscute ca adevărate, atunci concluzia implicaţiei este
adevărată şi este adăugată la baza de cunoştinţe. Procedeul se repetă până când fie se
deduce q, fie nu se mai poate adăunga niciun simbol propoziţional nou la BC. Algoritmul
este dat ı̂n figura 5.5.

Figura 5.5: Algoritmul de ı̂nlănţuire ı̂nainte.

Cel mai bun mod de ı̂nţelegere a algoritmului de ı̂nlănţuire ı̂nainte este pe baza unui
exemplu. Să presupunem că avem baza de cunoştinţe exprimată sub formă de clauze
Horn:

P ⇒Q
L∧M ⇒P
B∧L⇒M
A∧P ⇒L
A∧B ⇒L
A
B
82 CAPITOLUL 5. AGENŢI LOGICI

Acestei baze de cunoştinţe i se poate asocia un graf de tipul şi—sau, construit astfel:
nodurile lui sunt simbolurile propoziţionale, arcele de graf unite reprezintă operatorul
∧, ı̂n timp ce arcele neunite corespund disjuncţiei. Figura 5.6 reprezintă graful şi—sau
asociat bazei de cunoştinţe date, ı̂mpreună cu evoluţia cunoştinţelor. În dreptul fiecărui
arc de joncţiune de arce se află numărul de premise care mai trebuie mai demonstrate
pentru a se putea deduce concluzia aflată la capătul arcului.
Se poate vedea că ı̂nlănţuirea ı̂nainte este temeinică, deoarece reprezintă aplicarea
repetată a regulii Modus Ponens. Este de asemenea şi un algoritm complet (a se vedea
[1]).
Înlănţuirea ı̂nainte este un exemplu de raţionament codus de date, adică al unui
raţionament ı̂n care demonstrarea unei concluzii se face pornind dinspre ipoteze. Spre
deosebire de regula rezoluţiei, poate fi folosită pentru a genera o listă de concluzii care
pot fi deduse plecând de la o bază de cunoştinţe.
Înlănţuirea ı̂napoi porneşte dinspre interogare spre baza de cunoştinţe. Dacă se cere
a se demonstra că Q este adevărată, se verifică prima dată dacă se ştie deja valoarea de
adevăr a lui Q; dacă nu se cunoaşte, atunci se găsesc toate implicaţiile care ı̂l produc pe
Q. Dacă se poate demonstra că premisele unei astfel de implicaţii sunt toate adevărate,
atunci şi Q este adevărată. Procesul de raţionament este unul direcţionat de scop. O
ilustrare a procesului este dată ı̂n figura 5.8.
De multe ori, costul unei ı̂nlănţuiri ı̂napoi este mult mai mic decât dimensiunea bazei
de cunoştinţe (deşi o implementare eficientă are costul liniar, ı̂n cel mai defavorabil caz).

5.10 Inferenţă propoziţională efectivă


Descriem aici două variante de algoritmi eficienţi pentru inferenţă propoziţională ba-
zate pe verificarea de modele: unul este bazat pe căutare backtracking, altul pleacă de la
căutare prin metoda ascensiunii.
Ambele metode verifică satisfiabilitatea, adică determinarea unui model (valori pentru
variabile) astfel ı̂ncât să se verifice o anumită valoare de adevăr. Atât backtracking cât şi
căutarea locală rezolvă aceste probleme, dar primul este un algoritm determinist, exact,
pe când al doilea poate să ducă la rezultate incorecte.

5.10.1 Algoritm bazat pe backtracking


Algoritmul, datorat lui Davis şi Putnam pleacă de la o propoziţie ı̂n formă normală
conjunctivă. Precum căutarea backtracking (secţiunea 4.2) şi metoda TA-deducţie (figura
5.2), este o enumerare a modelelor, dar cu următoarele ı̂mbunătăţiri:
5.10. INFERENŢĂ PROPOZIŢIONALĂ EFECTIVĂ 83

Q Q

1 1
P P
2 2
M M
2 2
L L

2 2 1 1

A B A B

(a) Aplicarea premisei A. (b) Numărul de premise care


mai trebuie demonstrate pen-
tru dovedirea lui L devine 1. Se
aplică premisa B.

Q Q

1 1
P P
2 1
M M
1 0
L L

1 0 1 0

A B A B

(c) Numărul de premise care (d) Numărul de premise care


mai trebuie demonstrate pen- mai trebuie demonstrate pen-
tru dovedirea lui L devine 0, iar tru dovedirea lui M devine 0.
pentru M scade la 1. Se aplică Se aplică premisa M .
premisa L.

Figura 5.6: Exemplificarea algoritmului de ı̂nlănţuire ı̂nainte.


84 CAPITOLUL 5. AGENŢI LOGICI

Q Q

1 0
P P
0 0
M M
0 0
L L

1 0 0 0

A B A B

(a) Numărul de premise care (b) Numărul de premise care


mai trebuie demonstrate pen- mai trebuie demonstrate pen-
tru dovedirea lui P devine 0. Se tru dovedirea lui Q devine 0, la
aplică premisa P . fel ca şi pentru dovedirea lui L
folosind conjunţia (dar despre
L se ştie deja că poate fi de-
monstrat). Astfel, s–a demon-
strat concluzia Q.

Figura 5.7: Exemplificarea algoritmului de ı̂nlănţuire ı̂nainte (continuare).

• terminare rapidă: algoritmul detectează dacă o propoziţie este adevărată sau falsă,
chiar dacă modelul este parţial completat. O clauză este adevărată dacă un literal
este adevărat, chiar dacă ceilalţi literali nu au valoare de adevăr fixată. Similar, o
conjunţie de clauze este falsă dacă o clauză este falsă, indiferent de valorile celorlalte
clauze.

• Euristica simbolurilor pure: un simbol este pur dacă apare cu acelaşi semn ı̂n fiecare
clauză. Este uşor de văzut că dacă o propoziţie are un model, atunci acesta are
proprietatea că simbolul pur are valoarea adevărat.

• Strategia clauzei unitate: o clauză unitate este o clauză cu un singur literal. În
contextul algoritmului, ı̂nseamnă şi o clauză unde toţi literalii, mai puţin unul, au
valoare fals. Strategia clauzei unitate asignează valori unor asemenea simboluri
ı̂nainte de a se apuca de altele. O astfel de setare de variabilă poate de asemenea să
ducă la alte clauze unitate.
5.10. INFERENŢĂ PROPOZIŢIONALĂ EFECTIVĂ 85

Q Q

P P

M M

L L

A B A B

(a) Se cere demonstrarea lui Q. (b) Demonstrarea că Q =


Simbolurile A şi B sunt cu- adevarat cere demonstrarea că
noscute ca având valoarea de P = adevarat.
adevăr adevărat.

Q Q

P P

M M

L L

A B A B

(c) Demonstrarea că P = (d) Demonstrarea că L este


adevarat cere demonstrarea că adevărat cere ca să se demon-
L are valoarea adevărat şi că streze că A şi P sunt adevărate,
M are valoarea adevărat. sau că A şi B sunt adevărate.

Figura 5.8: Exemplificarea algoritmului de ı̂nlănţuire ı̂napoi.


86 CAPITOLUL 5. AGENŢI LOGICI

Q Q

P P

M M

L L

A B A B

(a) Se ajunge la cererea de (b) Deoarece A şi B sunt


a demonstra că A şi B sunt adevărate, rezultă că L este
adevărate. adevărată.

Q Q

P P

M M

L L

A B A B

(c) Deoarece L şi B sunt (d) Deoarece L şi M sunt


adevărate, rezultă că M este adevărate, rezultă că P este
adevărată. adevărată. La pasul următor
se deduce că şi Q are valoarea
adevărat.

Figura 5.9: Exemplificarea algoritmului de ı̂nlănţuire ı̂napoi (continuare).


5.10. INFERENŢĂ PROPOZIŢIONALĂ EFECTIVĂ 87

Figura 5.10: Algoritmul Walksat pentru verificarea satisfiabilităţii unui set de clauze.

5.10.2 Algoritm bazat pe căutare locală


Algoritmii de căutare locală pot fi aplicaţi direct problemelor de satisfiabilitate, dacă
se dă o funcţie de evaluare adecvată. Se alege de regulă numărul de clauze nesatisfăcute.
Algoritmii de acest tip schimbă la fiecare pas valoarea unei variabile; pentru a ieşi din
minimele locale se folosesc diferite variante de aleatoritivitate.
Unul din cei mai simpli şi mai eficienţi algoritmi rezultaţi se numeşte WalkSat (figura
5.10). La fiecare iteraţie algoritmul alege o clauză nesatisfăcută şi alege aleator care dintre
variabile să ı̂şi schimbe valoarea. Alegerea variabilei se face aleator, fie:

• se alege variabila care minimizează numărul de clauze nesatisfăcute, sau

• se alege simbolul aleator

Dacă algoritmul returnează un model, atunci acest model satisface clauzele. Dacă ı̂nsă
se returnează eşuare, atunci nu se poate şti sigur dacă expresia este nesatisfiabilă sau dacă
ar trebui ca algoritmul să fie lăsat să ruleze mai mult (dar nu se ştie cât de mult).
88 CAPITOLUL 5. AGENŢI LOGICI
Capitolul 6

Logica de ordinul ı̂ntâi

6.1 Introducere
Logica propoziţională se dovedeşte a fi un limbaj neadecvat pentru reprezentarea
cunoştinţelor dintr-un mediu complex, ı̂ntr–un mod concis. De exemplu, pentru a spune
că ı̂ntr-o cameră vecină (pe verticală sau orizontală) cu cea de coordonate [1, 1] ı̂n care
se simte briză de aer există o groapă, scriem astfel:

B1,1 ⇔ P1,2 ∨ P2,1

şi ceva asemănător pentru fiecare cameră din joc. Limbajul natural este mult mai concis
(comparaţi “camerele vecine cu o cameră ı̂n care se simte curent de aer conţin o groapă”
cu cele n2 propoziţii care trebuie scris ı̂n logica propoziţională pentru a exprima acelaşi
lucru). Pe de altă parte, limbajul natural poate fi şi imprecis. Ne dorim deci o variantă
de limbaj care să fie concis, exact ı̂n exprimare şi să permită operarea uşoară.
Alte aspecte pe care le dorim de la un limbaj de reprezentare a cunoştinţelor sunt:

• natură declarativă — cunoştinţele dintr–un domeniu să fie reprezentate separat de


mecanismul inferenţial; acesta din urmă trebuie să fie cât mai general aplicabil.
Este o abordare diferită de cea a limbajelor procedurale (Java, C#, C++) unde
structurile de date obţinute după modelarea problemei erau puternic cuplate cu
operatorii de prelucrare;

• semantică compoziţională — semantica unui enunţ exprimat ı̂ntr–un asemenea lim-


baj trebuie să fie legată de semantica părţilor care ı̂l compun;

• independenţa de context — ceea ce ar impune obţinerea aceloraşi concluzii, dacă se


reaplică mecanismul inferenţial pornind de la o aceeaşi bază de cunoştinţe;

Mai mult, prin compararea cu ceea ce ne pune la dispoziţie limbajul natural, ne dăm
seama că dorim să putem lucra cu:

89
90 CAPITOLUL 6. LOGICA DE ORDINUL ÎNTÂI

• obiecte: oameni, culori, numere, etc;

• relaţii ı̂ntre obiecte: relaţii unare (ı̂nalt, roşu, prim) sau n-are: mai mare decât,
frate cu, compus din;

• funcţii: aplicate pe unul sau mai multe obiecte, duce la obţinerea altor obiecte: tatăl
lui, succesorul lui, etc.
Limbajul logicii de ordinul ı̂ntâi tratează satisfăcător toate aceste aspecte.
Cea mai mare diferenţă ı̂ntre logica propoziţională şi logica predicatelor este că ı̂n
prima se exprimă fapte care au sau nu loc. Fiecare fapt are una din două valori: adevărat
sau fals. Logica predicatelor ı̂nsă se referă la o mulţime de obiecte ı̂ntre care există sau
nu relaţii.

6.2 Sintaxa şi semantica logicii de ordinul ı̂ntâi

6.2.1 Modele pentru logica de ordinul ı̂ntâi


Modelele pentru logica propoziţională constau ı̂n perechi de valori de forma simbol =
valoare, unde valoarea poate fi adevărat sau fals. Pentru logica de ordinul ı̂ntâi lucrurile
sunt substanţial diferite: se lucrează cu obiecte, care pot lua orice valoare dintr-o mulţime
specificată. Domeniul unui model este setul de obiecte pe care le conţine.
Să presupunem că pornim de la următoarea stare: există două persoane, John şi
Richard, care sunt fraţi şi regi (la momente diferite de timp); există o coroană care se
află pe capul unuia dintre ei; se face referire la piciorul stâng al oricăruia din cei doi via
o funcţie, PiciorulStang.
O relaţie (cum ar fi frate(John, Richard), frate(Richard, John) şi peCap(coroana,
John)) este un set de tupluri de obiecte care sunt legate. Modelul poate de aseme-
nea să conţină relaţii unare (numite şi proprietăţi) - rege(John), persoana(John), per-
soana(Richard).
Unele relaţii sunt mai bine de interpretat ca funcţii; dacă pentru un obiect oarecare
(notat o1 ), relaţia asigură o legătură cu un unic obiect, atunci ea poate fi văzută ca o
funcţie de forma relatie(o1 )=o2 . De exemplu, avem legăturile:

Richard → piciorul stâng al lui Richard

John → piciorul stâng al lui John


Funcţiile trebuie să fie totale, adică pentru orice argument să asocieze un rezultat. Deci
piciorul stâng al lui John trebuie să aibe şi el un picior stâng; o asemenea problemă se
rezolvă introducând un obiect fictiv care să fie ataşat obiectelor pentru care nu există,
sub o interpretare rezonabilă, ceva ataşat.
6.2. SINTAXA ŞI SEMANTICA LOGICII DE ORDINUL ÎNTÂI 91

6.2.2 Simboluri şi interpretări


Elementele din sintaxa logicii propoziţionale sunt:

• constante: John, Richard, etc

• predicate: Frate, >, etc

• funcţii: PiciorulStang, radical, etc

• variabile: x, y, etc

• conective: ¬, ∧, ∨, ⇒, ⇔

• egalitatea: =

• cuantificatori: ∀, ∃

Gramatica ı̂n forma BNF este dată ı̂n tabelul 6.1.

Enunţ → Enunţ Atomic


| (Enunţ Conectivă Enunţ)
| Cuantificator Variabilă . . . Enunţ
| ¬ Enunţ
Enunţ Atomic → Predicat(Termen, . . . ) | Termen = Termen
Termen → Functie(Termen, . . . )
| Constantă
| Variabilă
Conectivă → ⇒|∧|∨|⇔
Cuantificator → ∀|∃
Constantă → A | X1 | John | . . .
Variabilă → a | x | ...
Predicat → Frate | . . .
Functie → TatalLui | PiciorulStang | . . .

Tabela 6.1: Forma BNF pentru sintaxa din logica predicatelor.

Semantica trebuie să lege enunţurile de modele pentru a se putea determina valoarea
de adevăr. Avem deci nevoie de o interpretare care să specifice exact care obiecte, relaţii şi
funcţii sunt legate de ce simboluri asociate simbolurilor de constante, predicate şi funcţii.
Una din interpretările posibile, care este adecvată exemplului nostru este:

• constanta Richard se referă la persoana Richard; analog constanta John;


92 CAPITOLUL 6. LOGICA DE ORDINUL ÎNTÂI

• predicatul Frate se referă la relaţia dintre două persoane

• funcţia PiciorulStang se referă la “PiciorulStang” pomenit la pagina 90.

Există şi alte interpretări care se pot face, de exemplu se poate lega constanta Richard
de persoana John sau de coroană; sau se poate ca diferite nume să se refere la acelaşi
obiect.
Valoarea de adevăr a fiecărui enunţ se defineşte ı̂n raport cu un model şi o interpre-
tare pentru simbolurile din enunţ. Ca atare, deducerea, validitatea, satisfiabilitatea sunt
definite relativ la toate modelele si toate interpretările posibile. Subliniem că modelele
pot fi infinite, de exemplu dacă se referă la mulţimea numerelor naturale.

6.2.3 Termeni
Un termen este o expresie logică ce se referă la un obiect – constante, funcţii, relaţii.
Un simbol pentru funcţii este util pentru a pune ı̂n legătură obiecte (de exemplu constanta
John cu constanta piciorul stâng al lui John), cu efect benefic asupra reducerii numărului
de simboluri folosit pentru constante. Este un alt mod de a denumi obiecte, plecând de
la altele.

6.2.4 Propoziţii atomice


Sunt folosite pentru a enunţa fapte. O propoziţie atomică este de regulă formată
dintr-un simbol predicativ urmat de o listă de termeni: Frate(John, Richard). Argumen-
tele pot fi şi termeni compleşi obţinuţi prin aplicare de funcţii: Casatorit(Tata(John),
Mama(Richard)).
Un enunţ atomic este adevărat ı̂ntr–un model dat şi sub o anumită interpretare dacă
are loc relaţia referită de simbolul asociat predicatului ı̂ntre obiectele referite de argu-
mente.

6.2.5 Enunţuri complexe


Prin utilizarea conectivelor logice se pot construi enunţuri complexe, precum ı̂n calculul
propoziţional. Semantica enunţurilor complexe formate cu conective logice este identică
cu cea din logica propoziţiilor.

6.2.6 Cuantificatori
Cuantificatorii permit exprimarea de proprietăţi pentru colecţii de obiecte, ı̂n loc de a
le enumera pe toate (de aici şi dorita concizie a limbajului). Cuantificatorii sunt ı̂nsoţiti
6.3. PROCESUL DE MANAGEMENT AL CUNOŞTINŢELOR 93

de o variabilă care poate servi ca argument pentru funcţii şi relaţii. Un termen care nu
are variabile se numeşte termen legat. Enunţul ∀x P (x) arată că pentru orice obiect x, P
este adevărată.
Să consideră de exemplu propoziţia ∀x Rege(x) ⇒ P ersoana(x). Pentru a putea
spune că este adevărată, toate cele cinci propoziţii de mai jos ar trebui să fie adevărate:

Richard este rege ⇒ Richard este persoană


John este rege ⇒ John este persoană
Piciorul stâng al lui Richard este rege ⇒ Piciorul stâng al lui Richard este persoană
Piciorul stâng al lui John este rege ⇒ Piciorul stâng al lui John este persoană
Coroana este rege ⇒ Coroana este persoană
Dacă pentru primele două cazuri nu avem nici o problemă din punct de vedere al raportării
la realitate, ultimele trei propoziţii sunt un pic ciudate. Dar să ne amintim că ı̂n logica
propoziţională falsul implică orice, aşa că nu se poate spune nimic despre valoarea de
adevăr a a concluziilor (“Coroana este persoană” ş.a.). Oricum, pornind de la o premisă
falsă, ı̂ntreaga implicaţie este adevărată.
Cele cinci propoziţii de mai sus care au rezultat din transcrierea ı̂n limbaj propoziţional,
conform acţiunii lui ∀ formează interpretarea extinsă.
Calificatorul existenţial ∃ are următoarea semantică: ∃x P (x) este adevărată ı̂ntr–
un model şi sub o intepretare dată dacă este adevărată pentru cel puţin o intepretarea
extinsă.
Cuantificatorii pot fi imbricaţi, iar ordinea de precizare a lor este importantă. De
exemplu, enunţul ∃x ∀y Iubeste(y, x) ı̂nseamnă că există cel puţin un obiect care este
iubit de toată lumea, pe când dacă se inversează cuantificatorii, atunci se obţine ceva
diferit: ∀y ∃x Iubeste(y, x) ı̂nseamnă că oricine iubeşte pe cineva (dar acel cineva poate
să difere pentru două persoane y diferite).
Există o strânsă legătură ı̂ntre cei doi cuantificatori. Mai exact, se poate renunţa la
oricare dintre ei, deoarece:

∀x P (x) ≡ ¬(∃x ¬P (x))


∃x P (x) ≡ ¬(∀x ¬P (x))
dar ı̂i menţinem pe amândoi, pentru a obţine exprimări mai naturale.

6.3 Procesul de management al cunoştinţelor


Proiectele de management al cunoştinţelor variază mult, dar toate includ paşii:

1. Identificarea temei de lucru. Inginerul de cunoştinţe trebuie să schiţeze domeniul


de ı̂ntrebări pentru care baza de cunoţinţe asigură suport şi tipul de fapte care
94 CAPITOLUL 6. LOGICA DE ORDINUL ÎNTÂI

vor fi disponibile pentru fiecare instanţă de problemă. De exemplu, pentru lumea


monstrului, ce anume se doreşte: interogarea despre stările diferitelor camere, sau
să se ştie care este acţiunea următoare?

2. Asamblarea cunoştinţelor relevante. Inginerul de cunoştinţe trebuie să fie expert


ı̂n domeniul abordat, sau să poată să colaboreze cu experţi umani pentru a putea
extrage ceea ce se cunoaşte ı̂n domeniu. La acest pas de achiziţie a cunoştinţelor
nu trebuie să se formalizeze cunoştinţele, ci doar să se ı̂nţeleagă care este domeniul
problemei şi cum se lucrează ı̂n el.

3. Deciderea asupra unui vocabular de predicate, funcţii şi constante. Se translatează


conceptele importante ale domeniului pentru care se aplică procesul ı̂n nume con-
venabil alese. Rezultatul este un vocabular care formează ontologia1 domeniului.

4. Codificarea cunoştinţelor generale despre domeniu. Inginerul de cunoştinţe scrie


axiomele pentru toţi termenii de vocabular. Este bine să se facă aici şi specificarea
semnificaţiilor termenilor.

5. Codificarea unei descrieri pentru o problemă concretă. Constă ı̂n scrierea enunţurilor
atomice despre instanţe ale conceptelor care sunt deja parte a ontologiei. Este
echivalentul furnizării datelor pentru programele din limbajele procedurale.

6. Punerea de ı̂ntrebări şi obţinerea de răspunsuri. Procedura inferenţială operează


asupra axiomelor şi faptelor specifice problemei pentru a obţine noi fapte de care
suntem interesaţi.

7. Depanarea bazei de cunoştinţe. Dacă de exemplu lipseşte o axiomă, unele interogări


nu vor primi răspuns. Se poate cere unui astfel de sistem să expliciteze paşii pe care
ı̂i parcurge, pentru a vedea unde se “blochează”.

6.4 Inferenţa propoziţională comparată cu inferenţa de


ordinul ı̂ntâi
Introducem o tehnică care permite realizarea de inferenţe care pot fi aplicate unor
enunţuri cu cuantificatori obţinându–se enunţuri fără cuantificatori. Se poate intui astfel
că inferenţa de ordinul ı̂ntâi are o variantă: trecerea la enunţuri din logica propoziţională
şi folosirea unui mecanism inferenţial adecvat.
1
Ontologia studiază existenţa ca atare, trăsăturile şi principiile comune oricărei existenţe.
6.4. INFERENŢA PROPOZIŢIONALĂ COMPARATĂ CU INFERENŢA DE ORDINUL ÎNTÂI95

6.4.1 Reguli de inferenţă pentru cuantificatori


Să presupunem că avem enunţul:

∀x Rege(x) ∧ Lacom(x) ⇒ Rau(x)

Dată fiind semantica lui ∀ se pot infera oricare din propoziţiile:

Rege(John) ∧ Lacom(John) ⇒ Rau(John)


Rege(Richard) ∧ Lacom(Richard) ⇒ Rau(Richard)
Rege(T atalLui(John)) ∧ Lacom(T atalLui(John)) ⇒ Rau(T atalLui(John))
Regula instanţierii universale spune că putem deduce orice propoziţie obţinută prin
substituirea unei variabile cu un termen legat (care nu are nicio variabilă). Să notăm cu
Subst(θ, α) rezultatul aplicării substituirii θ ı̂n α. Atunci:
∀v α
Subst({v/g}, α)
Cele trei enunţuri propoziţionale date anterior sunt obţinute prin substituţiile: {x/John},
{x/Richard}, {x/T atalLui(John)}.
Regula instanţierii universale este: pentru orice enunţ α, pentru orice variabilă v şi
un simbl constant k care nu apare ı̂n baza de cunoştinţe avem că:
∃v α
Subst({v/k}, α)
De exemplu, din enunţul ∃x Coroana(x)∧P eCap(x, John) putem deduce: Coroana(C1 )∧
P eCap(C1 , John) unde C1 nu mai apare undeva ı̂n baza de cunoştinţe. Practic, ceea ce
face instanţierea existenţială este să dea un nume pentru obiectul care satisface condiţia.
Noul nume se mai cheamă şi constantă Skolem. Instanţierea existenţială poate fi folosită
o singură dată şi propoziţia care are acest cuantificator poate fi eliminată.

6.4.2 Reducerea la inferenţa propoziţională


Pe baza mecanismului de mai sus (reducerea unor enunţuri cu cuantificatori la unele
fără) se poate reduce inferenţa de ordinul ı̂ntâi la inferenţă propoziţională. De fapt, ceea
ce trebuie să facem este să ı̂nlocuim un enunţ cu care are cuantificator universal cu toate
enunţurile ı̂n care variabila este ı̂nlocuită cu toate valorile posibile. De exemplu, baza de
cunoştinţe din logica predicatelor:

∀x Rege(x) ∧ Lacom(x) ⇒ Rau(x)


Rege(John)
Lacom(John)
F rate(Richard, John)
96 CAPITOLUL 6. LOGICA DE ORDINUL ÎNTÂI

Se aplică instanc tierea universală primului enunţ folosind toate substituirile de variabile
cu termeni legaţi din vocabularul BC, deci {x/John} şi {x/Richard} şi obţinem:

Rege(John) ∧ Lacom(John) ⇒ Rau(John)


Rege(Richard) ∧ Lacom(Richard) ⇒ Rau(Richard)

Baza de cunoştinţe rezultată (se adaugă, evident, şi ultimele 3 propoziţii din BC iniţială)
este ı̂n formă propoziţională, dacă substituim enunţurile cu valori legate – Rege(John),
Lacom(John), etc – cu simboluri propoziţionale – α, β, etc. Se poate aplica oricare din
algoritmii din capitolul precedent şi se obţin concluzii – Rau(John).
Există ı̂nsă o problemă: daca BC include un simbol ataşat unei funcţii (de exemplu
TatalLui), atunci prin propoziţionalizare se ajunge la o BC infinită, deoarece putem sub-
stitui pe x cu John, T atalLui(John), T atalLui(T atalLui(John)), şi tot aşa la infinit.
Există ı̂nsă un răspuns, datorat lui Herbrand care spune că dacă un enunţ este implicat
de către baza de cunoştinţe originală, exprimată sub formă de predicate, atunci există
o demonstraţie care pleacă de la un set finit de enunţuri ı̂n formă propoziţională, prin
care se poate deduce enunţul respectiv. Se poate genera o astfel de demonstraţie plecând
de la ı̂nlocuirea lui x cu John şi Richard (deci adâncime 0), apoi cu T atalLui(John) şi
T atalLui(Richard) (adâncime 1) şi cu termeni de adâncime din ce ı̂n ce mai mare.
Ce se ı̂ntâmplă dacă enunţul dat ca posibilă concluzie nu este deductibil din baza
de cunoştinţe? Teorema lui Herbrand (sau alte rezultate) nu spun nimic ı̂n acest sens.
Procedura descrisă mai sus va genera termeni cu adâncime din ce ı̂n ce mai mare, dar
nefiind o limitare dată, procedeul se va repeta la nesfârşit. Altfel zis, problema implicaţiei
ı̂n logica de ordinul ı̂ntâi este semidecidabilă – adică există algoritmi care răspund pozitiv
pentru un enunţ care este deductibil din BC, dar nu există algoritm care de asemenea să
răspundă negativ la fiecare enunţ nedeductibil.
Bibliografie

[1] Artificial Intelligence. A Modern Approach, Prentice Hall, Stuart Russel, Peter Norvig,
2nd edition, 2003

[2] Principiile inteligentei artificiale, Editura Albastra, D. Dumitrescu, 2004

[3] Pattern Classification, ediţia a doua, Ed. Wiley-Interscience, Richard O. Duda, Peter
E. Hart, David G. Stork, 2000

[4] Genetic Algorithms + Data Structures = Evolution Programs, Ed. Springer-Verlag,


Zbigniew Michalewicz, 1998

[5] Machine Learning, Ed. McGraw–Hill, Tom Mitchell, 1997

[6] Neural Networks. A comprehensive foundation, Ed. Prentice Hall, Simon Haykin, 1999

97