Documente Academic
Documente Profesional
Documente Cultură
Toate aceste întrebări au generat polemici numeroase care nu au condus nici până
în prezent la o opinie comună în acest domeniu. Din acest motiv, evoluŃia domeniului va fi
ilustrată de diversele definiŃii care s-au acceptat pentru IA de-a lungul timpului şi până în
prezent.
1) 1975 - IA este domeniul care se ocupă cu studiul conceptelor care permit ca maşinile
să fie inteligente
2) 1981 - IA este un domeniu al informaticii care îşi propune crearea unor sisteme
inteligente de calcul care să posede acele caracteristici care sunt asociate în general cu
inteligenŃa în domeniul uman: raŃionament, capacitate de învăŃare, de rezolvare şi de
comunicare.
Plecându-se de la constatarea ca există probleme care nu dispun de un algoritm de
calcul sau algoritmul este prea complicat, s-a luat în considerare că acestea fac obiectul IA,
în prezent fiind acceptată următoarea definŃie pentru IA.
1
InteligenŃă Artificială. Tehnici.
3) 1990 - IA este un domeniu al informaticii care începe acolo unde informatica clasică
se opreşte, destinat rezolvării problemelor pentru care nu există un algoritm de calcul sau
pentru care algoritmii sunt prea complicaŃi pentru a fi rezolvaŃi în maniera clasică.
IA prezintă un punct de vedere diferit faŃa de cel clasic în rezolvarea unei probleme.
Clasic se manipulează informaŃii numerice care sunt prelucrate în contextul unor algoritmi.
Din punct de vedere al IA se manipulează cunoştinŃe utilizate în cadrul unor strategii.
Clasic
enunŃ ---> algoritm de calcul --->rezultat
InteligenŃă Artificială
problema ---> (informaŃii / cunoştinŃe + strategie de rezolvare.) --->concluzie
2
InteligenŃă Artificială. Tehnici.
De exemplu :
Premise InferenŃă Concluzii
Socrate este un om.
Orice om este muritor --------------------------------------> Socrate este muritor.
Într-un raŃionament un set de judecăŃi numite premise, sunt legate de o alta judecată
numită concluzie printr-un proces care poartă denumirea de inferenŃă. Procesul deductiv
este ilustrat de exemplul de mai sus.
unde Ai şi Bi sunt formule atomice iar n, m şi k pot fi eventual 0. Pentru cazul in care k = 1
clauzele poartă denumirea de clause Horn
4
InteligenŃă Artificială. Tehnici.
Intrebarea este cum se procedează astfel incat sa obŃinem consecinŃa logica de mai sus?
Formalizand problema care ne interesează, (cea a verificării deductibilităŃii pe un set de
axiome), se obŃine:
avand doua formule A şi B, este B o consecinŃă logică a lui A?
Considerăm un sistem de clause Horn format din:
- o multime de formule atomice: A1 ,…………, Am denumite axiome
- o multime de reguli, care sunt clause Horn
- o concluzie care este tot o formula atomica.
Variabilele care apar in axiome şi reguli se vor citi cu “oricare” iar cele din concluzie cu
“exista”. De exemplu pentru cele doua premise de mai sus
Om(Socrate) “Socrate este om”
(∀ x) (Om(x) -->Muritor(x)) “Oricine este x, dacăeste om atunci x este muritor”
iar o concluzie de tipul :
Muritor(x) se citeste ca o intrebare: exista x, astfel incat x sa fie muritor?
Algoritmul de verificare a deductibilităŃii este implementat într-un mecanism de inferenŃă
care stă la baza efectuarii deducŃiilor logice pe un set de axiome descrise prin clause Horn,
aspect care permite construirea unor limbaje special dedicate modelarii modului in care
gandesc oamenii. Din cele discutate se observa ca:
- mecanismul de inferenŃă va trebui să dispună de două componente: una de
căutare prin care partea stângă a unei reguli apare ca un şablon ce se
suprapune peste setul de premise.
- Când şablonul se potriveşte intră în funcŃiune cea de a doua componentă care
unifică variabilele din şablon cu cele din setul de premise (x primeşte valoarea lui
Socrate). Introducând valoarea în membrul drept se obŃine un adevar nou:
Muritor(Socrate).
Exercitii
1. Clauzele Horn utilizate pentru descrierea cunoştinŃelor contin variabile. Care este
semnificatia acestui concept?
2. Dati definitia: Inteligentei Umane şi a Inteligentei Artificiale
5
InteligenŃă Artificială. Tehnici.
Reprezentare
Date Actiuni
(Concluzii)
Control
predicates
clauses
fiecare dintre acestea avand un rol de structurare a informaŃiei care urmeaza sa fie supusa
procesului de inferenŃă.
Astfel sintaxa axiomelor şi regulilor apare descrisa in sectiunea predicates, axiomele
(propoziŃii simple) şi regulie (fraze) sunt descries in sectiunea clauses. Sectiunea domains
este destinată specificarii structurii de date utilizatăla domeniloor la care apartin
componentele structurilor utilizate. Se respecta următoarele restrictii:
- numele componentelor elementare ale propoziŃiilor trebuie sa inceapă cu o literă
mică care poate fi urmată de oricate combinatii de caractere alfanumerice sau
semen de tip underline “_”
- numele predicatelor pot fi combinatii de litere, cifre sau caractere de subliniere;
- o propozite sau fraza scrisa in topica Horn se termina obligatoriu cu punct.
- semnul --> este definit prin dacă (if). Acesta se poate reprezenta şi prin simbolul :-
Modul de transpunere a acestor propoziŃii simple intr-o baza de cunoştinŃe Prolog care sa
poată fi ulterior explorată de o maşina de inferenŃă (care apartine limbajului in cauza) este:
domains
nume=symbol
virsta=integer
predicates
are_vârsta_de(nume, virsta)
clauses
are_vârsta_de(dan, 7).
are_vârsta_de(ana, 9).
are_vârsta_de(radu, 9).
are_vârsta_de(ion, 10).
Se observa ca baza de cunoştinŃe este formată numai din axiome fara a fi prezente relaŃii
intre acestea. Inspectarea bazei de cunoştinŃe presupune punerea de întrebări prin care se
doreste obtinerea de informaŃii relative la faptele relatate de propoziŃii. Întrebările se pun
dupa lansarea masinii de inferenŃă din Prolog in momentul aparitiei mesajului Goal (Tinta)
prin care maşina atentioneaza utilizatorul ca asteapta punerea unei întrebări. Tipul
intrebării care se pune, depinde de structura bazei de cunoştinŃe, fiind prezente
următoarele variante:
8
InteligenŃă Artificială. Tehnici.
In care predicat este in general predicatul propozitiei simple care se pune, iar variabila o
componenta a propozitiei.
În general aceste intrebări se pot încadra în următoarele trei mari categorii:
1.-se verifică prezenŃa unui obiect în baza de cunoştinŃe
Exemplu: este prezentă o persoană cu numele Radu şi vârsta 9 ani?
? are_vârsta_de(radu,9)
yes
2.-se caută în bază obiectele care prezintă o anumită proprietate
Exemplu: care sunt persoanele cu vârsta de 9 ani?
? are_vârsta_de(Pers,9)
Pers=ana
Pers=radu
2 solutions
3.-de confirmare a prezenŃei unei proprietăŃi în baza de cunoştinŃe
(sau a unui obiect)
Exemplu: există cineva cu vârsta de 10 ani?
? are_vârsta_de( _ ,10)
yes
ObservaŃii:
1.-variabilele încep cu o literă mare şi în momentul realizării unei potriviri în
baza de cunoştinŃe realizată de maşina de inferenŃă, valoarea va reprezenta o soluŃie a
problemei
2.-valorile care nu interesează, traduse prin cineva, orice, ceva sunt
reprezentate de caracterul _ pe poziŃia variabilei în cauză, avand semnificaŃia de variabilă
anonimă
unde:
- variabila i defineste o componenta a întrebării, care in acest caz prezintă topica
unei fraze;
9
InteligenŃă Artificială. Tehnici.
- predicat I defineste predicatul unei propoziŃii din frază, dacăsunt mai multe
propoziŃii acestea sunt despartite prin şi (în loc de and se poate pune , ) urmate
opŃional de expresii relaŃionale între variabile (ek >,<,<>,=,>=,<=).
domains
nume=symbol
virsta=integer
predicates
are_vârsta_de(nume, vârsta)
este_mai_mare(nume, nume)
clauses
are_vârsta_de(dan, 7).
are_vârsta_de(ana, 9).
are_vârsta_de(radu, 9).
are_vârsta_de(ion, 10).
este_mai_mare(P1, P2) if
are_vârsta_de(P1, V1),
are_vârsta_de(P2, V2),
V1>V2.
11
InteligenŃă Artificială. Tehnici.
Mecanismul acŃionează iniŃial pe setul de axiome, după care trece pe setul de reguli.
Mecanismul presupune două componente:
- o componentă de căutare prin potrivire (unificare) dintre un predicat prezent în
definiŃia probleme şi o clauză.
- O componenta de cautare dupa potrivire in contextual restrictiilor introduce de
potrivirea gasita.
1. Unificarea
Cum unificarea se defineşte ca fiind procesul de asociere între o întrebare şi o
clauză, trebuie precizat ce înseamnă procesul de asociere.
1.1.unificarea (matching)
Termenul de unificare se poate folosi cu diverse semnificaŃii, de exemplu: unificarea
unei întrebări cu o clauză, unificarea unei variabile cu o constantă, unificarea a două
12
InteligenŃă Artificială. Tehnici.
variabile, etc. În general există trei cazuri distincte de unificare, referindu-ne la nivelul cel
mai de jos al acestui proces :
şi o întrebare :
? - părinte(mircea, ioana) (g)
evident structurile clauzei şi a întrebării sînt identice.
Fără nici o problemă se asociază :
-- predicatul din întrebarea (g) cu predicatul din clauza (f) -axioma
-- primul argument din întrebarea (g) cu primul argument din clauza (f)
-- al doilea argument din întrebarea (g) cu al doilea argument din clauza (f)
Ca urmare se poate spune că întrebarea (g) se asociază cu clauza (f), mai exact (g)
se unifică cu (f).
(2) O unificare se poate face şi cînd apar una sau mai multe variabile libere.
--Fie clauza (axioma) :
şi întrebarea :
? - părinte(mircea, X). (g)
instanŃiere a lor, după care devin ''libere'' şi dacă este cazul, se caută alte soluŃii.
Astfel, singura posibilitate ca o variabilă dintr-o întrebare să fie ''legată'' în momentul
încercării unei asocieri este ca întrebarea să fie compusă, să implice mai mulŃi paşi;
variabila poate deveni ''legată'' într-un pas anterior.
Exemplu :
? - părinte(mircea, X) and părinte(X, anca).
Cu semnificatia: ''Găseşte pe cineva care este copilul lui Mircea şi este părintele lui
Anca.''
Întrebarea este compusă de fapt din două sub-întrebări, şi întotdeauna cînd se
ajunge la a doua sub-întrebare, variabila X este ''legată'' de o valoare. Prima sub-întrebare
se asociază conform cazului (2), a doua sub-întrebare conform cazului (1).
şi întrebarea :
? - părinte (mircea, Y) (g)
şi întrebarea :
? - tata (X, _ ) (g)
tradusă astfel : ''Cine este tată ?'', fără a se cere şi cine este copilul.
(4.1.) În primul rînd se încearcă unificarea întrebării (g) cu clauza (a1):
-- se asociază predicatele ''tata'' pentru (g) şi (a1).
-- se asociază variabila liberă X din (g) cu valoarea ''mircea'' din (a1);
variabila X devine ''legată'' de valoarea ''mircea''
-- variabila anonimă din (g) se asociază cu orice ar fi pe poziŃia argumentului
doi din (a1).
(4.2.) Se returnează o soluŃie X = mircea.
(4.3.) Se revine la clauza (a2), unde întrebarea (g) încearcă o nouă unificare; în
prealabil variabila X a devenit ''liberă''. De data aceasta X se ''leagă'' de valoarea ''sanda''
, iar variabila anonimă din (g) se asociază cu argumentul ''ana'' din (a2).
(4.4.) Se returnează a doua soluŃie X = sanda.
2. Backtracking
Este o metodă folosită de maşina de inferenŃă PROLOG pentru obŃinerea unei soluŃii
(eventual mai multe soluŃii) pentru o anumită problemă.
Din momentul în care maşina de inferenŃă a sistemului PROLOG începe căutarea
unei soluŃii pentru o întrebare dată, se poate ajunge în situaŃia de a decide între două sau
mai multe posibile căi pe care să se continue căutarea; în acest caz se fixează un indicator
pentru acest punct de ramificare (punct de backtracking) şi se selectează prima cale
pentru căutare. Dacă se termină cautarea pe această variantă, se revine la ''punctul de
backtracking'' şi se reia căutarea unei soluŃii pe următoarea cale disponibilă.
În continuare vom folosi şi noŃiunea de sub-întrebare (sub-scop); aceasta pentru a
exprima mai exact faptul că o întrebare (scop) poate fi compusă din mai multe sub-
întrebări.
15
InteligenŃă Artificială. Tehnici.
şi întrebarea compusă :
Goal : lista_meniu (X) , dif (X, guvid).
Modul de căutare a soluŃiilor se poate reprezenta sub forma următorului arbore,
parcurgerea fiind de sus în jos, şi de la stînga la dreapta:
2.6. Exemplu
Vom incerca sa exemplificam acest mecanism prin rezolvarea unei enigme logice.
Patru copii, Ion, Petru, Gabriel şi Dan, se joacă în curte cu mingea şi sparg un geam.
Fiecare spune ca nu a facut-o el, dar mai afirmă că:
Ion spune că Petru şi Gabriel sunt mincinoşi.
Gabriel spune ca Ion, Petru şi Dan sunt mincinoşi.
Dan spune ca Ion, Petru şi Gabriel sunt mincinoşi.
Cine spune adevărul?
Din analiza setului de afirmaŃii rezultă doua axiome elementare:
1.-o persoana spune despre celelalte două că mint
2.-o persoana spune despre celelalte trei că mint
17
InteligenŃă Artificială. Tehnici.
Remarcă.
Practic intrebarea parcurge prin intermediul mecanismului de inferenŃă informaŃia
din baza de date, pană in momentul in care prin cautare şi unificare realizate in etape
succesive se indeplinesc toate restrictiile impuse de axiomele prezente in baza de
cunoştinŃe din sectiunea clauses.
Exercitii
1) Presupunem ca avem urmatoarea baza de cunoştinŃe:
(a) Care este numarul maxim de raspunsuri , fara a contoriza cele de tip nu, care se
obtin la intrebarea :
?- p(X), q(Y).
(b) Care este numarul maxim de raspunsuri care se obtin la intrebarea
?- p(X), q(X).
18
InteligenŃă Artificială. Tehnici.
3. STRUCTURI DE DATE 1.
În acest capitol se vor discuta doua mari probleme:
- prima este legată de structurile de date utilizate pentru descrierea elementelor
care apar in propoziŃiile şi frazele din limbaj natural care se transpun intr-o baza
de cunostinŃe;
- cea de a doua problemă se referă la faptul că in baza de cunostinŃe se pot
introduce strategii suplimentare de explorare a cunostinŃelor prezente, acestea
vor complecta maşina de inferenŃă şi o vor face mai selectivă şi specifică in
actiunea sa in momentul interogarii.
domains
clasa_obiecte=obiect_1(...);
obiect_2(...);
.
.
obiect_k(...);
clauses
are(dan, carte("Cei trei ...", "Al.Dumas")).
are(da,. calculator(at586)).
Comentarii:
1.-domeniul string este un subdomeniu al celui symbol
2.-o întrebare se poate pune sub forma:
a)?-are(dan,X)
X=carte(...,...)
X=calculator(...)
b)?-are(dan,carte(_,A))
A="Al.Dumas"
1 solution
S-a specificat că elementele componente pot fi la rîndul lor divizate în alte
subansamble cea ce corespunde de fapt situaŃiei din lumea reală. De exemplu, autorul
poate fi divizat în nume şi prenume. în aceste condiŃii exemplul poate fi rescris sub forma:
domains
obiecte=carte(nume_carte,autor);
calculator(tip)
autor=autor(nume,prenume);
Observatii:
1.-se observa apariŃia unui arbore a cărui rădăcină este functorul, nodurile sunt
elementele componente ce se pot divide în subansamble iar frunzele sunt elemente
indivizibile.
2.-pentru elementele care se împart în alte componente definirea domeniului este identică
cu cea a functorului
clasa=obiect(element1,...,elementk);
element1=element1(s1,...,sm);
s1=s1(...);
20
InteligenŃă Artificială. Tehnici.
3.2 Recursivitate
Pană in present, baza de cunostinŃe este alcatuita numai din fapte care au
corespondent propoziŃii şi fraze din limbajul natural care se referă la o anumită problemă şi
care sunt analizate de o maşina de inferenŃă prezentă in cadrul limbajului Prolog. Este
evident ca in multe situaŃii mecanismul de inferenŃă pus la dispozitie este insuficient de
selectiv, ceea ce face ca gasirea solutiei sa dureze mult sau sa fie imposibila de obtinut,.
Acest aspect face ca natura problemei analizate sa impuna utilizarea unor strategii
specifice de explorare, care evident vor trebui sa fie integrate in contextual maşinii de
prezente. Pentru a putea complecta maşina de inferenŃă cu aceste strategii devine
necesară prezenŃa unui mecanism de construire a acestora. Acest mecanism este dat de
recursivitate şi este utilizat pentru construirea regulilor ce descriu strategii specifice unei
baze de cunostinŃe particulare. Prin urmare in cazul general o baza de cunostinŃe poate fi
formată la nivelul sectiunii clauses din:
Clauses
CunostinŃe (premise şi reguli)
Strategii de explorare a cunoştinŃelor care
cooperează cu maşina de inferentă
Strategiile complementare sunt la randul lor formate din premise şi reguli, insa de
data aceasta ele nu mai descriu fapte din lumea inconjuratoare ci modul in care acestea
pot fi explorate. PrezenŃa acestui mecanism dă posibilitatea de asemenea de a extinde
tehnicile de reprezentare a informaŃiilor prezente in fraze şi propoziŃiile din limbajul natural
care in pană acum nu erau posibil de rezolvat, prin introducerea a ceea ce poarta
denumirea de obiect recursiv.
21
InteligenŃă Artificială. Tehnici.
| 1 pentru n=1;
f ( 0 )= { 1 pentru n=2;
| f ( n-1 ) +f ( n-2 ) pentru n>2;
predicates
f ( integer,integer )
clauses
f ( 1,1 ).
f ( 2,1 ).
f ( N,T ) if N>2,
N1=N-1,
f ( N1,T1 ),
N2=N-2,
f ( N2,T2 ),
T=T1-T2.
În acest contextual acestei definitii,o grupă de studenŃi poate apare sub forma:
grupa ( ion ,empty ) - grupa cu 1 student;
22
InteligenŃă Artificială. Tehnici.
Exemplu :
ConstruiŃi o procedură care să calculeze expresii de forma: 1-2+3-4+5.....UtilizaŃi un
obiect recursiv pentru descrierea unei astfel de expresii. Se va folosi forma prefixată
poloneză pentru scrierea expresiilor.
De exemplu:
7-3+10-20+11 se poate scrie +(-(+(-(7,3),10),20)11)
Baza de cunoştinŃe este formata practice in acest caz de strategia de explorare a unei
expresii care se specifica in momentul punerii unei întrebări.
domains
expr=num ( real );
min ( expr,expr );
plus ( expr,expr )
predicates
rezolvă ( expr,val )
clauses
rezolvă ( num ( X ), X).
rezolvă ( min ( E1,E2 ),R ) if rezolvă ( E1,R1 ),
rezolvă (E2,R2 ),
R=R1-R2.
rezolvă ( plus (E1,E2 ),R ) if rezolvă ( E1,R ),
rezolvă ( E2,R2 ),
R=R1+R2.
ObservaŃie:
Expresia din exemplul anterior se scrie şi se pune intrebarea de forma:
?-E=plus( min ( plus( min( num ( 7 ),num ( 3 ) ),num ( 10 ) ),num ( 20 ) ),num ( 11 ) ),
rezolvă ( E,R )
R=5
1 solutions
23
InteligenŃă Artificială. Tehnici.
4. STRUCTURI DE DATE 2.
Pană in prezent am utilizat propoziŃii şi fraze pentru a descrie situaŃii care urmeaza
sa fi analizate de maşina de inferenŃă in contextul unor întrebări puse de utilizator. Aceasta
interogare, asa cum s-a vazut putea fi complectată de utilizator prin definirea unor strategii
proprii care sunt de asemenea cuprinse in baza cunostinŃe. Diversitatea situaŃiilor care apar
in lumea reală impune complectarea modalitatilor de concepere a bazelor de cunostinŃe
prin posibilitatea definirii de structuri in care să se incadreze obiecte, fapte sau chiar seturi
de propoziŃii sau fraze care se refera la acelaşi aspect. Ca urmare s-au definit noi structuri
de organizare a informaŃiilor care se adauga la cele existente ( obiecte compuse, respectiv
obiecte recursive ). Aceste noi structuri sunt:
- liste
- arbori
- grafuri.
domains
list=integer * %-> [ 1,2,3 ]
list1=symbol * %-> [ a,ana,alfa,beta ]
Elementele listei pot fi inclusiv liste, obiecte compuse sau alte structuri utilizator.
Exemple de liste astfel structurate sunt date in continuare.
domains
el=integer *
lista=el* %A -> [ [ 1,2 ], [ ],[ 4 ] ]
expr=n( real ); p ( expr,expr ); m ( expr,expr )
lista1=expr * % -> [ [ n ( 7 ),p ( n (3 ),n ( 2 ) ),....]
4.2.1 ApartenenŃa.
ConstruiŃi o procedură care să determine dacă un element aparŃine sau nu la o listă
de elemente. La construire se pleacă de la observaŃia: elementul aparŃine listei dacă este
identic cu capul listei sau aparŃine cozii acesteia. Prima parte conduce la o axioma ,a doua
la definirea unei reguli recursive.
domains
L=integer *
predicates
aparŃine ( integer,L )
clauses
aparŃine ( X,[ X| _ ] ).
aparŃine ( X, [ _|R ] ) if apartine ( X,R ).
Pe acest mecanism vom prezenta şi cele doua moduri de interogare prin care un
utilizator se poate adresa mecanismului de inferenŃă şi strategiilor complementare acestuia.
Aceste moduri sunt cunoscute sub denumirea de:
- mod de lucru declarativ;
- mod de lucru procedural.
25
InteligenŃă Artificială. Tehnici.
4.2.2 Concatenarea
Reprezintă operaŃia prin care se obŃine o a treia listă din unirea elementelor a doua
liste date. De exemplu
conc ( [ 1,2 ],[ 3,4 ],R )
R=[ 1,2,3,4 ]
26
InteligenŃă Artificială. Tehnici.
2 - se poate obŃine elementul care precede sau urmează unui element dat dintr-o lista sub
forma:
?- conc ( _ ,[ Inainte,3,Dupa| _ ], [ 1,2,3,4 ] )
Inainte=2 Dupa=4.
4.2.5. Permutarea.
Este operaŃia prin care sunt generate toate permutările posibile de generat cu o listă.
Aplicând permutarea asupra listei [ 1,2,3 ]:
?- perm ( [ 1,2,3 ] ,R )
R=[ 1,2,3 ]
R=[ 1,3,2 ]
......
6 soluŃii.
Procedura rezultă din următoarele observatii:
a ) rezultatul permutarii unei liste vide este lista vidă;
b ) dacă lista nu este vidă se permută coada listei ,după care se inserează capul listei
iniŃiale în lista cu elementele permutate.
domains
L=integer*
predicates
inser ( integer,L,L )
permut ( L,L )
clauses
permut ( [ ],[ ] ).
permut ( [ X|L ],R ) if permut ( L,L1 ),
inser ( X,L1,R ).
28
InteligenŃă Artificială. Tehnici.
29
InteligenŃă Artificială. Tehnici.
c ) se poate construi o procedură care să ştergă toate apariŃiile unui element de acelaşi tip
dintr-o listă:
clauses
sterg ( X,[ X|L ],L1 ) if sterg ( X,L,L1 ).
sterg ( X,[ Y|L1 ], [ Y|L2 ] ) if sterg ( X,L1,L2 ).
4.3. Exemple.
(1) ConstruiŃi o procedură care plecând de la o listă de numere cuprinse între 0 şi 9
să construiască o listă a cărei elemente sunt cuvintele corespunzătoare elementelor din
prima lista.
De exemplu:
tradu ( [ 1,0,4 ],R )
R=[ unu,zero,patru ]
Exercitii
1) ConstruiŃi o procedură care să construiască o listă a carei elemente sunt în
ordine inversă în raport cu elementele listei iniŃiale.
exemplu: ?- invers ( [ 1,2,3 ],R )
R=[ 3,2,1 ]
30
InteligenŃă Artificială. Tehnici.
Procedura trebuie să admită atât modul declarativ cit şi cel procedural ,în cele două
variante ( i,o ) şi ( o,i ).
2) Construiti un predicat de tip 'taie(A,B)' care elimina elementele de acelaşi tip din
lista A care apar de mai multe ori şi retine in lista B elementele o singura data. De exemplu:
?- taie([a,1,b,2,a,3,a,4,b],B).
B = [a,1,b,2,3,4]
31
InteligenŃă Artificială. Tehnici.
5.3. Exemple
1. ConstruiŃi o procedură care să calculeze numărul de elemente ale unei
liste. Predicatul este de forma: nr(lista,nr_elemente). Regulile de construcŃie
pornesc de la două observaŃii :
- lungimea unei liste vide este 0
-dacă lista nu este vidă, lungimea este dată de 1 (lungimea capului listei)
+ lungimea cozii listei. Procedura prezintă aspectul:
clauses
nr([ ], 0).
nr([ _ | Rest ],N) if
nr(Rest, N1),
N=1+N1.
32
InteligenŃă Artificială. Tehnici.
Goals:
?-maxim ([7,3,9,0], M)
M=9
Comentarii
Regula maxim divizează lista în elemente componente, reŃinându-le în stiva.
Când lista se reduce la un singur element ,începe rezolvarea apelurilor
recursive, moment in care regula max funcŃionează ca un filtru intre 2
elemente reŃinându-se de fiecare dată pe cel mai mare găsit.
33
InteligenŃă Artificială. Tehnici.
Exercitii
(1) ExerciŃii:specificaŃi dacă intrebările:
?- nr(L,4)
?- nr([a,b,c],3)
sunt corecte sau nu.
(2) Procedura max definite anterior acceptă sau nu modul de lucru declarativ ?
Se acceptă o întrebare de forma ?- maxim(L,9)
(3) Sunt acceptate de către procedura cmmd definita anterior întrebări de forma:
-cmmdc(15,20,5)
-cmmdc (X,20,5)
-cmmdc (15,Y,5)
34
InteligenŃă Artificială. Tehnici.
6.1. Problematica.
Pentru a ilustra conceptul de clauză deterministă ,respectiv
nedeterministă , considerăm exemplul definit de ştergere a unui element dintr-o
listă .SecvenŃa de clauze pentru un predicat de forma:
sterg(element, lista, rezultat) este
sterg( _ , [ ] , [ ] ).
sterg (X, [ X | R ], R).
sterg(X, [ Y | R1] , [ Y | R2 ]) if
sterg(X ,R1, R2).
Pentru o intrebare de forma:
?-sterg(2,[1,2,3,2,4],R) apare următoare structura de explorare a bazei de
cunoştinŃe de catre maşina de inferenŃă:
35
InteligenŃă Artificială. Tehnici.
36
InteligenŃă Artificială. Tehnici.
în care sunt permise toate soluŃiile posibile. Cu alte cuvinte spaŃiul soluŃiilor este
format din soluŃia definită de B1, … Bm şi variantele oferite de Bm+1, … Bn.
Elementul de tăiere îşi extinde acŃiunea şi pentru clauzele Horn de acelaşi
nume care urmează după acelea în care este prezent.
Sa consideram următoarea situaŃie:
H if P,Q,R,!,S,T,U.
H if U,V . % -> această regulă nu se mai execută
A if B,H,C. %->nu ne mai putem întoarce pentru B
A
Reguli de amplasare
Amplasarea lui ! depinde de contextul întrebării puse.Se recomandă utilizarea
următoarelor 2 metode:
37
InteligenŃă Artificială. Tehnici.
max(X,Y,X) if X>=Y.
max(X,Y,Y) if X<Y.
sau
max(X,Y,X) if X>=Y, !.
max( _ ,Y,Y).
aduna(elem, L,Rezult)
38
InteligenŃă Artificială. Tehnici.
% imparte(lista, lista>0,lista<=0)
imparte( [ ], [ ], [ ] ) .
imparte( [ESTE | R ] , [ESTE |L1], L2) if
ESTE>=0, !, imparte(R,L1 ,L2) .
imparte([ESTE,R],L1,[ESTE|L2]) if
imparte(R,L1,L2).
39
InteligenŃă Artificială. Tehnici.
clasa (X,luptator) if
bate_pe(X, _) ,
bate_pe( _ ,X) , !.
clasa(X,cistigator) if
bate_pe(X, _), !.
clasa (X, sportiv) if
bate_pe( _,X).
îi_place(tom,X) if
X=pisica ,!,fail. %(spune ca proprietatea este falsă)
îi_place(tom,X) if
animal(X).
ObservaŃie : prezenta lui fail în prima regulă face ca aceasta să devină falsă , iar
! din fata lui fail stopează căutarea pe următoarea regulă îi_place.
40
InteligenŃă Artificială. Tehnici.
not( P) if
P, !, fail;
true.
îi_place(tom,X) if
animal(X), not(pisica(X)).
diferit(X,Y) if
not(X=Y).
clasa(X,luptator) if
bate_pe(X, _ ),
bate_pe( _, X).
clasa(X,cistigator) if
41
InteligenŃă Artificială. Tehnici.
bate_pe(X, _ ), !.
clasa(X,sportiv) if
bate_pe( _,X).
Exercitii
1) Fiind data secventa: A :- B,C.
A :- not(B),D.
se cere construirea unei secvente care sa se comporte identic, in care negatia sa
dispara prin inlocuirea cu elementul de taiere !.Explicati succint
(1) de ce cele doua secvente au aceiasi comportare.
(2)care este efectul elementului de taiere in caz general
2) Considerind procedura: p(1). p(2) if !. p(3).
Care sunt raspunsurile la întrebările:
(a) ?- p(X).
(b) ?- p(X),p(Y).
(c) ?- p(X),!,p(Y).
42
Inteligenţă Artificială. Tehnici.
7.1. Scrierea.
Predicatul de scriere prezintă sintaxa:
write(arg1,.....,argn)
În care argumentele pot fi constante sau variabile ce aparţin unor domenii
standard sau nu. Dacă argumentul este un şir de caractere atunci acesta
reprezintă mesaj care se tipareşte pe ecran. În interiorul şirului sunt acceptate
următoarele caractere de control:
\n, salt peste n linii
\t, tab
43
Inteligenţă Artificială. Tehnici.
\b. spaţiu
De exemplu
write(" \t lista1= ",L1,"\n \t Lista2 ", L2) are ca efect o tipărire de forma:
lista1=[ ]
lista2 =[1,2]
În general predicatul write apare în proceduri recursive, aspect care implică
stoparea operaţiei de căutare a soluţiilor, astfel încât rezultatele parţiale să nu fie
tipărite.
7.2. Citirea
- este realizată de următoarele predicate:
readint(X) -- citire variabilă de tip intreg.
readreal(X) -- citire variabile din domeniul real
Operaţia de citire se termină în momentul apăsării tastei ENTER. Rezultatul este
un success, dacă numărul citit este un întreg sau real respectiv un eşec dacă
valoarea citită conţine caractere care nu aparţin numerelor întregi sau reale.
readln(X) -- citirea variabilelor din domeniul simbol sau
string
readchar(X) -- citirea caracterelor
Ultimul predicat este întotdeauna un succes. Primul este un eşec dacă şirul citit
nu este delimitat de " .
44
Inteligenţă Artificială. Tehnici.
domains
lista=integer *
predicates
citeşte(lista)
clauses
citeşte([ESTE |Rest]) if write("Element=");
readint(ESTE),
citeşte(Rest).
goal:
citeste(L),
write(L).
2. Construiti o procedura care să reia repetat operaţia de citire a unei liste. Dupa
fiecare listă construită prin dialog, se va specifica dacă operaţia continua sau nu.
Reluarea construirii listei va fi efectuată de predicatul repeta, sub forma:
domains
lista=integer*
predicartes
repeat citeste(lista)
goal
repeta.
clauses
repeta if
citeste(L),
write("lista= ",L),
write("\n Continuati? (d/n)"),
readchar(R), R='d', repeta.
% citeste este definit anterior .
45
Inteligenţă Artificială. Tehnici.
46
Inteligenţă Artificială. Tehnici.
repeta if
citeste_date ,!, % Dacă procedura citeste_date şi
executa ,!, % executa, sunt recursive , amplasarea
scrie, !, % elementului ! (cut) este obligatorie.
continuare , repeta.
Goal
Interfata de intrare / iesire cu utilizatorul,
repeta.
domains
I = integer*
predicates
scrie (l)
scrie_rind(l,integer)
clauses
scrie (L) if nl, scrie_rind(L,0).
scrie_rind([ ],-). % ------------>oprirea procesului recursiv
scrie_rind(L,3) if nl, scrie_rind(L,0).
scrie_rind ([ESTE|Rest],N) if
write(" ",ESTE),
N1=N+L,
scrie_rind(Rest,N1).
Observaţii:
a)Predicatul ne asigură trecerea la începutul unei linii noi.
b)Pentru procedura scrisă se contorizează numărul de elemente care se
scriu, după care regula scrie_rind(L,3) asigură trecerea la următorul rând.
47
Inteligenţă Artificială. Tehnici.
domains
nume,prenume=symbol
persoana =p(nume,prenume,integer)
lista=persoana *
predicates
citesc(lista)
citeste(pers)
clauses
citesc([Obiect|R]) if
citeste(Obiect),
citesc(R).
citesc([ ]).
citeste(p(N,P,V)) if
nl,
write("Nume="),readln(N),
write("Prenume="),readln(P),
write("Virsta="),readint(V),nl.
Observaţii :
Operaţia presupune definirea unui predicat de citire separat, la nivelul de
obiect compus. Acest predicat este utilizat pentru citirea fiecărui element al listei
ce se construieşte. Întreruperea operaţiei de construire se face introducând un
caracter care să forţeze readint să fie fals. Pentru structura de date in discutie se
va obţine o listă de forma :
[p(Ion,V,17),p(Vlad,C,20)...]
5) Scrierea cu format
Este asigurată de predicatul
writef (format, arg1, arg2, ...)
unde:
format reprezinta un şir de caractere în care apar descriptori de forma:
48
Inteligenţă Artificială. Tehnici.
49
InteligenŃă Artificială. Tehnici.
50
InteligenŃă Artificială. Tehnici.
2)
domains
nume=symbol
predicates
mai_rapid(nume,nume)
database
aleargă_repede(nume)
aleargă_încet(nume)
clauses
aleargă_repede(ana).
aleargă_repede(radu).
aleargă_încet(doru).
mai_rapid(X,Y) :- alearga_repede(X), alearga_incet(Y).
Goals : assert(aleargă_repede(ion))
Yes
Goals : aleargă_repede(X)
X=ana X=radu X=ion 3 solutions
Goals : save("axiome.dba")
Yes
Goals:consult("axiome.dba") {se încarcă baza de date}
51
InteligenŃă Artificială. Tehnici.
Observatii:
1) Intr-o baza de date nu pot fi asertate decât axiome. Există totuşi dialecte
de Prolog care permit şi asertarea regulilor.
2) La un moment dat pot exista 2 sau mai multe baze de date active. Pentru
a face deosebirea între acestea setul de predicate prezintă extensiile:
assertz(clausa,nume_baza_date)
asserta(clausa,nume_baza_date)
retract(clausa,nume_baza_date)
retractall(clausa,nume_baza_date)
save(nume_dos,nume_baza_date)
consult(nume_dos,nume_baza_date)
52
InteligenŃă Artificială. Tehnici.
domains
obiect=string atribut=string atribute=atribut*
database
este_un(obiect,obiect,atribute) tip_de(obiect,obiect,atribute)
fals(atribut)
predicates
run(obiect) intreaba(atribute)
clauses
run(Art):- este_un(X, Art, Lista ),
întreabă( Lista ),
tip_de(Răspuns,X,Lista2),
întreabă(Lista2),
write(Art, " de care aveŃi nevoie este ", Raspuns), nl, !.
run( _ ) :- write( "Nu există informaŃie suficientă" ).
întreabă( [ ] ).
întreabă( [A|R] ) :- not(fals(A)),
write("Vă ajută la",A),
write(" da sau nu?
readchar(C), nl, C='d',
întreabă(R).
întreabă( [A|_ ] ) :- assertz(fals(A)), fail.
Goal:run(unealtă)
Vă ajută la comunicare? d
Vă ajută la comunicarea cu oamenii? n
{În baza de date se assertează clausa fals("comunicarea cu oamenii") }
Vă ajută la comunicarea cu calculatorul? d
Unealta de care aveŃi nevoie este Pascal
ObservaŃie:
1) În acest mod, procedura poate reŃine o informaŃie în timpul dialogului
(faptul ca comunicaŃia cu oamenii este falsă) ceea ce face ca la o nouă reluare a
execuŃiei această întrebare să nu se mai pună.
53
InteligenŃă Artificială. Tehnici.
Clase de obiecte
Clasa 1 …………………………..Clasa n
Da
Subclase
Nu
………………….
Obiect 1 2……………m
Pentru raspuns:
Da pentru toate atributele unui nod acesta este validat
Nu pentru un singur răspuns de acest tip se invalideaza nodul
54
InteligenŃă Artificială. Tehnici.
findall(SoluŃie,Întrebare, Listă_soluŃii)
.
findall( C, tip_literă( C, consoană ), L ),
.
procedura de prelucrare a listei L,
Exercitii
1) Care sunt raspunsurile la întrebările:
? assert(p(a)),assertz(p(b)),asserta(p(c))
? p(X)
55
InteligenŃă Artificială. Tehnici.
9. GENEREAZA ŞI TESTEAZĂ
find(X) if generez(X),
testez(X).
56
InteligenŃă Artificială. Tehnici.
Exemple
(a) apartine(X,Lista) este un exemplu tipic de generator, cât şi de starategie de
testare a unor soluŃii.
Ca generator, aparŃine(X,[1,2,3]) va furniza trei soluŃii: X=1, X=2, X=3.
Ca modul de testare, acesta ar putea să apară sub forma intr-un predicat de
forma:
intersectează(Lx, Ly) if
aparŃine(X ,Lx), <-generează soluŃiile
aparŃine(X, Ly). <-testează soluŃiile
57
InteligenŃă Artificială. Tehnici.
aparŃine(X, Lx) if
conc(Ax, [X|Bx], Lx).
Cele două etape sunt întreŃesute, în sensul ca concatenarea generează două liste,
care sunt urmate imediat de verificarea faptului ca X este un element a lui Lx.
(c) ConstruiŃi o procedură care să coloreze o hartă planara, utilizind un număr minim
de culori, astfel încât să nu existe două regiuni vecine cu aceeaşi culoare. (problemă
rezolvată în 1976 când s-a demonstrat ca 4 culori sunt suficiente).
Vom incerca sa standardizam etapele de construire a strategiilor complementare
unei baze de cunostinte si in acelasi timp sa precizam cum se utilizează tehnica
"generează şi testează. Etapele care se recomanda a fi parcurse sunt urmatoarele:
1. Se stabileste structura de date care urmeaza sa fie utilizata. Aceasta depinde
de baza de cunostinte careia urmeaza sa i se ataseze strategia. Pentru cazul
dat structura de date este impusa de structura hartii si apare de urmatoarea
maniera : harta apare ca o lista de unde:
-fiecare regiune are un nume, o culoare şi o listă de culori ce
aparŃin regiunilor adiacente;
- de dexemplu pentru harta:
58
InteligenŃă Artificială. Tehnici.
2. Se defineste intrebarea care urmeaza sa fie pusa. Pentru cazul dat aceasta
este definite de predicatul:
color_map(harta, lista_de_culori),
unde harta reprezintă structura anterioară, lista_de_culori este o listă a culorilor
utilizate.
color_map([Regiune|Regiuni],Culori) if
color_regiune(Regiune,Culori),
color_map(Regiuni,Culori).
color_map([ ] , _ ).
(a) Generarea unei soluŃii (obtin) constă din scoaterea din lista de culori a
celei în care intenŃionăm a se desena harta. Rezultatul este o culoare şi o lista de
culori minus cea selectată.
59
InteligenŃă Artificială. Tehnici.
color_map([Regiune|Regiuni],Culori) if
color_regiune(Regiune,Culori),
color_map(Regiuni,Culori).
color_map([ ] , _ ).
color_regiune(regiunea(Nume,Culoare,Vecini),Culori) if
obtin(Culoare,Culori,Rest_Culori),
verific(Vecini,Rest_Culori).
obtin(X,[X|R],R).
obtin(X ,[Y|R1], [Y|R2]) if
obtin(X, R1, R2).
verific([ C|R],Lista) if
apartine(C,Lista),
verific(R,Lista).
verific([ ], _ ).
test_color(Map) if
map(Map),
culori(Culori),
color_map(Map,Culori).
Map = [ regiunea(a,A,[B,C,D]), regiunea(b,B,[A,C,E]), regiunea(c,C,[A,B,D,E]),
regiunea(d,D,[A,C,F]), regiunea(e,E,[B,C,F]), regiunea(f,F,[E,C,D]) ].
culori([rosu,galben,alb,verde]).
60
InteligenŃă Artificială. Tehnici.
Exemplu:
Trei prieteni au sosit pe locurile I, II, III într-o competiŃie sportivă. Fiecare din cei trei
au nume diferite, le plac sporturi diferite şi au diferite naŃionalităŃi. Lui Mihai îi place
baschetul şi este mai bun decât americanul. Simon, care este francez, este mai bun
decât jucătorul de tenis. Jucătorul de cricket a sosit primul. Cine este australianul?
Ce sport face Robert?
Mod de rezolvare
Enigmele se rezolvă instanŃiind valorile la o structură de date adecvată,
urmată de extragerea valorilor soluŃiilor. Fiecare afirmaŃie este tradusă printr-o
constatare care propune soluŃii şi le verifică imediat pentru structura de date
existentă. În final rezultă o structură de date ce prezintă variabile anonime (locuri
goale). Aceasta urmează sa fie completată de întrebările ce se pun structurii.
Practic tehnica genereaza si testeaza actioneaza ca un filtru care propune
solutii si retine numai pe acelea care corespund restrictiilor impuse. Pentru
realizarea acestui filtru se impune descrierea “ad literam” a fiecarei afirmatii din
contextual enigmei logic.
Pentru exemplul dat, din primele 2 propoziŃii rezultă structura de date care
urmeaza a fi utilizată.
prieten(Nume,Tara,Sport)
st=[ prieten(_, _, _), prieten(_, _, _), prieten(_, _, _) ]
61
InteligenŃă Artificială. Tehnici.
afirmaŃie rezultă că sunt referiŃi 2 oamenii care sunt prieteni, unul este Mihai, căruia
îi place baschetul, cel de-al 2-lea este un american. Mai departe ştiu că Mihai este
mai bun decât americanul; rezultă afirmaŃia:
mai_bun(Conc1A1,Conc2A1,Prieteni),nume(Conc1A1,Mihai),
sport(Conc1A1,baschet),nationalitatea(Conc2A1,americana).
Din propoziŃia a 4-a sunt referiŃi 2 concurenŃi care sunt prieteni, primul
concurent este Simon-francez, cel de-al 2-lea practică tenisul. ªtiind că Simon este
mai bun decât tenismen-ul, apare:
mai_bun(Conc1A2,Conc2A2,Prieteni),nume(Conc1A2,simon),
naŃionalitatea(Conc1A2,francez),sport(Conc2A2,tenis).
62
InteligenŃă Artificială. Tehnici.
% STRUCTURA DE DATE
domains
nume=symbol tara=symbol sport=symbol
concurent=prieten(nume,tara,sport)
prieteni=concurent*
% STRUCTURA PREDICATELOR
predicates
rezolva(prieteni) afirm_ca(prieteni)
pun_intreb(prieteni) mai_bun(concurent,concurent,prieteni)
nume(concurent,nume) sport(concurent,sport)
natiune(concurent,tara) primul(prieteni,concurent)
apartine(concurent,prieteni)
clauses
afirm_ca(Prieteni):-
% Afirmatia 1
mai_bun(Conc1A1,Conc2A1,Prieteni),
nume(Conc1A1,mihai),
sport(Conc1A1,baschet),natiune(Conc2A1,americana),
% Afirmatia 2
mai_bun(Conc1A2,Conc2A2,Prieteni),nume(Conc1A2,simon),
sport(Conc2A2,tenis),natiune(Conc1A2,francez),
% Afirmatia 3
primul(Prieteni,ConcA3),sport(ConcA3,crichet).
pun_intreb(Prieteni):-
% Intrebarea 1
apartine(C1,Prieteni),nume(C1,Nume),natiune(C1,australiana),
% Intrebarea 2
apartine(C2,Prieteni),nume(C2,robert),sport(C2,Sport),
% Raspuns
write("Australianul este ",Nume),
write("Robert joaca ",Sport).
% Clasament locurile 1 2 3
mai_bun(A,B,[A,B,_]). mai_bun(A,C,[A,_,C]). mai_bun(B,C,[_,B,C]).
rezolva(Prieteni) if
afirm_ca(Prieteni),
pun_intreb(Prieteni).
63
InteligenŃă Artificială. Tehnici.
primul([X|_],X).
apartine(X,[X|_]).
apartine(X,[_|R]) :- apartine(X,R).
% INTREBARE
goal
St is [prieten(_, _, _),prieten(_, _, _),prieten(_, _, _)],
rezolva(St).
64
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
10.1 Grafuri
Asa cum s-a specificat structura de tip graf este utilizata cu precadere in cazurile
in care se doreste reprezentarea cunostintelor structurate. Din aceste considerete
reprezentarea lor cat si tehnicile de cautare in astfel de stucturi in contextul programarii
logice reprezinta un aspect important.
10.1.1. Reprezentare.
In cazul general, un graf se reprezintă ca un obiect compus, de forma :
Graf = g( listă_noduri, listă_muchii )
65
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
In majoritatea cazurilor arcele sunt etichetate (caz in care spunem ca unei muchii i se
ataşează un cost) fapt care modifica structura de reprezentare de forma (exemplul s-a
facut pentru un cost definit de o valoare intreaga):
G = g( [ a, b, c, d ], [ m( a, b, 3 ), m( b, c, 7 ), m( c, d, 2), m( d, b, 4 ) ] )
Se pun două probleme :
- găsirea unui drum aciclic într-un graf;
- găsirea unui drum cu cost minim într-un graf.
Iniţial se pleaca cu o lista cu un singur element care contine nodul tinta de forma [ Z ]
66
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
predicates
drum( nod, nod, graf, noduri )
drum_partial( nod, noduri, graf, noduri )
adiacent( nod, nod, graf )
aparţine( nod, noduri )
aparţine( muchie, muchii )
clauses
drum( A, z, G, Drum ) if
drum_partial( A, [z ], G, Drum ).
drum_partial( A, [ A | Rest_drum ], _, [ A | Rest_drum ] ).
drum_partial( A, [ Y | Rest_drum ], G, Drum) if
adiacent( X, Y, G ),
not( aparţine( X, Rest_drum ) ),
drum_partial( A, [ X, Y | Rest_drum ], G, Drum ).
adiacent( X, Y, g( _, Arce ) ) if
aparţine( m( X, Y ), Arce );
aparţine( m( Y, X ), Arce).
67
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
Comentarii :
1. not( aparţine( ... ) ) implementează un mecanism de detecţie a unui ciclu în
cadrul unui drum parţial.
2. Predicatul adiacent furnizează ca rezultat un nod ce defineşte extremitatea
muchiei căutate. Deoarece în definirea grafului nu se impune o restricţie privind ordinea
de scriere a nodurilor, devine necesară prezenţa dublei verificări de apartenenţă (
determininată de prezenţa unei simetrii în scrierea unuei muchii, o muchie poate apare
de forma m(a,b) sau m(b,a)).
3. Rezultatele pot fi obţinute sub forma :
goal
G = g( [ a, b, c, d ], [ m( a, b ), ... , m( d, b ) ] ),
drum( a, d, G, D )
D = [ a, b, c, d ]
D = [ a, b, d ]
2 soluţii
goal
findall( D, drum( a, d, G, D ), L),
write( " Drumuri = ", L).
Aceasta va da soluţia :
Drumuri = [ [ a, b, c, d ], [ a, b, d ] ]
68
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
predicates
% drum(Start, Tinta, Graf, Drum, Cost_Drum)
drum( nod, nod, graf, noduri, integer )
drum_partial( nod, noduri, integer, graf, noduri, integer )
adiacent( nod, nod, integer, graf )
aparţine( nod, noduri )
aparţine( muchie, muchii )
clauses
drum( A, z, G, Drum, Cost ) if
drum_partial( A, [ z ], 0, G, Drum, Cost ).
drum_partial( A, [ A | Rest_drum ], Cost, _, [ A | Rest_drum ], Cost ).
drum_partial( A, [ Y | Rest_drum ], Cost, G, Drum_final, Cost_final ) if
adiacent( X, Y, Costxy, G ),
not( aparţine( X, Rest_drum ) ), % ( detecţie cicluri )
Nou_cost = Cost + Costxy,
drum_partial( A, [ X,Y | Rest_drum],Nou_cost,
G,Drum_final,Cost_final ).
adiacent( X, Y, Costxy, g( Arce ) ) if
aparţine( m( X, Y, Costxy ), Arce );
aparţine( m( Y, X, Costxy ), Arce ).
Observaţie :
1) Procedura aparţine din adiacent determină un nod şi un cost al muchiei a cărei
extremitate a detectat-o.
3) P
e
n
t
69
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
10.2. Arbori
Necesitatea e a utiliza arbori apare din urmatoarele considerente:
- spatiul alternativelor posibile este explorat intr-o maniera de tip arbore
- cunostintele se pot reprezenta prin structuri de tip arbore
10.2. 1. Reprezentare.
Un arbore se reprezintă ca un obiect recusriv sub forma :
arbore( arbore, rădăcina, arbore )
Datorita acestui mod de reprezentare se pune problema delimitarii zonei pana unde se
intinde un arbore. De obicei se utilizeaza pentru delimitarea frontierii arborelui un cuvant
specificat de utilizator, varianta de delimitator cu numele nill fiind cea mai utilizata in
prezent (este insa evident ca se poate utiliza orice alt cuvant). De exemplu pentru
arborele din figura de mai jos vom avea structura de date prezentata alturat.
70
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
t(SubarboreStang,Nod,SubarboreDrept)
va avea forma :
71
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
Plecând de la aceste considerente, operaţia de inserare a unui nod într-un arbore binar
ordonat poate fi realizată cu ajutorul predicatului :
domains
răd = integer
predicates
clauses
72
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
De obicei, procesul de inserare e utilizat în contextul unui apel repetitiv prin care
se construieşte arborele dorit. De exemplu, o astfel de procedură poate fi de forma :
domains
.
predicates
ins( nod, tree, tree )
start( tree )
clauses
start( T ) if
write( " Nod = " ), readint( N ),
ins( N, T, Tnou ) ! ,
write( " Arbore = " ), Tnou),
start( Tnou).
start( T ) if
prelucrez( T ).
Ieşirea din procedura de construire a ABO se face obligând predicatul
readint(N) să fie fals (pentru exemplul dat – orice alta modalitate de a obliga regula
sa devina falsa se poate utiliza).
73
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
Implementare :
predicates
şterg( nod, arb, arb_nou )
clauses
şterg( X, t( S, X, nil ), S ).
şterg( X, t( nil, X, D ), D ).
şterg( X, t( S, X, D ), t( Snou, Y, D ) ) if mut( S, Y, Snou ).
şterg( X, t( S, R, D ), t( Snou, R, D ) ) if X < R, şterg( X, S, Snou ).
şterg( X, t( S, R, D ), t( S, R, Dnou ) ) if
X > R, şterg( X, D, Dnou ).
mut( t( S, Y, nil ), Y, S ).
mut( t( _, _, S ), Y, Snou ) if mut( S, Y, Snou ).
Similar ca în cazul inserţiei unui nod se poate defini o procedură repetitivă prin care se
pot şterge succesiv noduri în cadrul unui arbore.
Exerciţii:
1. Construiti procedura de tipărire a unui arbore binar astfel încât să apara grafic
structura lui. Se propune urmatorul mod de tiparire:
Arborele este rotit cu 90 grade astfel încât radăcina să fie punctul cel mai din stânga şi
elementele se tipăresc iniţial subarborele drept, astfel încât nodurile de aceeaşi înălţime
vor fi prezente pe aceeaşi coloană , se tipăreşte în continuare radacina, şi se continuă
cu subarborele stâng, respectând aceleaşi condiţii ca pentru subarborele drept.
74
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
domains
tree=t(tree,integer,tree)
predicates
scriu(tree,integer) tab(integer)
clauses
scriu(nil, _).
scriu( t(S,R,D),Poz) :- Poz2=Poz+2,
scriu(D,Poz2),
tab(Poz),
write(R),nl, scriu(S,Poz2).
tab(0).
tab(P) :- write(" "), P1=P-1, tab(P1).
extinde(Arb,Arb_final,Graf)
extinde(Tree,Tree_f,Graf) :- adun(Tree,Tree-1,graf),
extinde(Tree_1,Tree_f,Greaf),!.
extinde(Tree,Tree,Graf) :- not(adun(Tree,_,Graf)).
75
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
procedura finală pentru un arbore cu noduri de tip sibol urmând această strategie va fi de
forma:
domains
nod=symbol arc=m(nod,nod)
arce=arc* graf=g(arce)
76
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
tree=arc*
predicates
tree(graf,tree) extinde(tree,tree,graf)
adun(tree,tree,graf) nod(nod,tree)
aparţine(arc,tree) aparţine(muchie,graf)
clauses
tree(Graf,Tree) :- apartine(Muchie,Graf),
extinde([Muchie],Tree,Graf).
Procedura extinde
Procedura adun
Procedura nod
Procedura aprtine
înalt(Tree,Inaltime_Tree)
domains
tree=t(tree,integer,tree);nil
predicates
înalt(tree,integer)
max(integer,integer,integer)
clauses
înalt(nil,0).
înalt(t(S, _,D),Is) :- înalt(S,Is),înalt(D,Id), max(Is,Id,M), I=M+1.
77
Inteligenţă Artificială.
Structuri de Date. Grafuri, Arbori
5. Un nod intern a unui arbore binar este un nod care are unul sau doi succesori
care nu sunt vizi. Scrieți o procedură care să creeze o lista cu nodurile interne a
unui arbore binar. Procedura este de forma
6. Scrieți o procedura care sa numere cate frunze exista intr-un arbore binar de
forma
78
Inteligenţă Artificială. Tehnici.
79
Inteligenţă Artificială. Tehnici.
(b) Stare
Așa cum am spus în contextul jocului de șah o stare este definita de configurația
pieselor existente la un moment dat al jocului, ansamblul lor alcătuind ceea ce am
definit ca spațiul configurațiilor de joc posibile.
In concluzie
Starea reprezintă a configuraţie anumită a entităţilor care populează
universul problemei în drumul spre soluţie.
Spre exemplu pentru un joc care are în jur de 20 mutări (atât pentru piesele albe
cat și pentru piesele negre) se ştie că spaţiul stărilor în jocul de şah atinge
valoarea de 10120.
80
Inteligenţă Artificială. Tehnici.
81
Inteligenţă Artificială. Tehnici.
Aceste descrieri se mai numesc şi reguli de producţie. Din cele de mai sus rezultă
că preocuparea a patra constă în inventarierea tuturor tranziţiilor posibile între stări şi
descrierea lor ca reguli formate din condiţii şi acţiuni.
Există mai multe modalităţi de a descrie regulile, ori tranziţiile legale dintre stări. O
manieră ar putea fi "cu cărţile foarte aproape de ochi", cu alte cuvinte puternic influenţaţi
de anumite instanţe particulare ale problemei. În general obţinem astfel un număr mare
de reguli. De exemplu, o mişcare uzuală de deschidere la un joc de şah este avansarea
pionului cu două poziţii. Această mişcare a pionului nu este însă permisă decât atunci
când pionul se află în poziţia lui iniţială, în orice alt moment al jocului pionul putând
avansa doar cu o poziţie. Am avea aşadar o serie de reguli de forma:
82
Inteligenţă Artificială. Tehnici.
regula mută-pion-din-a
DACĂ
pion în poziţia (a,2) şi
poziţia (a,3) e liberă şi
poziţia (a,4) e liberă
ATUNCI
mută pionul din poziţia (a,2) în poziţia (a,4).
Vom avea un număr de 8 reguli de acest fel, câte una pentru fiecare pion.
O descriere satisfăcătoare trebuie însă să fie suficient de generală pentru a
putea fi utilizată în cât mai multe instanţe diferite ale problemei. O reprezentare mai
economică ar utiliza o singură regulă capabilă a exprima poziţia oricărui pion aflat pe al
doilea rând.
regula mută-pion(x)
DACĂ
pion în poziţia (x,2) şi
poziţia (x,3) e liberă şi
poziţia (x,4) e liberă
ATUNCI
mută pionul din poziţia (x,2) în poziţia (x,4).
83
Inteligenţă Artificială. Tehnici.
stare finală
atinsă
stare
iniţială
solutia
n
dimensiunea spaţiului
stărilor
84
Inteligenţă Artificială. Tehnici.
Acest lucru face ca o problemă de IA să fie una de căutare într-un spaţiu al stărilor. În
funcţie de dimensiunea acestui spaţiu se utilizează diferite metode pentru a eficientiza
procesul de navigare. În limbajului domeniul IA, aceste metode se mai numesc şi
strategii. Există mai multe tipuri de strategii, dar ele sunt clasificate în două clase mari:
Concluzii
Rezolvarea unei probleme de IA are două aspecte:
- formalizarea problemei, care presupune recunoaşterea diferenţei dintre problema
generală şi o instanţă a acesteia, recunoaşterea a ce constituie cea mai bună
alegere pentru stări, găsirea unei reprezentări a stărilor şi găsirea unei
reprezentări pentru reguli;
- lansarea unei căutări în spaţiul stărilor care să găsească o cale între starea
considerată iniţială şi o stare finală.
85
Inteligenţă Artificială. Tehnici.
Măsuri calitative:
Completitudine – o strategie se numeşte completă dacă garantează găsirea
unei soluţii.
Optimalitate – o strategie se numeşte optimală dacă garantează găsirea
celei mai bune soluţii din punctul de vedere al costului căii între starea iniţială
şi starea finală.
86
Inteligenţă Artificială. Tehnici.
87
Inteligenţă Artificială. Tehnici.
88
Inteligenţă Artificială. Tehnici.
Dacă considerăm că nodul de start este 'a' şi ‘j’, ‘f’ sunt soluţiile posibile, căutarea
în adâncime presupune vizitare tuturor nodurilor aflate pe fiecare ramură până în
momentul găsirii soluţiei căutate, apelul fiind de forma
?- rezolva(a,Sol)
Sol=[a, b, e, j]
Căutarea în adâncime se pretează stilului recursiv al mașinii de inferență din
Prolog, deoarece însăşi căutarea de tip backtracking este o tehnică de căutare în
adâncime.
Principiul de căutare a soluției – lista de configurații, intre configurația inițială și
cea finala – poate fi definit astfel:
Se pleca de la configurația inițială se generează prin procedura S(X,Y)
succesori ai poziției curente X, aspect care are ca efect creșterea arborelui de căutare
și formarea de drumuri parțiale. Acestea se dezvolta pana în momentul în care una din
configurațiile generate reprezintă ținta ( ținta fiind considerata una din configurațiile
finale posibile de atins). în acest moment, drumul parțial devine o soluție care se
creează pe rezolvarea apelurilor recursive.
Principiul căutării în adâncime este definit de un predicat de forma:
caut_a(Drum, Nod, Solutie)
și este ilustrat de figura:
Tehnica poate da greş dacă apar alternative identice care se repetă (in calea
89
Inteligenţă Artificială. Tehnici.
determinată pana în momentul curent este prezenta configurația care s-a generat ca
alternativa următoare a stării curente). Astfel de situaţii impun implementarea unui
mecanism de detecţie a ciclurilor, al cărui rol este interzicerea deplasării pe direcţia în
cauză
90
Inteligenţă Artificială. Tehnici.
rezolva(Start, Solutie) if
caut_a([ ], Start, Solutie, Adancime_max).
caut_a(Drum, Nod, [Nod|Drum] ) :-
apartine(Nod,Tinte).
caut_a(Drum,Nod,Sol,Max)if
Max>0,
s(Nod, Nod1),
not(apartine(Nod1,Drum)),
Max1=Max-1,
caut_a([Nod|Drum], Nod1, Sol, Max1).
91
Inteligenţă Artificială. Tehnici.
Avantaje și Dezavantaje
O căutare complectă pentru un arbore de căutare de adâncime d, în care fiecare
nod are b succesori, conduce la un număr total de noduri:
pentru strategia DLS
NDLS = b0 + b1 + b2 + … + bd-2 + bd-1 + bd
pentru strategia IDS
NIDS = (d+1)b0 + d b1 + (d-1)b2 + … + 3bd-2 +2bd-1 + 1bd
92
Inteligenţă Artificială. Tehnici.
Dacă notăm Complexitatea strategiei de căutare, timp și spațiu, cu O(bd) vom avea
pentru strategia DLS , O(bd)DLS
pentru strategia IDS , O(bd+1)IDS
93
Inteligenţă Artificială. Tehnici.
singur element de forma [ [Nod_Start ] ], care este dezvoltat în unul sau mai multe
drumuri din care la un moment dat se selectează drumul soluție.
94
Inteligenţă Artificială. Tehnici.
adaug ( _, [ ], [ ]).
adaug (Drum, [Nod1|Rest], [ [Nod1|Drum] | Drumuri_noi]) if
not(aparține(Nod1,Drum)),
adaug(Drum,Rest,Drumuri_noi).
%conc implementează procedura de concatenare
Comentarii
1) Prin findall se generează toţi succesorii (alternative) posibili ai unui nod dat.
Acestea sunt incluse intr-o listă de noi alternative.
2) adaug utilizează noile alternative pentru a crea noi drumuri posibile plecând de
la drumul care a iniţiat construirea alternativelor not(aparține) verifică dacă nu există
alternative identice, caz în care se renunţă la direcţia de dezvoltare în cauză (drum este
o variantă moartă, care se abandonează).
3) conc pune noile drumuri găsite la sfârşitul listei iniţiale.
4) deoarece este posibil ca prin findall să nu se determine nici o alternativă
posibilă (nu mai există succesori), operaţia de căutare va continua pe lista iniţială,
minus drumul abandonat.
5) aceeaşi problemă se poate pune şi pentru căutarea în lăţime, referitoare la
limitarea adâncimii de căutare.
6) Avantaje și Dezavantaje
95
Inteligenţă Artificială. Tehnici.
Exerciții
1. Scrieţi procedura de căutare în adâncime, atunci când adâncimea de căutare
este limitata. Care sunt dezavantajele acestei strategii?
96
Inteligenţă Artificială. Tehnici.
forma:
ocup_barca([1,0], [0,1], [1,1], [2,0], [0,2])
domains
nod=integer* drum=nod*
predicates
rezolva(nod,drum) caut_a(drum,nod,drum)
apartine(nod,drum) s(nod,drum,nod)
test(integer,integer,integer,integer)
clauses
rezolvă(Nod,Solutii) :- caut_a([ ],Nod,Solutie).
caut_a(Drum,Nod,[Nod|Drum]):- Nod=[1,0,0,3,3].
caut_a(Drum,Nod,Sol) :-
s( Nod,
[[1,0], [0,1], [1,1], [2,0], [0,2]],
Nod1),
not(apartine(Nod1,Drum)),
caut_a([Nod|Drum],Nod1,Sol).
/*
s(configuratie_curenta, ocupare_barca, configuratie_ulterioara)
D pozitia barcii
Ms numar misionari de pe malul stang
Cs numar canibali de pe malul stang
Md numar misionari de pe malul drept
Cd numar canibali de pe malul drept
Configuratia_ulterioara este D1, Ms1, Cs1, Md1, Cd1
*/
s( _, [ ], [ ] ).
99
Inteligenţă Artificială. Tehnici.
s( [D, Ms, Cs, Md, Cd], [[M,C]| _], [D1, Ms1, Cs1, Md1, Cd1] ) :-
Ms1 is Ms-M*D, Cs1 is Cs-C*D,
Md1 is Md+M*D, Cd1 is Cd+C*D,
D1 is -1*D,
test (Ms1,Cs1, Md1, Cd1).
s(R, [ _ |R1], R2) :-
s(R, R1, R2).
test(M, C, M1, C1) :-
M>=0, C>=0, M1>=0, C1>=0, M>=C, M1>=C1;
M>=0, C>=0, M1>=0, C1>=0, M>=C, M1=0;
M>=0, C>=0, M1>=0, C1>=0, M=0, M1>=C1.
100
Inteligenţă Artificială. Tehnici.
101
Inteligenţă Artificială. Tehnici.
Miscari_autorizate is [1, 5, 6, 2, 8, 4, 3, 7, 1 ]
Procedura succesor va prezenta următoarea structura
s(configuratie_curenta, miscari_autorizate, configuratie_urmatoare)
Considerând ca am o pozitie curenta corespunzătoare celei din figura de mai sus unde
am 2 cai albi pe 1 și 3 , respectiv am 2 cai negri pe 5 și 7 procedura succesor va
apare de forma:
/*
Tabla de șah apare sub forma
-------------
l 6 l 7 l 8 l
l---l---l---l
l 4 l l 5 l
l---l---l---l
l 1 l 2 l 3 l
-------------
am 2 cai albi pe 1 și 3
am 2 cai negri pe 6 și 8
*/
domains
lista=integer*
predicates
s(lista,lista,lista)
muta(integer, integer, lista)
subst(integer, integer, lista, lista)
apartine(integer,lista)
goal
P is [1, 6, 3, 9 ],
Miscari_autorizate is [1, 5, 6, 2, 8, 4, 3, 7, 1 ],
s([P, Miscari_autorizate,Configuratie_urmatoare),
write(Configuratie_urmatoare).
clauses
s(Poz, Misc, Pnou) :-
apartine(Piesa, Poz),
muta(Piesa, Piesa1, Misc),
not(apartine(Piesa1, Poz)),
102
Inteligenţă Artificială. Tehnici.
% procedura apartine
Se pot face urmatoarele observatii relative la modul în care sunt generate pozitiile
succesive celei curente:
1. muta(Configuratie_curenta, Configuratie_urmatoare, Miscari_autorizate) are rolul
de a gasi o mutare posibila plecand de la o configuratie de piese data.
2. subst(Pozitie_curenta_Piesa, Pozitie_urmatoare_Piesa, Configuratie_Curenta,
Configuratie_Urmatoare) are rolul de a efectua o mutare propriuzusa pe tabla de
sah.
3. apartine actioneaza în doua moduri. Initial selecteaza o pozitie pe tabla, iar în al
doilea caz verifica daca pozitia în care este posibila de efectuat mutarea este sau
nu ocupata de alta piesa.
103
Inteligenţă Artificială. Tehnici.
Se impune ca la un moent dat se pot misca numai doua comutatoare la un moment dat.
Starea a [ 0, 0, 0, 1, 0, 1 ] Starea b [ 1, 1, 1, 1, 1, 1 ]
104
Inteligenţă Artificială. Tehnici.
domains
nod=integer* drum=nod*
predicates
rezolva(nod,drum) caut_a(drum,nod,drum,integer)
apartine(nod,drum) s(nod,nod,nod)
goal
rezolva([0, 0, 0, 1, 0, 1], R),
write(“Solutie de comutare”),nl.
clauses
rezolvă(Nod,Solutie) :-
caut_a([ ],Nod,Solutie,0).
caut_a(Drum,Nod,[Nod|Drum]):-
Nod is [1,1,1,1,1,1].
caut_a(Drum,Nod,Sol,Adancime) :-
s( Nod,
[1, 2, 3, 4, 5 ],
Nod1),
not(apartine(Nod1,Drum)),
Adancime1 is Adancime + 1,
Adancime <= 20,
caut_a([Nod|Drum],Nod1,Sol,Adancime1).
/*
s(configuratie_curenta,
configuratii autorizate de comutare,
configuratie_ulterioara)
C1,C2,C3,C4,C5,C6 configuratia initiala de
Comutatoare
NC1,NC2,NC3,NC4,NC5,NC6 configuratia ulterioara de
Comutatoare
105
Inteligenţă Artificială. Tehnici.
*/
s([C1,C2,C3,C4,C5,C6], [1 | _ ], [NC1, NC2, C3,C4,C5,C6]) :-
NC1 is -C1 + 1,
NC2 is -C2 + 1.
s([C1,C2,C3,C4,C5,C6], [2 | _ ], [C1, NC2, NC3,C4,C5,C6]) :-
NC2 is -C2 + 1,
NC3 is -C3 + 1.
s([C1,C2,C3,C4,C5,C6], [3 | _ ], [C1, C2, NC3,NC4,C5,C6]) :-
NC3 is -C3 + 1,
NC4 is -C4 + 1.
s([C1,C2,C3,C4,C5,C6], [4 | _ ], [C1, C2, C3,NC4,NC5,C6]) :-
NC4 is -C4 + 1,
NC5 is -C5 + 1.
s([C1,C2,C3,C4,C5,C6], [5 | _ ], [C1, C2, C3,C4,NC5,NC6]) :-
NC5 is -C5 + 1,
NC6 is -C6 + 1.
S(L1, [_ | R], L2) :-
S(L1, R, L2)
% procedura apartine
Problema mutarii unei stive de cuburi: Se cere definirea planului de miscari care
conduce de la o configuratie data de 3 cuburi la o configuratie tinta formata de
asemnea din aceleasi 3 cuburi altfel pozitionate.
106
Inteligenţă Artificială. Tehnici.
Nodul 2 este un succesor al nodului 1 dacă în nodul 1 există două stive notate
cu S1 și S2, iar blocul din vârful lui S1 poate fi mişcat pe S2.
In aceste condiţii secvenţa de generare a unui nod sucesor unui nod dat în contextul
unei strategii de căutare în adincime apare sub forma:
domains
bloc =symbol stiva =bloc*
nod =stiva* drum =nod*
107
Inteligenţă Artificială. Tehnici.
predicates
s(nod,nod) sterg(stiva,nod,nod)
rezolva(nod,drum) caut_a(drum,nod,drum)
apartine(stiva,nod) apartine (nod,drum)
goal
rezolva( [[a], [b], [c] ], R ), write(R).
clauses
rezolva(Nod,Solutie) :-
caut_a([ ],Nod,Solutie).
caut_a(Drum,Nod,[Nod|Drum]) :-
apartine([a,b,c],Nod).
caut_a(Drum,Nod,Sol) :-
s(Nod, Nod1),
not(apartine(Nod1, Drum)),
caut_a([ Nod | Drum ], Nod1, Sol).
sterg(X,[X|L],L).
sterg(X,[Y|L],[Y|L1]) :- sterg(X,L,L1).
apartine(X,[X|_]).
apartine(X,[_|R]) :- apartine(X,R).
108
Inteligenţă Artificială. Tehnici.
Comentarii
1. In procedura succesor predicatul sterg acţionează în două etape:
- In prima în regim de lucru procedural ( sterg ( o, i, o) ) selecţionează stiva care
urmează să fie ştearsă iar
- în a doua care lucrează de asemenea în mod procedural ( sterg ( i, i, o) ) se
procedează efectiv la ştergerea stivei din nod.
2. Presupunând că se pleacă de la prima configuraţie pentru primul predicat sterg
avem:
sterg ( [ _ | _ ] , [ [ a ] , [ b ] , [ c ] ] , _ )
cu rezultatul
3. Cel de al doilea predicat sterg în prima fază detectează stiva pe care urmeaza
să fie amplasat blocul posibil de a fi mutat detectat de primul predicat sterg,
după care se efectuează stergerea stivei detectate în cea de a doua fază.
Vom avea
sterg ( _ , [ [ b ] , [ c ] , [ c ] ] , _ )
cu rezultatul
*sterg ( [ b ] , [ [ b ] , [ c ] ] , _ )
la a doua apelare a predicatului astfel construit
sterg ( [ b ] , [ [ b ] , [ c ] ] , _ )
se obţine
*sterg ( [ b ] , [ [ b ] , [ c ] ] , [ [ c ] ] )
109
Inteligenţă Artificială. Tehnici.
4. In urma execuţiei celor două apeluri ale predicatului sterg se obţin fragmente care
sunt recompuse de către predicatul succesor fiind în final obţinută structura
*sterg ( [ [ a ] , [ b ] , [ c ] ] , [ [ ] , [a | [b] ] | [[c]] ])
s( Nod, [ Stiva1, [V1 | Stiva2 ] | AlteStive ] )
Exercitiu
Pe planeta Marte există două partide politice rivale: Federaţia Marţiană şi Partidul
Progresist Marţian .În cursul unei campanii electorale, 3 membrii ai FM şi 3 membri ai
PPM trebuie să treacă râul cu o barcă cu 2 locuri. Presupunem că este suficient ca
membrii FM să fie majoritari într-un grup pentru a-i converti pe cei din PMM la ideile lor,
cum pot aceştia din urmă să treacă râul astfel încât să nu rişte să-şi schimbe partidul ?
110
Inteligenţă Artificială. Tehnici.
domains
drum = nod*
element = lup; varza; capra; alone
stare = element*
mal = stinga;dreapta
nod = lvc(mal, stare, stare)
111
Inteligenţă Artificială. Tehnici.
112
Inteligenţă Artificială. Tehnici.
domains
drum =nod* element=lup;varza;capra;alone
stare=element* mal=stinga;dreapta
nod=lvc(mal,stare,stare)
predicates
rezolva(nod,drum) caut_a(drum,nod,drum)
s(nod,nod) move(nod,element)
update(nod,element,nod) update_boat(mal,mal)
select(element,stare,stare) apartine(element,stare)
apartine(nod,drum) legal(nod)
ilegal(stare) insert(element,stare,stare)
update_banks(element,mal,stare,stare,stare,stare) tip(drum)
clauses
rezolva(Nod,Solutie) :-
caut_a([ ],Nod,Solutie).
caut_a(Drum,Nod,[Nod|Drum]) :-
Nod is lvc(dreapta,[ ],[lup,capra,varza]).
caut_a(Drum,Nod,Sol) :-
s(Nod,
Nod1),
not(apartine(Nod1,Drum)),
caut_a([Nod|Drum],Nod1,Sol).
s(Stare1,Stare2) :-
move(Stare1,Move),
update(Stare1,Move,Stare2),
113
Inteligenţă Artificială. Tehnici.
legal(Stare2).
move(lvc(stinga,S,_),Cargo) :-
apartine(Cargo,S).
move(lvc(dreapta,_,D),Cargo) :-
apartine(Cargo,D).
move(_,alone).
update(lvc(B,S,D),Cargo,lvc(B1,S1,D1)) :-
update_boat(B,B1),update_banks(Cargo,B,S,D,S1,D1).
update_boat(stinga,dreapta).
update_boat(dreapta,stinga).
update_banks(alone,_,S,D,S,D).
update_banks(Cargo,stinga,S,D,S1,D1) :-
select(Cargo,S,S1),insert(Cargo,D,D1).
update_banks(Cargo,dreapta,S,D,S1,D1) :-
select(Cargo,D,D1),insert(Cargo,S,S1).
select(X,[X|Ys],Ys).
select(X,[Y|Ys],[Y|Zs]) :-
select(X,Ys,Zs).
select(X,[X],[ ]).
insert(X,[ ],[X]).
insert(X,[Y|R],[Y,X|R]).
ilegal(L) :- apartine(lup,L),apartine(capra,L).
ilegal(L) :- apartine(capra,L),apartine(varza,L).
apartine(X, [X | _ ] ).
apartine(X, [ _ | R]) :-
apartine(X,R).
tip([ ]).
tip([ X | R]) :- write(X),nl,readchar( _ ),tip(R).
goal
clearwindow,rezolva(lvc(stinga,[lup,capra,varza],[ ]),R),
tip(R).
114
Inteligenţă Artificială. Tehnici.
Problema mutării unei stive de cuburi: Se cere definirea planului de mișcări care
conduce de la o configuratie data de 3 cuburi la o configuratie ținta.
115
Inteligenţă Artificială. Tehnici.
116
Inteligenţă Artificială. Tehnici.
- to_block( bloc1, suport, loc_bloc2) structura care reprezintă una din cele doua
tipuri de situații care pot apare, prezente în cele doua figuri de mai jos
117
Inteligenţă Artificială. Tehnici.
domains
pozitie = on(symbol,symbol) stare = pozitie*
mut = to_place(symbol,symbol,symbol);
to_block(symbol,symbol,symbol)
predicates
s(stare,stare) legal_action(mut,stare)
clear(symbol,stare) update(mut,stare,stare)
member(pozitie,stare) substitute(pozitie,pozitie,stare,stare)
on(symbol,symbol,stare) place(symbol)
block(symbol)
clauses
s(Stare1,Stare2) :-
legal_action(Action,Stare1),
update(Action,Stare1,Stare2).
legal_action(to_place(Block,Y,Place),State) :-
on(Block,Y,State),clear(Block,State),
place(Place),clear(Place,State).
legal_action(to_block(Block1,Y,Block2),State) :-
on(Block1,Y,State), clear(Block1,State),
block(Block2), Block1 <> Block2,
clear(Block2,State).
118
Inteligenţă Artificială. Tehnici.
clear(X,State) :- not(member(on(_,X),State)).
on(X,Y,State) :- member(on(X,Y),State).
update(to_block(X,Y,Z),State,State1) :-
substitute(on(X,Y),on(X,Z),State,State1).
update(to_place(X,Y,Z),State,State1) :-
substitute(on(X,Y),on(X,Z),State,State1).
substitute(on(X,Y),on(X,Z),[on(X,Y)|R],[on(X,Z)|R]).
substitute(on(X,Y),on(X,Z),[W|R],[W|R1]) :-
substitute(on(X,Y),on(X,Z),R,R1).
member(X,[X|_]).
member(X,[_|R]) :- member(X,R),!.
goal
s( [on(a,p), on(b,q), on(c,r) ],R), write(R).
12.3. Concluzii
Plecând de la tehnicile de construire a succesorilor prezentate anterior pot fi de
desprinse câteva aspecte:
1. Reprezentarea prin obiecte standard prolog în care se codifica în general
numeric și pozițional instanţele, este simpla și nu consuma resurse. Prezintă
însă marele dezavantaj ca interpretarea unei instanţe este dificila, deoarece
este necesara interpretarea valorilor și a pozițiilor acestora, aspect care
complica depanarea unei proceduri de tip succesor. Pentru acest tip de
reprezentare, este obligatorie prezenta unui interpretor de instanţe care să fie
utilizat după găsirea secvenței de instanţe care face trecerea de la o poziție
inițială la una finala. Un alt aspect, care poate constitui un dezavantaj se
refera la faptul ca nu apar explicit etapele corespunzătoare unei tehnici de tip
generează și testează, aspect care reprezintă un impediment, dar și un
avantaj deoarece procedurile în care cele doua aspecte se întrepătrund sunt
mult mai rapide decât cele în care cele în care generarea și testarea sunt
definite explicit. Acesta caracteristica este importanta, deoarece spațiul
119
Inteligenţă Artificială. Tehnici.
120
Strategii de căutare
Neinformate
O ”problemă” constă din
• O stare inițială, q(0)
• O listă posibilă de acțiuni, a,
• O stare țintă (pot fi prezente mai multe stări
ținte)
7 5 7 6 5
2 8 3 1 2 3 • = Goal
q test:
{2, 8, 3, 1, 6,Check
4, 7, 0,whether
5} the
goal state has been reached.
1 6 4 8 4 • Path cost: Each move costs 1.
The path cost = the number of
7 5 7 6 5 moves.
Start State Goal State
Exemplu: 8-puzzle
• State: Specification of each of
the eight tiles in the nine
squares (the blank is in the
remaining square).
• Initial state: Any state.
• Funcție Succesor (acțiuni):
Poziția liberă mută mută
Stânga, Dreapta, Sus sau Jos.
2 8 3 1 2 3 • Goal test: Check whether the
goal state has been reached.
1 6 4 8 4 • Path cost: Each move costs 1.
The path cost = the number of
7 5 7 6 5 moves.
Start State Goal State
Expandare 8-puzzle
2 8 3
q = {2, 8, 3, 1, 6, 4, 7, 0, 5}
1 6 4
7 5
2 8 3 2 8 3 2 8 3
1 6 4 1 4 1 6 4
7 5 7 6 5 7 5
q = {2, 8, 3, 1, 6, 4, 0, 7, 5} q = {2, 8, 3, 1, 6, 4, 7, 5, 0}
q = {2, 8, 3, 1, 0, 4, 7, 6, 5}
Strategii de căutare
Neinformate
Strategiile de căutare de bază fără a se cunoaște direcția
de avans în spațiul stărilor sunt.
Depth-first adâncimea de
căutare 5
Exemplu :
Problema misionarilor şi
canibalilor
Problema misionarilor şi canibalilor: 3 misionari şi 3 canibali se află la marginea unui râu cu scopul de
a trece pe celălalt mal. Ei au la dispoziţie o barcă de două persoane. Dacă la un moment dat,
pe un mal sau pe celălalt numărul canibalilor întrece pe cel al misionarilor, misionarii sunt în
pericol de a fi mâncați de canibali. Problema constă în a afla cum pot trece râul cele 6 persoane
în deplină siguranţă.
Strategia de căutare
Breadth-first
Misionari & Canibali
Strategia
Depth-first
Misionari & Canibali
Sunt generate 30 noduri
Strategii de căutare informate
Utilizarea de cunoștințe în
strategiile de căutare.
◼ Fără a dispune de informații
Căutare
în operația de căutare suntem
siliți să căutăm la întâmplare. oriunde!!
◼ În consecință complexitatea
care o implică căutarea
neinformată (timp, spațiu)
este greu de acceptat.
2
Utilizarea de cunoștințe în
strategiile de căutare.
◼ Conduce la o creștere dramatică a eficienței vitezei strategiei
de căutare.
Se caută B C D E
numai în F G H I J
acest
subtree! K L M N
3
De ce funcționează euristica?
◼ În orice problemă de cătare unde există mai mult de b
alegeri în fiecare nod și este prezentă o adâncime de
căutare d la nodul țintă, o strategie care caută la
întâmplare , va trebui în cel mai defavorabil caz să
parcurgă aproape O(bd) noduri înainte de găsirea unei
soluții (Complexitatea de Timp este exponențială).
◼ Caracteristici f:
◼ este o măsură a cât de promițătoare este starea curentă definită de nodul n.
◼ f estimează costul atingerii stării țintă din starea curentă și costul drumului
până la acesta. În acest caz f va avea două componente:
◼ f(n) = g(n) + h(n) unde g(n) = costul până la n (din starea inițială)
5
Caracteristicile funcției euristice f(n) văzută
co o măsură a cât de promițătoare este
starea curentă definită de nodul n.
6
Strategii de căutare informate
◼ A* search
◼ Ia în calcul o funcție euristică f care ia în considerare și
costul curent g
◼ Întotdeuna returnează cea mai optimă soluție (drumul este
optim) 7
Strategii de căutare informate
Măsuri cantitative şi calitative pentru estimarea eficienţei unei
strategii de căutare.
Măsuri calitative:
◼ Completitudine – o strategie se numeşte completă dacă garantează
găsirea unei soluţii.
◼ Optimalitate – o strategie se numeşte optimală dacă garantează
găsirea celei mai bune soluţii din punctul de vedere al costului căii
între starea iniţială şi starea finală.
8
Strategii de căutare informate
Greedy Search
eval-fn: f(n) = h(n)
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
10
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
11
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
12
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
13
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
14
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
15
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
16
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
17
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
18
Greedy Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă dintre Start și o Stare
19
Greedy Search: Tree Search
Start
A
20
Greedy Search: Tree Search
Start
A 75
118
[253] E
21
Greedy Search: Tree Search
Start
A 75
118
[253] E
80 99
[193] [178]
G F
[366] A
22
Greedy Search: Tree Search
Start
A 75
118
[253] E
80 99
[193] [178]
G F
[366] A
211
[253] E I [0]
Goal
23
Greedy Search: Tree Search
Start
A 75
118
[253] E
80 99
[193] [178]
G F
[366] A
211
[253] E I [0]
Goal
Costul drumului(A-E-F-I) = 253 + 178 + 0 = 431
24
Distanța(A-E-F-I) = 140 + 99 + 211 = 450
Greedy Search: Optim ?
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
f(n) = h (n) = euristica este dată de distanța în linie dreptă
Goal
dist(A-E-G-H-I) =140+80+97+101=418 25
Greedy Search: Complet ?
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 ** C 250
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I
Goal f(n) = h (n) = euristica este dată de distanța în
linie dreptă
26
Greedy Search: Tree Search
Start
A
27
Greedy Search: Tree Search
Start
A 75
118
[253] E
28
Greedy Search: Tree Search
Start
A 75
118
[253] E
111
[244] D
29
Greedy Search: Tree Search
Start
A 75
118
[253] E
111
[244] D
Infinite Branch !
[250] C
30
Greedy Search: Tree Search
Start
A 75
118
[253] E
111
[244] D
Infinite Branch !
[250] C
[244] D
31
Greedy Search: Tree Search
Start
A 75
118
[253] E
111
[244] D
Infinite Branch !
[250] C
[244] D
32
Greedy Search: Complexitatea
de Timp și Spațiu?
Start
118
A 75 • Greedy search NU este optim.
C 140 B • Greedy search este incomplet fără
111 o verificare a stărilor care se repetă.
E
D 80 99 • În cel mai rău caz, Complexitatea
de timp și spațiu pentru Greedy
G F
Search este de O(bm)
97
Unde b este factorul de ramificare și
H 211 m lungimea maximă a drumului găsit
101
I
Goal
33
Greedy Search
Concluzii
34
Strategii de căutare informate
A* Search
eval-fn: f(n)=g(n)+h(n)
A* (A Star)
◼ A* utilizează o funcție euristică care
combină g(n) și h(n): f(n) = g(n) + h(n)
g(n)
f(n) = g(n)+h(n) n
h(n)
37
A* Search
Start Stare Euristica: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 98
101 I 0
I f(n) = g(n) + h (n)
Goal
g(n): este exact costul drumului de la nodul Start la nodul Țintă.
38
A* Search: Tree Search
A Start
39
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
40
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
41
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[415] H
42
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[415] H
101
Goal I [418]
43
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[415] H I [450]
101
Goal I [418]
44
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[415] H I [450]
101
Goal I [418]
45
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[415] H I [450]
101
Goal I [418]
46
A* Search: h nu este admisibilă !
Start State Heuristic: h(n)
A 75
118 A 366
140 B B 374
C
111 C 329
E
D 80 99 D 244
E 253
G F
F 178
97 G 193
H 211 H 138
101 I 0
Goal I f(n) = g(n) + h (n) – (H-I )Supraestimată
g(n): g(n) = costul până la n (din starea inițială). 47
A* Search: Tree Search
A Start
48
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
49
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
50
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[455] H
51
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
[413] G F [417]
97
[455] H Goal I [450]
52
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
97
[455] H Goal I [450]
53
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
97
[455] H Goal I [450]
54
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
97
[455] H Goal I [450]
55
A* Search: Tree Search
A Start
118 75
140
E [393] B [449]
[447] C
80 99
97
[455] H Goal I [450]
Iterative Deepening A*
Iterative Deepening A*:IDA*
59
IDA* Algorithm
◼ În prima iterație se determină “f-cost limit” – cut-off value
f(n0) = g(n0) + h(n0) = h(n0), unde n0 este nodul de start.
◼ Daca căutarea nu are succes se determină cea mai mică valoare f(n)
a nodurilor care au fost vizitate dar nu au fost expandate.
4
Cutoff=4
61
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=4 4
6 6
62
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=4 4 5
6 6
63
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=4 4 5
6 6
64
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
6 5
4
Cutoff=4 4 5
6 6
65
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=5
66
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=5 4
6 6
67
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=5 4 5
6 6
68
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4
Cutoff=5 4 5
6 6
69
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4 5
Cutoff=5 4 5
6 6
70
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4 5 5
Cutoff=5 4 5
6 6
71
f(N) = g(N) + h(N)
8-Puzzle cu h(N) = număr piese incorect plasate
4 5 5
Cutoff=5 4 5
6 6
72
Când se utilizează tehnicile de
căutare euristice?
73
Inteligenţă Artificială. Tehnici.
Euristic definiție
Euristic principii
Metodele euristice “sar” peste anumite informaţii sau etape utilizate în mod
normal la luarea unei decizii sau găsirea unei soluţii. În anumite situaţii, o metodă
euristica poate duce la rezultate mult mai rapide şi mult precise decât metodele
clasice de analiză. Conform unor autori, scopul euristicii este acela de a studia
metodele şi regulile utilizate pentru descoperiri şi invenţii. Conform altor autori,
euristic, înseamnă o procedură foarte rapidă de rezolvare a unei probleme.
În cele ce urmează vom lua în considerare noțiunea de euristică așa cum este
definită de Judea Pearl “ Heuristics” 1984
Euristicile sunt criterii, metode sau principii utilizate pentru a decide care
dintre mai multe cursuri alternative de acțiune, promite să fie cel mai eficient, în
scopul de a atinge un anumit obiectiv.
Principiul de căutare:
O strategie de căutare euristică a soluţiilor, pleacă de la ideea că avansarea în
spaţiul configuraţiilor se face pe direcţii care promit atingerea configuraţiei dorite într-
un timp rezonabil, cu un număr acceptabil de stări intermediare. Strategia este o
strategie tentativă (este una şovăitoare): o mişcare ce se dovedeşte greşită poate fi
îndreptată. Mişcarea în spaţiul stărilor nu este inexorabilă. Dacă s-a ajuns într-un
punct mort pot să "iau urma îndărăt" pentru a face o altă mişcare dintr-o poziţie
121
Inteligenţă Artificială. Tehnici.
f (n)=g(n)+h(n)
care indica cat de promițător este un nod în perspectiva găsirii unui drum către
soluție.
123
Inteligenţă Artificială. Tehnici.
o cale mai buna încă nedescoperita), dar costul sau poate servi ca o
estimare g(n) a costului minim de la s la n.
Celălalt termen h(n), este cel mai problematic, pentru ca spaţiul de la n la
t nu a fost explorat pana în acel moment. De aceea h(n) reprezintă o
adevărată presupunere euristică, bazata pe cunoştinţele generale despre
problema respectiva și a tehnicilor utilizate în cadrul acesteia. Cum h
depinde de domeniul problemei nu exista o metodă universală de
construire a acestuia.
124
Inteligenţă Artificială. Tehnici.
Observaţii: Pe hartă sunt trecute distanţele dintre localităţi. Valorile din pătrate
reprezintă distanţele în linie dreaptă până la oraşul T. Ordinea în care este explorată
harta este următoarea. Linia punctata arată ordinea în care nodurile sunt expandate,
nu ordinea în care au fost generate. Acest aspect apare în următoarea figură de mai
jos.
Pentru estimarea costului distantei ramase de la nodul X pana la nodul soluţie
vom folosi pur și simplu distanta în linie dreapta dintre X și t data de dist(X,t) astfel
că:
f(X) = g(X)+h(X) = g(X)+dist(X,t)
125
Inteligenţă Artificială. Tehnici.
In concluzie
Vom discuta în continuare două strategii de căutare euristică. Vom folosi pentru
exemplificare, următoarea problema: data fiind o harta rutiera a României, sa se
găsească o cale (de preferința de cost minim) între Arad și București. Pentru aceasta
problema:
starea inițiala indica ca ne aflam în orașul Arad,
starea finala este data de București,
funcția succesor va furniza toate orașele în care putem ajunge dintr-un oraș
dat, iar funcția de cost indica numărul de km al fiecărui drum intre doua orașe,
presupunând ca viteza de deplasare este constanta.
Ca euristica vom utiliza pentru fiecare oraș distanta geometrica (in linie
dreapta) până la București.
126
Inteligenţă Artificială. Tehnici.
În cadrul acestei strategii se consider că nodul care merită să fie expandat în pasul
următor este cel mai apropiat de soluție. Din acest considerent funcția de evaluare a
cât de promițător este nodul va ține cont numai de component euristică h(n), costul
drumului până la starea curentă finală. ignorant.
f(n)=h(n), n
127
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor, este data de un obiect
compus unde apar doua elemente: configuraţia propriu zisa şi valoarea
estimatorului euristic corespunzătoare configuraţiei respective. Ca urmare vom
avea:
128
Inteligenţă Artificială. Tehnici.
2. hill_climb(Stare, Stare1)
are rolul de a genera o noua configuraţie (Stare1) plecând de la starea
curentă (Stare).
domains
nod = symbol drum = nod*
element = stare(symbol,integer) stări= element*
predicates
rezolva(nod,drum)
solve_hil_climb(stări, element, drum) hil_climb(element, element)
aparţine(nod, drum) aparţine(element, stări)
evalueaza_si_ordoneaza(drum,stări,stări) insert(element,stări,stări)
s(nod,nod) h(nod,integer)
goal
rezolva(a,R),write(R).
clauses
rezolva(Nod,Solutie) :-
solve_hil_climb([ ],stare(Nod,0), Solutie).
solve_hil_climb(Istoric,stare(Nod,V),[Nod|Sol]) :-
hil_climb(stare(Nod,V),stare(Nod1,V1)),
not(aparţine(stare(Nod1,V1),Istoric)),
solve_hil_climb([stare(Nod,V)|Istoric],stare(Nod1,V1),Sol).
hil_climb(stare(Nod,_),Stare1) :-
findall(Nod1,s(Nod,Nod1),Noduri),
evalueaza_si_ordoneaza(Noduri,[ ],NVa),
aparţine(Stare1,NVa).
evalueaza_si_ordoneaza([Nod|Noduri],NVa,NVa_ordonat) :-
h(Nod,Valoare),
insert(stare(Nod,Valoare),NVa,NVa1),
evalueaza_si_ordoneaza(Noduri,NVa1,NVa_ordonat).
evalueaza_si_ordoneaza([],NVa,NVa).
insert(stare(N,V),[ ],[stare(N,V)]).
insert(stare(N,V),[stare(N1,V1)|NVa],[stare(N,V),stare(N1,V1)|NVa]) :-
V<=V1.
insert(stare(N,V),[stare(N1,V1)|NVa],[stare(N1,V1)|NVa1]) :-
V>V1,
insert(stare(N,V),NVa,NVa1).
130
Inteligenţă Artificială. Tehnici.
Observaţii
1. Greedy Best-First urmărește mereu soluția care pare cea mai apropiată de
țintă. Strategia propune în acest context o tehnica de înaintare funcţie de
valoarea unei estimaţii euristice fiind aleasa prima stare “mai bună” din cele
posibile de a fi urmate. A decide când o stare este „mai bună” decât alta
presupune existenţa unui criteriu de comparare a stărilor între ele. Acesta este
dat de o funcţie euristică (sau de evaluare a stării). Deci primul lucru ce
trebuie avut în vedere atunci când se apelează la metoda Greedy Best-First
este construirea unei astfel de funcţii. Acest lucru nu este întotdeauna uşor.
2. Faptul că Greedy Best-First urmărește mereu soluția care pare cea mai
aproape de sursa nu se vor analiza stări care deși par mai depărtate de soluție
produc o cale către soluție mai scurta. De asemenea, întrucât nodurile din
listele intermediare create (vezi Fig. 5.) nu sunt niciodată reexplorate se va găsi
calea cea mai scurta către scop doar dacă se întâmplă ca această cale să fie
analizată înaintea altor căi către aceiași stare scop. Din acest motiv, algoritmul
nu este optim. De asemenea, pentru grafuri infinite e posibil ca algoritmul să
ruleze la infinit, chiar dacă exista o soluție.
131
Inteligenţă Artificială. Tehnici.
explorat se alege Sibiu, întrucât are valoarea h(n) minima. Se alege în continuare
Făgăraș după care urmează București, care este un nod final. Se observa însă ca
acest drum nu este minimal. Deși Făgăraș este mai aproape ca distanta geometrica
de București, în momentul în care starea curenta este Sibiu alegerea optimala este
Râmnicu-Vâlcea. în continuare ar fi urmat Pitești și apoi București obținându-se un
drum cu 32 km mai scurt.
132
Inteligenţă Artificială. Tehnici.
13.3 A* (A Star)
f(n)=g(n)+h(n), n
133
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor este data de un obiect
compus unde apar trei elemente:
134
Inteligenţă Artificială. Tehnici.
135
Inteligenţă Artificială. Tehnici.
predicates
rezolva(nod,drum) solve_best(frontiera,drum,drum)
aparţine(nod,drum) insert(element,frontiera,frontiera)
update_frontier(drum,nod,drum,drum,frontiera,frontiera)
s(nod,nod) h(nod,integer)
mai_mic(element,element) egal(element,element)
goal
rezolva(a,R),write(R).
clauses
rezolva(Nod,Solutie) :-
solve_best([stare(Nod,[ ],0)],[ ],Solutie).
solve_best([stare(Nod,Drum,_)|Frontiera],Istoric,Sol) :-
findall(Nod1,s(Nod,Nod1),Noduri),
update_frontier(Noduri,Nod,Drum,Istoric,Frontiera,Frontiera1),
solve_best(Frontiera1,[Nod|Istoric],Sol),!;
solve_best(Frontiera,Istoric,Sol).
update_frontier([Nod1|Noduri],Nod,Drum,Istoric,F,F1) :-
h(Nod1,Value),
not(aparţine(Nod1,Istoric)),
insert(stare(Nod1,[Nod|Drum],Value),F,F0),
update_frontier(Noduri,Nod,Drum,Istoric,F0,F1).
update_frontier([ ],_,_,_,F,F).
insert(Stare,[ ],[Stare]).
insert(Stare,[Stare1|Stari],[Stare,Stare1|Stari]) :-
mai_mic(Stare1,Stare).
insert(Stare,[Stare1|Stari],[Stare|Stari]) :-
egal(Stare,Stare1).
136
Inteligenţă Artificială. Tehnici.
insert(Stare,[Stare1|Stari],[Stare1|Stari1]) :-
mai_mic(Stare,Stare1),insert(Stare,Stari,Stari1).
egal(stare(S,_,V),stare(S,_,V)).
mai_mic(stare(S1,_,V1),stare(S2,_,V2)) :-
S1<>S2,V1<V2.
aparţine(X,[X|_]).
aparţine(X,[_|R]) :- aparţine(X,R).
Observaţii
Se observă că în pasul (e), după expandarea nodului Făgăraș deși există o soluție în
mulțimea open aceasta nu este aleasă pentru explorare. Se va alege Pitești, întrucât
f(nod(București)) = 450 > f(nod(Pitești)) = 417, semnificația acestei inegalități fiindcă
e posibil sa existe prin Pitești un drum mai bun către București decât cel descoperit
până acum.
137
Inteligenţă Artificială. Tehnici.
Fig.7. Rulare A*
138
Inteligenţă Artificială. Tehnici.
1. Algoritmul va găsi calea optima către soluție, dacă o soluție există. Singurul
inconvenient fata de Greedy Best-First este ca sunt necesare reevaluările
nodurilor din frontieră.
139
Inteligenţă Artificială. Tehnici.
13.4 IDA*
Iterative Deepening A* utilizează conceptul de adâncime iterativă în procesul de
explorare a nodurilor. La un anumit pas se vor explora doar noduri pentru care
funcția de evaluare are o valoare mai mica decât o limita dată. Limita este dată de
valoarea maximă a funcției euristice f. Această limită este incrementata treptat până
se găsește o soluție. Căutarea este de tip depth-first, funcția euristică fiind utilizată
numai pentru limitarea expansiunii în spațiul stărilor.
În prima iterație se determină “f-cost limit” – cut-off value
f(n0) = g(n0) + h(n0) = h(n0), unde n0 este nodul de start.
Se expandează nodurile a căror funcție euristică f(n) nu depășește valoare
funcției de cost limită . Expandarea utilizează o strategie de tip depth-first
Daca căutarea nu are succes se determină cea mai mică valoare f(n) a
nodurilor care au fost vizitate dar nu au fost expandate.
Se utilizează această valoare pentru noua limită de tip “f-cost limit” – cut-off
value și se reinițializează o altă căutare de tip dept-first
S repetă această procedură până în momentul găsirii nodului țintă.
140
Inteligenţă Artificială. Tehnici.
Caracteristici IDA*
Este completă (garantează găsirea unei soluții)
Nu este optimă (nu garantează găsirea unei soluții optime)
Cere mai puțină memorie comparativ cu A* deoarece nu mai necesita
utilizarea unor mulțimi pentru reținerea nodurilor explorate.
141
Inteligenţă Artificială. Tehnici.
142
Inteligenţă Artificială. Tehnici.
143
Inteligenţă Artificială. Tehnici.
Important
Trebuie reţinut faptul că pe fiecare nivel al arborelui de căutare în spaţiul
configuraţiilor fiecare lista de subarbori este ordonata după valoarea estimatorului
144
Inteligenţă Artificială. Tehnici.
euristic. . Se va lua în considerare nivel cu nivel arborele cel mai promiţător până
când se ajunge la ultimul subarbore aflat pe ultimul nivel de unde se ia în
considerare frunza cea mai promiţătoare. Aceasta dezvoltă un nou sub arbore
care se înserează într-o noua lista dacă se coboară un nivel mai jos sau în una
din listele de subarbori prezente pe unul din nivele funcţie de valoarea funcţiei
euristice.
domains
arbore = t(nod, integer, integer, frunze); l(nod, integer, integer)
frunze = arbore* nod = symbol
drum = nod* drumuri = drum*
rezolvat = da; nu; never
predicates
bestf(nod,drum)
expand(drum, arbore, arbore, rezolvat, drum)
continue(drum, arbore, arbore, rezolvat, rezolvat, drum)
adaug(drum,drum,frunze,frunze,nod,integer)
insert(arbore, frunze, frunze)
f(arbore, integer) aparţine(nod, drum)
s(nod,nod) h(nod,integer)
c(nod,nod,integer)
goal
clearwindow,
bestf(a,R),bound(R),write(R),!;
write("\n Fara solutie").
clauses
bestf(N,Solutie) :-
expand([ ],l(N, 0, 0), _ , _ , Solutie).
145
Inteligenţă Artificială. Tehnici.
expand(P,t(R,F,G,[T|Subs]),Tree,Rez,Sol) :-
expand([R|P],T,T1,Rez1,Sol),
continue(P,t(R,F,G,[T1|Subs]),Tree,Rez1,Rez,Sol).
expand(_,t(_,_,_,[ ]),_,never,_) :- !.
continue(_,_,_,da,da,_).
continue(P,t(R,F,G,[T|Subs]),Tree,Rez1,Rez,Sol) :-
Rez1 = nu,
insert(T,Subs,NTs),
expand(P,t(R,F,G,NTs),Tree,Rez,Sol);
Rez1 = never,
expand(P,t(R,F,G,Subs),Tree,Rez,Sol).
adaug([N|R],Drum,Ramuri,Ramuri_ordonat,N1,G) :-
not(aparţine(N,Drum)),
h(N,H),
c(N1,N,Cost),
G1 is G+Cost,
F1 is G1+H,
insert(l(N,F1,G1),Ramuri,Ramuri1),
adaug(R,Drum,Ramuri1,Ramuri_ordonat,N1,G),!.
adaug([ ], _, [ ], _ , _ , _ ) :- fail.
adaug([ ], _ , R, R, _ , _ ).
insert(l(N,F,G),[ ],[l(N,F,G)]).
insert(T,[T1|Tree],[T,T1|Tree]) :-
f(T,F),f(T1,F1),F<=F1,!.
insert(T,[T1|Tree],[T1|Tree1]) :-
insert(T,Tree,Tree1).
f(l( _ , F, _ ), F).
f(t(_, F, _ , _ ), F).
aparţine(X,[X|_]).
aparţine(X,[_|R]) :-
aparţine(X,R).
146
Inteligenţă Artificială. Tehnici.
s(a,b). s(a,c). s(a,n). s(b,d). s(b,e). s(d,h). s(d,i). s(e,j). s(c,f). s(c,g).
s(f,k). s(f,l). s(g,m). s(e,j). s(l,j).
Observaţie
Ca şi în exemplele date anterior, pentru a putea urmări modul de funcţionare
s-a considerat un spaţiu al configuraţiilor definit prin axiome, la care s-au adăugat
estimatorii euristici ai configuraţiilor ca şi costul mişcării între doua configuraţii ( de
ex. c(a,b,2) costul treceri din configuraţia a în b este 2)
Concluzii
147
Inteligenţă Artificială. Tehnici.
d S
f S g S h S 1 hS
N
148
Inteligenţă Artificială. Tehnici.
149
Inteligenţă Artificială. Tehnici.
150
Inteligenţă Artificială. Tehnici.
domains
element=lup; varza; capra; alone stare=element*
mal=stanga; dreapta nod=Ivc (mal,stare,stare)
predicates
h(nod, integer) c(nod, nod, integer)
numar(stare, integer) scad(integer, integer)
clauses
c(Ivc(_,S,D),C) :- numar(S,Hs),
numar(D,Hd),
scad(Hs,Hd,C).
numar ([ ], 0 ).
numar ([ _ |R], H) :- C=B-A,
C>=0,!,
C is A-B.
h(Ivc(_,_,D),H) :- numar(D,H).
(TEHNICA II) Problema 8-puzzle: Există o tablă 3x3 pe care se găsesc 8 piese
pătrate. La un moment dat o singură piesă se poate mişca cu o poziţie, pe
orizontală sau verticală, în limitele cadrului tablei, în locul rămas liber. Plecând de la
o configuraţie iniţială a tablei trebuie să se ajungă într-alta, ce este de asemenea
dată
151
Inteligenţă Artificială. Tehnici.
Iniţial vom construi procedura succesor în contextul regulilor de joc (moment în care
vom specifica și structura de date utilizată), după care vom trece la prezentarea
modului I care se construieşte estimatorul euristic.
Configuratie
[ [3, 3], [1, 3], [2, 2], [2, 3], [3, 2], [3, 1], [2, 1], [1, 1], [1, 2] ]
152
Inteligenţă Artificială. Tehnici.
domains
poz=integer* tabl=poz*
predicates
s(tabl, tabl, tabl) swap(poz, poz, tabl, tabl)
d(poz, poz, integer) dif(intefer, integer, integer)
clauses
s([Empty | L], [T | L1], 1) :-
swap(Empty, T, L L1).
swap(E, T, [T | L], [E | L]) :-
d(E, T,1).
swap(E, T, [T1 | L], [T1 | L1]) :-
swap(E, T, L, L1).
153
Inteligenţă Artificială. Tehnici.
154
Inteligenţă Artificială. Tehnici.
1) Calculul distanţei totale a celor 8 piese din poziţia curentă faţă de poziţia
acasă . Distanța (pe orizontală și verticală) a patratului nevid în starea curentă față
de pozitia lui în starea finala se mai numește si "distanța Manhattan". Pentru
exemplul dat este dată de:
PIESA Scor
1 2
4 2
2 2
Grad de ordonare = 6
155
Inteligenţă Artificială. Tehnici.
domains
poz=integer* tabl=poz*
predicates
h(tabl,integer) seq(tabl,integer)
tinta(tabl) s(tabl,tabl,integer)
d(poz,poz,integer) totdist(tabl,tabl,integer)
seq1(tabl,poz,integer) scor(poz,poz,integer)
swap(poz,poz,tabl,tabl) div(integr,integer,integer)
goal
p=[[3,3],[1,3],[2,2],[2,3],[3,2],[3,1],[2,1],[1,1],[1,2]],
h(P,D),write("Estimator euristic=",D),nl,
s(P,P1,1),write("Succesor\n",P1).
clauses
h([ _ | L], H) :-
ţinta([ _ | G]),
totdist(L, G, D),
seq(L,S),
H=D+3*S.
totdist( [ ], [ ], 0).
totdist( [T | L], [T1 | L1 ], D) :-
d(T, T1, D1),
totdist(L, L1, D2),
D=D1+D2.
seq( [ First |L ], S) :-
seq1([ First | L ], First, S).
swq1( [T1,T2 | L ], First, S) :-
scor(T1,T2,S1),
seq1( [ T2 | L ], First, S2),
156
Inteligenţă Artificială. Tehnici.
S=S1+S2.
seq1( [ Last ], First, S) :-
scor(Last, First, S).
scor( [2, 2], _ , 1) :- !.
scor( [1, 3], [2, 3], 0 ) :- !.
scor( [2, 3], [3, 3], 0 ) :- !.
scor( [3, 3], [3, 2], 0 ) :- !.
scor( [3, 2], [3, 1], 0 ) :- !.
scor( [3, 1], [2, 1], 0 ) :- !.
scor( [2, 1], [1, 1], 0 ) :- !.
scor( [1, 1], [1, 2], 0 ) :- !.
scor( [1, 2], [1, 3], 0 ) :- !.
scor( _ , _ , 2 ).
tinta( [ [2,2], [1,3], [2,3], [3,3], [3,2], [3,1], [2,1], [1,1], [1,2] ] ).
s( [Empty |L], [T |L1], 1) :-
swap( Empty,T, L, L1 ).
swap( E, T, [T |L], [E | L ] ) :-
d(E,T,1).
swap( E, T, [T1 |L], [T1 |L1] ) :-
swap(E,T,L,L1).
d( [X,Y], [X1,Y1], D ) :-
dif( X, X1, Dx),
dif( Y, Y1, Dy),
D=Dx+Dy.
dif(A,B,D) :-
D=A-B,
D>=0,!;
D=B-A.
Concluzii:
Pot fi definite două mari categorii de estimatori euristici.
(I) În prima categorie intră cei care definesc un număr de elemente sau
poziţii care deja sau atins. Este cel mai simplu criteriu și este aplicabil atunci când
interesează obţinerea unui număr de componente în care configuraţia nu contează.
157
Inteligenţă Artificială. Tehnici.
EXEMPLE
(1) Trei misionari si trei canibali ajung la un râu. Exista o barca de doua locuri cu
care se poate traversa râul. Daca numărul canibalilor este mai mare decât
numărul misionarilor pe unul din malurile râului, misionarii vor fi mâncați de
canibali. Cum pot trece toți râul fără ca misionarii sa fie mâncați? Starea
inițiala sistarea finala a acestei probleme sunt descrise in figura următoare.
158
Inteligenţă Artificială. Tehnici.
Unde
nmE S număr de misionari pe malul de EST in starea S
nmV S număr de misionari pe malul de VEST in starea S
ncE S număr de canibali pe malul de EST in starea S
ncV S număr de canibali pe malul de VEST in starea S
n S n S n S număr
E E
m
E
c de persoane pe malul de EST in starea S
nV S nmV S ncV S număr de persoane pe malul de VEST in starea S
(2) Definiți funcții de evaluare euristică pentru problema N-puzzle altele decât
cea discutată anterior. Problema N-puzzle prezintă două variante 8-puzzle (o
tablă de joc de 3x3) și 15-puzzle (o tablă de joc de 4x4). Funcțiile de
evaluare euristică se vor discuta pentru varianta 15-puzzle.
159
Inteligenţă Artificială. Tehnici.
Exerciţiu
1. Construiţi o procedura de calcul a estimatorului euristic în problema celor 6
comutatoare.
160
Inteligenţă Artificială. Tehnici.
160
Inteligenţă Artificială. Tehnici.
Strategiile pe care le vom lua în considerare sunt alegerea celei mai bune mutări,
minimax şi alfa-beta.
161
Inteligenţă Artificială. Tehnici.
Găsește toate stările de joc posibile care pot fi obţinute într-o singură mutare.
Calculează valorile stărilor, utilizând o funcţie de evaluare. Alege mutarea care
conduce la poziţia cu scorul cel mai mare.
Structura unei configuraţii (alternative) din spaţiul stărilor, este data de un obiect
compus, unde apar două elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
162
Inteligenţă Artificială. Tehnici.
alege_mutarea(Pozitia,computer,Mutare) :-
findall(M,
mut(Pozitia,M),
Mutări),
evalueaza_si_alege(Mutări, Pozitia, p( _, 1000), Mutare).
evalueaza_si_alege([Mutare|Mutări],Pozitia,Record,Mutare_aleasa) :-
muta(Mutare,Pozitia,Pozitia1),
valoare(Pozitia1,Valoare),
actualizez(Mutare,Valoare,Record,Record1),
evalueaza_si_alege(Mutări,Pozitia,Record1,Mutare_aleasa).
actualizez(_,Valoare,p(Mutare1,Valoare1),p(Mutare1,Valoare1)) :-
Valoare >= Valoare1.
actualizez(Mutare,Valoare,p( _, Valoare1),p(Mutare,Valoare)) :-
Valoare < Valoare1.
Comentarii
(a) Dacă “noi” sunt la mutare, procedura alege_mutare va conţine un dialog cu
utilizatorul în care se va solicită mutarea pe care partenerul umana
intenționează să o efectueze. Se observa în acest caz că “ei” reprezintă
“calculatorul” care specifică în contextul acestei strategii ce intenționează sa
mute.
163
Inteligenţă Artificială. Tehnici.
Aplicație
Jocul NIM (Marienbad-game) se defineşte astfel: Sunt prezente un număr de N rânduri
de câte M chibrit, aranjate în ordinea 1, 3, 5, 7, 9, … Regulile jocului sunt foarte simple:
cei doi jucători iau pe rând unul sau mai multe beţe de chibrit cu condiţia ca toate
chibritule luate să se afle prezente pe acelaşi rând. Este declarat câștigător al jocului cel
care ia ultimul chibrit.
164
Inteligenţă Artificială. Tehnici.
165
Inteligenţă Artificială. Tehnici.
Cea mai importanta descoperire cu privire la joc s-a făcut în 1901 de Charles
Bouton care a generalizat jocul pentru N linii cu orice număr de poziţii pe fiecare linie şi a
demonstrat prezenta unei strategii simple care da posibilitatea unui joc perfect. Acesta a
arătat că în cazul jocului apar doua combinații de linii protejate şi neprotejate. O mişcare,
este protejata dacă după ce jucătorul a făcut mişcarea sa garantează câștigul şi
neprotejata în caz contrar. Rezultă de aici că un joc inteligent şi rațional consta în aceea
că jucătorul care doreşte sa-şi asigure câștigul trebuie sa efectueze mutările de așa
natura, încât orice poziţie neprotejata pe care a preluat-o de la partenerul sau să o
transforme într-una protejata. Regula după care se determină dacă o poziţie este sau nu
protejata este: numerele de pe fiecare linie se scriu binar şi se face sau exclusiv pe
fiecare coloana. Dacă valoarea care se obţine, este 0 poziţia este protejata (sau para) şi
neprotejata în caz contrar. De exemple poziţia 1,3,5,7, este protejata deoarece avem
POZIŢIA POZIŢIA
1, 3, 5, 7 2, 6
1 10
11 110
101 100
111
000
Protejata Neprotejata
predicates
start nim_sum(stiva,integer,integer)
166
Inteligenţă Artificială. Tehnici.
initializeaza(stiva,jucator) play(stiva,jucator)
sfirsit_joc(stiva,jucator) anunta(jucator)
muta(mutare,stiva,stiva) mutări(stiva,lista_mutări)
urmatorul_jucator(jucator,jucator) valoare(stiva,integer)
alege_mutarea(stiva,jucator,mutare) afiseaza(stiva,jucator)
actualizez(mutare,integer,record,record)
evalueaza_si_alege(lista_mutări,stiva,record,mutare)
goal
makewindow(3,7,0,"",0,0,25,80),
makewindow(2,7,7,"NOI la mutare",1,41,12,30),
makewindow(1,7,7,"Pozitie",1,1,12,40),
start.
clauses
start :-
initializeaza(Pozitia,Jucator),
afiseaza(Pozitia,Jucator),
play(Pozitia,Jucator).
initializeaza([m(1,1),m(2,3),m(3,5),m(4,7)], noi).
play(Pozitia,Jucator) :-
sfirsit_joc(Pozitia,Jucator),!,
anunta(Jucator).
play(Pozitia,Jucator) :-
alege_mutarea(Pozitia,Jucator,Mutare),
muta(Mutare, Pozitia, Pozitia1),
afiseaza(Pozitia1, Jucator),
urmatorul_jucator(Jucator, Jucator1), !,
play(Pozitia1, Jucator1).
alege_mutarea(_,noi,m(S,M)) :-
shiftwindow(2),
write("\n Mut din stiva ="),readint(S),
write("\n Un numar de pozitii = "),readint(M).
alege_mutarea(Pozitia,computer,Mutare) :-
mutări(Pozitia,Mutări),
evalueaza_si_alege(Mutări,Pozitia,p( _,1000),Mutare).
167
Inteligenţă Artificială. Tehnici.
evalueaza_si_alege([Mutare|Mutări],Pozitia,Record,Mutare_aleasa) :-
muta(Mutare,Pozitia,Pozitia1),
valoare(Pozitia1,Valoare),
actualizez(Mutare, Valoare, Record, Record1),
evalueaza_si_alege(Mutări, Pozitia, Record1, Mutare_aleasa).
actualizez(Mutare,Valoare,p(_,Valoare1),p(Mutare,Valoare)) :-
Valoare < Valoare1.
afiseaza(Pozitia,_) :-
shiftwindow(1),
write(Pozitia),nl.
urmatorul_jucator(computer,noi). urmatorul_jucator(noi,computer).
sfirsit_joc([m(1,0),m(2,0),m(3,0),m(4,0)],_).
anunta(computer) :-
write("Eu am cistigat"),nl.
anunta(noi) :-
write("Computerul a cistigat"),nl.
valoare(Pozitia,Valoare) :- nim_sum(Pozitia,0,Valoare).
nim_sum([ ],S,S).
nim_sum([m(_,N)|Ns],Nb,Sum) :-
bitxor(N,Nb,Nb1),
nim_sum(Ns,Nb1,Sum).
Observații
1. O poziţie din configuraţia de joc se reprezintă sub forma unui obiect compus cu
aspectul
n(numar linie, numar poziţii din linie)
168
Inteligenţă Artificială. Tehnici.
169
Inteligenţă Artificială. Tehnici.
Precizări
(1) Trebuie făcuta distincţia dintre un “arbore de joc” şi un arbore de căutare. Un
arbore de căutare este în mod normal o parte a unui arbore de joc, mai exact
este partea care este explicit generate prin procesul de căutare. Este posibil ca
în acest caz poziţiile terminale ale arborelui de căutare sa conţină poziţii
terminale ale jocului.
(2) Funcţia de evaluare se transformă într-un estimator euristic, care evaluează
șansele de câștig din punctual de vedere al unuia dintre jucători. Astfel cea mai
170
Inteligenţă Artificială. Tehnici.
mare valoare va reprezenta șansa de a câștiga cea mai mare pentru un jucător
în timp ce cea mai mică valoare va defini şansa de a câștiga a oponentului.
(3) Deoarece unul din cei doi jucători va tinde sa obțină poziţia cu cea mai mare
valoare iar cel de al doilea poziţia cu valoarea cea mai mică, cei doi jucători pot
fi numiți MAX şi MIN. Ori de câte ori MAX este la mutare va alege mutarea
care maximizează valoarea obţinuta din evaluarea funcţiei euristice ce
caracterizează poziţia, iar în opoziţie MIN va alege mutarea care minimizează
valoarea
(4) Fiind date valorile de pe nivelul cel mai de jos al arborelui de căutare, strategia
minimax va determina valorile pentru toate celelalte poziţii din arborele de
căutare
Principiul este ilustrat de figura de mai jos cu următoarele observații:
- MAX poate fi identificat cu “Noi” (sau “Ei”) iar MIN cu “Ei” (sau “Noi”)
- Denumirea de valori statice provine din faptul că ele se obţin printr-o
evaluare statică a funcţiei de evaluare în contrast cu valorile care sunt
obţinute dinamic prin propagarea valorilor statice în sus în arbore.
- Valorile nodurilor interne pot fi calculate nivel cu nivel de jos în sus pana
când nodul rădăcina este atins. Valoarea ataşată nodului rădăcina este 4 şi în
concordanţă cu strategia minimax cea mai buna mutare a lui MAX aflat în
poziţia a este a – b. Cea mai buna mutare cu care poate replica MIN este b –
d s.a.m.d. Aceasta secvența de mişcări poarta denumirea de variațiunea
principala. Aceasta defineşte mişcările optimale minimax pentru ambele
tabere.
171
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor este data de un obiect
compus unde apar două elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
172
Inteligenţă Artificială. Tehnici.
evalueaza_si_alege([Mutare|RestMutări],Pozitie,Adancime,MaxMin,
Record,MutareSelectata):-
muta(Mutare,Pozitie,PozitieNoua),
minimax(Adancime, PozitieNoua,MaxMin,Mutare,Valoare),
actualizez(Mutare,Valoare,Record,Record1),
evalueaza_si_alege(Mutări,Pozitie,Adancime,MaxMin,Record1,MutareSelectata).
minimax(0,Pozitie,MaxMin,_,Valoare):-
estimeza_valoarea_pozitiei(Pozitie,ValoarePozitie),
Valoare = ValoarePozitie * MaxMin.
minimax(Adancime,Pozitie,MaxMin,Mutare,Valoare):-
Adancime >0,
findall(M,mut(Pozitie,M),ListaMutări),
Adancime1 = Adancime -1,
MinMax = -MaxMin,
evalueaza_si_alege(ListaMutări,Pozitie, Adancime1,MinMax,p(nil,-1000),Mutare).
actualizez(_,Val,p(Mutare1,Val1),p(Mutare1,Val1))) :-
Val<=Val1,!.
actualizez(Mutare,Val,p(_,Val1),p(Mutare,Val))) :-
Val>Val1,!.
173
Inteligenţă Artificială. Tehnici.
- Alfa (α) este cea mai buna valoare pe care o poate alege MAX găsită pana
Beta (β) este valoarea maximă pe care MAX o poate obţine. Cu alte cuvinte:
(α) Scorul minim pe care jucătorul MAX poate sa-l atingă garantat
împotriva adversarului.
- Din punct de vedere a lui MIN, Beta (β) este cea mai rea valoare pe care o
poate obţine pe care o poate alege MIN găsită pana în momentul curent
pentru orice alegere dea lungul căi de configuraţii, Beta (β)este cea mai
buna valoare pe care o poate alege MIN găsită pana în momentul curent
174
Inteligenţă Artificială. Tehnici.
pentru orice alegere dea lungul căi de configuraţii, iar Alpha (α) valoarea
(α) Scorul cel mai bun pe care jucătorul MIN poate spera sa-l
atingă
împotriva adversarului.
- cheia algoritmului Alpha-beta este găsirea unei mutări suficient de buna (nu
trebuie sa fie cea mai buna în mod necesar), pentru a lua o decizie corecta.
Astfel valoarea poziţiei curente (v) trebuie sa fie între Alpha şi Beta,
V >= β
- dacă la mutare este MIN, iar valoarea găsită este mai mică decât Alpha
V <= α
α cu – β
β cu - α
MIN devine practic jucătorul maximizat iar MAX jucătorul minimizat
Principiul de funcţionare a strategiei poate fi ilustrat astfel:
175
Inteligenţă Artificială. Tehnici.
Principiul Alpha_Beta
α este cea mai buna mutare
pentru MAX pe ramura curentă.
Dacă v este o mutare mai
slaba pentru MAX comparativ,
cu α, MAX nu o va atinge
niciodata, ramura care conduce
la ea fiind tăiată
Se defineste similar β pentru
MIN
Operatia de taiere poate reduce
cu 40 % spaţiul de căutare
(1)
Se generează toți succesorii pentru nodul cel mai din stânga şi se calculează
funcţia de evaluare., obţinându-se 5 respectiv 7. Deoarece MIN este la mutare se
176
Inteligenţă Artificială. Tehnici.
(2)
Se generează toți succesorii pentru nodul cel mai din stânga şi se calculează
funcţia de evaluare. obţinându-se 6 respectiv 3. Deoarece MAX este la mutare se
(A)
177
Inteligenţă Artificială. Tehnici.
(B)
(C)
Pentru exemplul dat la strategia minimax, utilizarea lui Alpha_Beta conduce la
următoarele operații de tăiere în arborele de joc:
178
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor este data de un obiect
compus unde apar doua elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
179
Inteligenţă Artificială. Tehnici.
180
Inteligenţă Artificială. Tehnici.
Deterministic Șansă
Indiferent de natura jocului în prezent funcția de evaluare a poziției de joc este dat
de o funcție de forma
181
Inteligenţă Artificială. Tehnici.
În cele ce urmează vom prezenta câteva jocuri și vom arăta modul în care se
construiește funcția de evaluare a poziției curente a jocului în cauză.
182
Inteligenţă Artificială. Tehnici.
Observații
(1) Deşi pare un joc simplu spaţiul stărilor este foarte mare. La prima mutare sunt 9
răspunsuri posibile, la cea de a doua 8 răspunsuri posibile, samd. Ca urmare arborele
de joc are 9 x 8 x 7 x …. ..x 2 x 1 = 9! Deci 15120 stări.
Faptul că apare un fenomen de simetrie ( de exemplu în prima mișcare pot pune în
colt, în mijloc, sau în centrul unei laturi) spaţiul stărilor are un număr mai mic de stări,
dar care este încă considerabil. De exemplu:
183
Inteligenţă Artificială. Tehnici.
184
Inteligenţă Artificială. Tehnici.
Predicate
poziţie(pozitie,pozitie) mut(pozitie,piesa,pozitie)
apartine(element,poziţie) update(element,poziţie,poziţie)
Tinta
? P is [p(o,1,1),p(l,2,1),p(l,3,1),
p(l,1,2),p(l,2,2),p(l,3,2),
p(l,1,3),p(x,2,3),p(l,3,3)],
pozitie(P,P1),write(P1).
*/
pozitie(P,P1) :-
mut(P,x,Mutări),
apartine(Mutare,Mutări),
update(Mutare,P,P1).
mut([],_,[]).
mut([p(P,X,Y)|Rest],x,[p(x,X,Y)|Rx]) :-
P is l,
mut(Rest,x,Rx),!.
mut([_|Rest],x,Rx) :-
mut(Rest,x,Rx).
update(p(OX,X,Y),[p(P,X1,Y1)|Rp],[p(P,X1,Y1)|Rp1]) :-
X<>X1,
update(p(OX,X,Y),Rp,Rp1),!;
Y<>Y1,
update(p(OX,X,Y),Rp,Rp1),!.
185
Inteligenţă Artificială. Tehnici.
update(p(OX,X,Y),[p(l,X1,Y1)|Rp],[p(OX,X,Y)|Rp]) :-
X1 is X, Y1 is Y.
apartine(X,[X|_]).
apartine(X,[_|R]) :-
apartine(X,R).
2. Apoi urmează faza 2, de mutare a pieselor. O piesă se poate muta doar pe poziţiile
vecine, adică poziţiile legate cu linie de poziţia curentă.
3. Când un jucător rămâne doar cu 3 piese pe tablă, trece în faza a treia a jocului. În
această fază, jucătorul are voie să mute oriunde, nu doar în poziţiile vecine.
Când un jucător reuşeşte să-şi pună 3 piese în linie (poziţiile pieselor să fie legate
prin linii pe tabla de joc), se spune că acesta a închis o moară.
Când un jucător închide o moară, are dreptul sa-i captureze celuilalt jucător o
piesă.
Nu este voie să se captureze piese aflate în moară. Dacă un jucător închide o
moară şi toate piesele celuilalt jucător se află în câte o moară închisa, jocul se continuă,
nu se va scoate nici o piesă.
Scopul final al jocului este capturarea pieselor adversarului până acesta rămâne
doar cu 2 piese.
Un jucător câştigă atunci când adversarul rămâne cu numai 2 piese pe tablă sau
când toate piesele adversarului sunt blocate (când adversarul nu mai poate muta).
186
Inteligenţă Artificială. Tehnici.
B. Structura estimatorului
I. Este evident faptul că la calcularea punctajului unei configuraţii de joc trebuie privit
din prisma ambilor jucători. O configuraţie care este foarte bună pentru unul din
jucători, este, evident, nefavorabilă pentru celălalt jucător. Valoarea
estimatorului trebuie să indice în primul rând de partea cui este avantajul. De
aceea, în funcţiile de căutare în spaţiul soluţiilor, s-a recurs la notarea jucătorilor
cu Min şi Max. O valoare foarte mică (sau negativă, în funcţie de implementare)
este favorabilă pentru Min, iar una foarte mare (sau pozitivă) este favorabilă
pentru Max. Astfel, pentru fiecare jucător se va aplica aceeaşi funcţie de
evaluare a configuraţiei. Bineînţeles că pentru fiecare jucător în parte se va ţine
cont de piesele sale şi de relaţiile existente între piese. Calcularea punctajului
asociat unei configuraţii se face deci din două părţi. Să presupunem că primul
jucător este cel pentru care se doreşte găsirea unei mutări bune şi îl vom
considera pe acesta jucătorul Max. Prin urmare, se va calcula funcţia de
evaluare pentru Max (să o notăm EstimMax), iar apoi se calculează pentru Min
(notată EstimMin). Deoarece folosesc aceeaşi funcţie de estimare, este clar că
şi EstimMax şi EstimMin vor avea valori mari pozitive. Dacă EstimMax este mai
mare decât EstimMin, Max este în avantaj. Dacă EstimMin este mai mare,
atunci Min este în avntaj.
187
Inteligenţă Artificială. Tehnici.
III. În contextul jocului Moara sunt importante relațiile dintre piese.. Spre
exemplu o relaţie poate fi « «numărul de piese blocate », iar o altă relaţie
poate fi « moară închisă » reprezentând 3 piese ale aceluiaşi jucător aşezate
în linie. Ponderea unei relaţii este coeficientul sau punctajul asociat relaţiei
respective.
Prin urmare o funcţie de evaluare se stabileşte în doi paşi.
- În primul pas se aleg cu atenţie relaţiile considerate relevante pentru
jocul respectiv (pentru faza jocului) iar
- în pasul al doilea i se asociază un coeficient fiecărei relaţii.
188
Inteligenţă Artificială. Tehnici.
că unele apar în două etape, unele apar chiar în toate trei etapele, dar vor
avea asociate punctaje (ponderi) diferite în funcţie de etapa jocului.
189
Inteligenţă Artificială. Tehnici.
Moară deschisă – la acel pas se deschide moara; s-a dovedit important ca PC-ul să
ştie că este necesar să şi deschidă mori. Fără această relaţie, jucătorul calculator avea
tendinţa să nu mai deschidă o moară odată închisă, deoarece punctajul scădea. Nu este
în regulă să menţină morile închise deoarece astfel nu poate evolua. (relaţia poate lua
valoarea 0 – jucătorul nu a deschis o moară sau 1 – jucătorul a deschis o moară).
Moară dublă sau moară în vânt – două mori apropiate, iar o piesă poate face parte
din ambele astfel încât prin deschiderea unei mori, se închide cealaltă şi tot aşa. În
exemplul din Figura 7.1.1 (c), verdele are o structură de moară dublă.
Configuraţie de câştig – jucătorul care primeşte punctajul asociat acestei relaţii este
câştigător; poate lua valoarea 0 sau 1.
Spre exemplu configuraţia de 3 piese (Number of 3 pieces configuraţion) apare şi în
faza întâi şi în faza a treia dar cel mai probabil vor avea asociate punctaje diferite.
190
Inteligenţă Artificială. Tehnici.
191
Inteligenţă Artificială. Tehnici.
Pentru fiecare jucător în parte este necesar să se cunoască ce relaţii există pe tabla
de joc, de aceea pentru o configuraţie se vor salva două seturi de variabile
corespunzătoare relaţiilor. Să luăm spre exemplu cazul din figura 14.1.2.
Pentru jucătorul verde vom avea valorile relaţiilor:
Numărul morilor = 1
Numărul pieselor adverse blocate = 1 (portocalie încercuită cu verde)
Nr. de config. cu 3 piese = 1
Număr de piese = 6 (ale jucătorului verde)
Restul relaţiilor pentru jucătorul verde vor avea valoarea 0.
Pentru jucătorul portocaliu vom avea valorile relaţiilor:
Numărul morilor = 1
Nr. de config. cu 2 piese = 1 (cele două piese în linie unde se poate închide o
moară prin plasarea unei piese)
Număr de piese = 5 (ale jucătorului portocaliu)
Restul relaţiilor pentru jucătorul portocaliu vor avea valoarea 0.
192
Inteligenţă Artificială. Tehnici.
193
Inteligenţă Artificială. Tehnici.
Toţi jucătorii vor căuta asociaţii de genul blocarea pieselor adversarului sau
închiderea unei mori, însă importanța acestora diferă în ochii jucătorilor.
Importanța se traduce prin coeficienţi. Prin urmare, modul de joc al
calculatorului va fi influenţat în mod definitiv de aceşti coeficienţi.
În prima fază a jocului, se pot defini în mod logic două moduri de joc: ofensiv şi
defensiv, prin atribuirea de coeficienţi relaţiilor. Aceasta se realizează prin mai multe
încercări şi ajustări. Se plecă de la ideea că fiecare mod de joc se axează pe 2-3 relaţii
pe care le vede importante şi cărora li se atribuie un punctaj mare, iar celelalte relaţii au
asociat un punctaj mai mic, uneori chiar şi 0 (neutralizarea unei relaţii – nu se mai ţine
cont de ea). Pentru modul defensiv, se atribuie punctaj mare relaţiilor: număr total de
piese, piese oponent blocate şi moară închisă. Pentru modul ofensiv se atribuie punctaj
mare relaţiilor: moară închisă, moară dublă. O altă diferenţiere se face la nivelul
configuraţiei câştigătoare. Pentru modul defensiv se încearcă câştigarea meciului din
faza a doua (înainte ca jucătorul să rămână doar cu 3 piese pe tablă), în timp ce jucătorul
ofensiv cel mai probabil va ajunge în faza a treia, datorită modului de joc. Distincţia se
face astfel: relaţia de configuraţie câştigătoare în modul defensiv (de exemplu) are
asociată ponderea 1200 în faza doi şi 1000 în faza trei; în modul ofensiv are asociată
ponderea 1000 în faza doi şi 1200 în faza trei.
Una din cele mai utilizate funcții evaluare a poziției curente de joc este de forma
F(n) = c1 * valoare piese + c2 * mobilitate + c3 * siguranță rege +
c4 * control centru tablă + ...
de exemplu
F (n) = 9(Q-Q') + 5(R-R') + 3(B-B'+N-N') + (P-P') - 0.5(D-D'+S-S'+I-I') + 0.1(M-M') + ...
în care
Q, R, B, N, P sunt numărul (sau valoarea ) pentru ture, nebuni, cai, și pioni de pe
tabla de șah. Cu Q se notează numărul de regine . Piesele au culoare albă Q, R,
B, N, P respectiv culoare neagră Q', R', B', N', P'. În prezent cea mai utilizată
contorizare a valorii pieselor este dată în continuare
194
Inteligenţă Artificială. Tehnici.
Un alt aspect care trebuie luat în considerare este legat de valoarea de schimb a
pieselor. Această valoare de schimb apare în momentul în care se iau piese (o
piesă sau se sacrifică 2 sau mai multe piese minore pentru eliminarea unei piese
de valoare mai mare de pe tablă) În această situație este necesar de cuantizat
dacă poziția care se obține în perspectivă ( după două sau mai multe mutări ) este
mai bună decât ca din momentul începerii schimbului ( mai bun însemnând o
funcție de evaluare a poziției de joc mai mare valoric).
Remarcă
195
Inteligenţă Artificială. Tehnici.
196
With alpha-beta pruning (view
presentation for animation)
Minimax with Alpha-Beta pruning
No more branches,
so this is the value
alpha=3 3
Max
My turn
0< 2<
Min beta=3 3
alpha,
so
alpha,
so
prune prune
Opp turn
5>
beta,
Max 3 so
prune
0 2
My turn
Min 2 3 5 0 2 1
Minimax
with
Alpha Beta Pruning
Nod MAX. Obiectivul unui nod MAX este de a maximiza valoarea
subarborelui aferent. Pentru a face acest lucru, un nod MAX
alege subarborele cu cea mai mare valoare care devine valoarea
nodului MAX.
N
Cu alte cuvinte
(α) Scorul minim pe care jucătorul MAX poate să-l atingă garantat
(β ) Scorul maxim pe care jucătorul MAX spera să-l poată obţine împotriva
adversarului.
(α) Scorul maxim pe care jucătorul MIN poate spera să-l atingă
(β ) Scorul minim pe care jucătorul MIN spera să-l poată obţine împotriva
adversarului.
Cheia algoritmului Alpha-beta este găsirea unei mutări suficient de bună (nu
trebuie sa fie cea mai buna în mod necesar), pentru a lua o decizie corecta.
Astfel valoarea poziţiei curente (v) trebuie sa fie între Alpha şi Beta, [ α =< v <=
β].
- dacă la mutare este MAX, iar valoarea găsită este mai mare decât Beta
V >= β
- dacă la mutare este MIN, iar valoarea găsită este mai mică decât Alpha
V <= α
- după modifcarea valorilor α , β condiția de tăiere care cumulează cele două
cazuri de mai sus se va restrânge la α >= β
- Alfa şi Beta se iniţializează pe ultimul şi penultimul nivel impus de adâncimea de
căutare funcţie de secvența în care se efectuează MIN urmat de MAX sau MAX
urmat de MIN. Datorită acestei basculări pentru nivelele următoare celui ultim şi
penultim din arborele de joc se procedează la interschimbarea valorilor
corespunzătoare lui
α cu – β
β cu - α
MIN devine practic jucătorul maximizat iar MAX jucătorul minimizat
160
Inteligenţă Artificială. Tehnici.
Strategiile pe care le vom lua în considerare sunt alegerea celei mai bune mutări,
minimax şi alfa-beta.
161
Inteligenţă Artificială. Tehnici.
Găsește toate stările de joc posibile care pot fi obţinute într-o singură mutare.
Calculează valorile stărilor, utilizând o funcţie de evaluare. Alege mutarea care
conduce la poziţia cu scorul cel mai mare.
Structura unei configuraţii (alternative) din spaţiul stărilor, este data de un obiect
compus, unde apar două elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
162
Inteligenţă Artificială. Tehnici.
alege_mutarea(Pozitia,computer,Mutare) :-
findall(M,
mut(Pozitia,M),
Mutări),
evalueaza_si_alege(Mutări, Pozitia, p( _, 1000), Mutare).
evalueaza_si_alege([Mutare|Mutări],Pozitia,Record,Mutare_aleasa) :-
muta(Mutare,Pozitia,Pozitia1),
valoare(Pozitia1,Valoare),
actualizez(Mutare,Valoare,Record,Record1),
evalueaza_si_alege(Mutări,Pozitia,Record1,Mutare_aleasa).
actualizez(_,Valoare,p(Mutare1,Valoare1),p(Mutare1,Valoare1)) :-
Valoare >= Valoare1.
actualizez(Mutare,Valoare,p( _, Valoare1),p(Mutare,Valoare)) :-
Valoare < Valoare1.
Comentarii
(a) Dacă “noi” sunt la mutare, procedura alege_mutare va conţine un dialog cu
utilizatorul în care se va solicită mutarea pe care partenerul umana
intenționează să o efectueze. Se observa în acest caz că “ei” reprezintă
“calculatorul” care specifică în contextul acestei strategii ce intenționează sa
mute.
163
Inteligenţă Artificială. Tehnici.
Aplicație
Jocul NIM (Marienbad-game) se defineşte astfel: Sunt prezente un număr de N rânduri
de câte M chibrit, aranjate în ordinea 1, 3, 5, 7, 9, … Regulile jocului sunt foarte simple:
cei doi jucători iau pe rând unul sau mai multe beţe de chibrit cu condiţia ca toate
chibritule luate să se afle prezente pe acelaşi rând. Este declarat câștigător al jocului cel
care ia ultimul chibrit.
164
Inteligenţă Artificială. Tehnici.
165
Inteligenţă Artificială. Tehnici.
Cea mai importanta descoperire cu privire la joc s-a făcut în 1901 de Charles
Bouton care a generalizat jocul pentru N linii cu orice număr de poziţii pe fiecare linie şi a
demonstrat prezenta unei strategii simple care da posibilitatea unui joc perfect. Acesta a
arătat că în cazul jocului apar doua combinații de linii protejate şi neprotejate. O mişcare,
este protejata dacă după ce jucătorul a făcut mişcarea sa garantează câștigul şi
neprotejata în caz contrar. Rezultă de aici că un joc inteligent şi rațional consta în aceea
că jucătorul care doreşte sa-şi asigure câștigul trebuie sa efectueze mutările de așa
natura, încât orice poziţie neprotejata pe care a preluat-o de la partenerul sau să o
transforme într-una protejata. Regula după care se determină dacă o poziţie este sau nu
protejata este: numerele de pe fiecare linie se scriu binar şi se face sau exclusiv pe
fiecare coloana. Dacă valoarea care se obţine, este 0 poziţia este protejata (sau para) şi
neprotejata în caz contrar. De exemple poziţia 1,3,5,7, este protejata deoarece avem
POZIŢIA POZIŢIA
1, 3, 5, 7 2, 6
1 10
11 110
101 100
111
000
Protejata Neprotejata
predicates
start nim_sum(stiva,integer,integer)
166
Inteligenţă Artificială. Tehnici.
initializeaza(stiva,jucator) play(stiva,jucator)
sfirsit_joc(stiva,jucator) anunta(jucator)
muta(mutare,stiva,stiva) mutări(stiva,lista_mutări)
urmatorul_jucator(jucator,jucator) valoare(stiva,integer)
alege_mutarea(stiva,jucator,mutare) afiseaza(stiva,jucator)
actualizez(mutare,integer,record,record)
evalueaza_si_alege(lista_mutări,stiva,record,mutare)
goal
makewindow(3,7,0,"",0,0,25,80),
makewindow(2,7,7,"NOI la mutare",1,41,12,30),
makewindow(1,7,7,"Pozitie",1,1,12,40),
start.
clauses
start :-
initializeaza(Pozitia,Jucator),
afiseaza(Pozitia,Jucator),
play(Pozitia,Jucator).
initializeaza([m(1,1),m(2,3),m(3,5),m(4,7)], noi).
play(Pozitia,Jucator) :-
sfirsit_joc(Pozitia,Jucator),!,
anunta(Jucator).
play(Pozitia,Jucator) :-
alege_mutarea(Pozitia,Jucator,Mutare),
muta(Mutare, Pozitia, Pozitia1),
afiseaza(Pozitia1, Jucator),
urmatorul_jucator(Jucator, Jucator1), !,
play(Pozitia1, Jucator1).
alege_mutarea(_,noi,m(S,M)) :-
shiftwindow(2),
write("\n Mut din stiva ="),readint(S),
write("\n Un numar de pozitii = "),readint(M).
alege_mutarea(Pozitia,computer,Mutare) :-
mutări(Pozitia,Mutări),
evalueaza_si_alege(Mutări,Pozitia,p( _,1000),Mutare).
167
Inteligenţă Artificială. Tehnici.
evalueaza_si_alege([Mutare|Mutări],Pozitia,Record,Mutare_aleasa) :-
muta(Mutare,Pozitia,Pozitia1),
valoare(Pozitia1,Valoare),
actualizez(Mutare, Valoare, Record, Record1),
evalueaza_si_alege(Mutări, Pozitia, Record1, Mutare_aleasa).
actualizez(Mutare,Valoare,p(_,Valoare1),p(Mutare,Valoare)) :-
Valoare < Valoare1.
afiseaza(Pozitia,_) :-
shiftwindow(1),
write(Pozitia),nl.
urmatorul_jucator(computer,noi). urmatorul_jucator(noi,computer).
sfirsit_joc([m(1,0),m(2,0),m(3,0),m(4,0)],_).
anunta(computer) :-
write("Eu am cistigat"),nl.
anunta(noi) :-
write("Computerul a cistigat"),nl.
valoare(Pozitia,Valoare) :- nim_sum(Pozitia,0,Valoare).
nim_sum([ ],S,S).
nim_sum([m(_,N)|Ns],Nb,Sum) :-
bitxor(N,Nb,Nb1),
nim_sum(Ns,Nb1,Sum).
Observații
1. O poziţie din configuraţia de joc se reprezintă sub forma unui obiect compus cu
aspectul
n(numar linie, numar poziţii din linie)
168
Inteligenţă Artificială. Tehnici.
169
Inteligenţă Artificială. Tehnici.
Precizări
(1) Trebuie făcuta distincţia dintre un “arbore de joc” şi un arbore de căutare. Un
arbore de căutare este în mod normal o parte a unui arbore de joc, mai exact
este partea care este explicit generate prin procesul de căutare. Este posibil ca
în acest caz poziţiile terminale ale arborelui de căutare sa conţină poziţii
terminale ale jocului.
(2) Funcţia de evaluare se transformă într-un estimator euristic, care evaluează
șansele de câștig din punctual de vedere al unuia dintre jucători. Astfel cea mai
170
Inteligenţă Artificială. Tehnici.
mare valoare va reprezenta șansa de a câștiga cea mai mare pentru un jucător
în timp ce cea mai mică valoare va defini şansa de a câștiga a oponentului.
(3) Deoarece unul din cei doi jucători va tinde sa obțină poziţia cu cea mai mare
valoare iar cel de al doilea poziţia cu valoarea cea mai mică, cei doi jucători pot
fi numiți MAX şi MIN. Ori de câte ori MAX este la mutare va alege mutarea
care maximizează valoarea obţinuta din evaluarea funcţiei euristice ce
caracterizează poziţia, iar în opoziţie MIN va alege mutarea care minimizează
valoarea
(4) Fiind date valorile de pe nivelul cel mai de jos al arborelui de căutare, strategia
minimax va determina valorile pentru toate celelalte poziţii din arborele de
căutare
Principiul este ilustrat de figura de mai jos cu următoarele observații:
- MAX poate fi identificat cu “Noi” (sau “Ei”) iar MIN cu “Ei” (sau “Noi”)
- Denumirea de valori statice provine din faptul că ele se obţin printr-o
evaluare statică a funcţiei de evaluare în contrast cu valorile care sunt
obţinute dinamic prin propagarea valorilor statice în sus în arbore.
- Valorile nodurilor interne pot fi calculate nivel cu nivel de jos în sus pana
când nodul rădăcina este atins. Valoarea ataşată nodului rădăcina este 4 şi în
concordanţă cu strategia minimax cea mai buna mutare a lui MAX aflat în
poziţia a este a – b. Cea mai buna mutare cu care poate replica MIN este b –
d s.a.m.d. Aceasta secvența de mişcări poarta denumirea de variațiunea
principala. Aceasta defineşte mişcările optimale minimax pentru ambele
tabere.
171
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor este data de un obiect
compus unde apar două elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
172
Inteligenţă Artificială. Tehnici.
evalueaza_si_alege([Mutare|RestMutări],Pozitie,Adancime,MaxMin,
Record,MutareSelectata):-
muta(Mutare,Pozitie,PozitieNoua),
minimax(Adancime, PozitieNoua,MaxMin,Mutare,Valoare),
actualizez(Mutare,Valoare,Record,Record1),
evalueaza_si_alege(Mutări,Pozitie,Adancime,MaxMin,Record1,MutareSelectata).
minimax(0,Pozitie,MaxMin,_,Valoare):-
estimeza_valoarea_pozitiei(Pozitie,ValoarePozitie),
Valoare = ValoarePozitie * MaxMin.
minimax(Adancime,Pozitie,MaxMin,Mutare,Valoare):-
Adancime >0,
findall(M,mut(Pozitie,M),ListaMutări),
Adancime1 = Adancime -1,
MinMax = -MaxMin,
evalueaza_si_alege(ListaMutări,Pozitie, Adancime1,MinMax,p(nil,-1000),Mutare).
actualizez(_,Val,p(Mutare1,Val1),p(Mutare1,Val1))) :-
Val<=Val1,!.
actualizez(Mutare,Val,p(_,Val1),p(Mutare,Val))) :-
Val>Val1,!.
173
Inteligenţă Artificială. Tehnici.
- Alfa (α) este cea mai buna valoare pe care o poate alege MAX găsită pana
Beta (β) este valoarea maximă pe care MAX o poate obţine. Cu alte cuvinte:
(α) Scorul minim pe care jucătorul MAX poate sa-l atingă garantat
împotriva adversarului.
- Din punct de vedere a lui MIN, Beta (β) este cea mai rea valoare pe care o
poate obţine pe care o poate alege MIN găsită pana în momentul curent
pentru orice alegere dea lungul căi de configuraţii, Beta (β)este cea mai
buna valoare pe care o poate alege MIN găsită pana în momentul curent
174
Inteligenţă Artificială. Tehnici.
pentru orice alegere dea lungul căi de configuraţii, iar Alpha (α) valoarea
(α) Scorul cel mai bun pe care jucătorul MIN poate spera sa-l
atingă
împotriva adversarului.
- cheia algoritmului Alpha-beta este găsirea unei mutări suficient de buna (nu
trebuie sa fie cea mai buna în mod necesar), pentru a lua o decizie corecta.
Astfel valoarea poziţiei curente (v) trebuie sa fie între Alpha şi Beta,
V >= β
- dacă la mutare este MIN, iar valoarea găsită este mai mică decât Alpha
V <= α
α cu – β
β cu - α
MIN devine practic jucătorul maximizat iar MAX jucătorul minimizat
Principiul de funcţionare a strategiei poate fi ilustrat astfel:
175
Inteligenţă Artificială. Tehnici.
Principiul Alpha_Beta
α este cea mai buna mutare
pentru MAX pe ramura curentă.
Dacă v este o mutare mai
slaba pentru MAX comparativ,
cu α, MAX nu o va atinge
niciodata, ramura care conduce
la ea fiind tăiată
Se defineste similar β pentru
MIN
Operatia de taiere poate reduce
cu 40 % spaţiul de căutare
(1)
Se generează toți succesorii pentru nodul cel mai din stânga şi se calculează
funcţia de evaluare., obţinându-se 5 respectiv 7. Deoarece MIN este la mutare se
176
Inteligenţă Artificială. Tehnici.
(2)
Se generează toți succesorii pentru nodul cel mai din stânga şi se calculează
funcţia de evaluare. obţinându-se 6 respectiv 3. Deoarece MAX este la mutare se
(A)
177
Inteligenţă Artificială. Tehnici.
(B)
(C)
Pentru exemplul dat la strategia minimax, utilizarea lui Alpha_Beta conduce la
următoarele operații de tăiere în arborele de joc:
178
Inteligenţă Artificială. Tehnici.
Structura unei configuraţii (alternative) din spaţiul stărilor este data de un obiect
compus unde apar doua elemente: configuraţia propriu zisa şi valoarea estimatorului
euristic corespunzătoare configuraţiei respective. Ca urmare vom avea:
179
Inteligenţă Artificială. Tehnici.
180
Inteligenţă Artificială. Tehnici.
Deterministic Șansă
Indiferent de natura jocului în prezent funcția de evaluare a poziției de joc este dat
de o funcție de forma
181
Inteligenţă Artificială. Tehnici.
În cele ce urmează vom prezenta câteva jocuri și vom arăta modul în care se
construiește funcția de evaluare a poziției curente a jocului în cauză.
182
Inteligenţă Artificială. Tehnici.
Observații
(1) Deşi pare un joc simplu spaţiul stărilor este foarte mare. La prima mutare sunt 9
răspunsuri posibile, la cea de a doua 8 răspunsuri posibile, samd. Ca urmare arborele
de joc are 9 x 8 x 7 x …. ..x 2 x 1 = 9! Deci 15120 stări.
Faptul că apare un fenomen de simetrie ( de exemplu în prima mișcare pot pune în
colt, în mijloc, sau în centrul unei laturi) spaţiul stărilor are un număr mai mic de stări,
dar care este încă considerabil. De exemplu:
183
Inteligenţă Artificială. Tehnici.
184
Inteligenţă Artificială. Tehnici.
Predicate
poziţie(pozitie,pozitie) mut(pozitie,piesa,pozitie)
apartine(element,poziţie) update(element,poziţie,poziţie)
Tinta
? P is [p(o,1,1),p(l,2,1),p(l,3,1),
p(l,1,2),p(l,2,2),p(l,3,2),
p(l,1,3),p(x,2,3),p(l,3,3)],
pozitie(P,P1),write(P1).
*/
pozitie(P,P1) :-
mut(P,x,Mutări),
apartine(Mutare,Mutări),
update(Mutare,P,P1).
mut([],_,[]).
mut([p(P,X,Y)|Rest],x,[p(x,X,Y)|Rx]) :-
P is l,
mut(Rest,x,Rx),!.
mut([_|Rest],x,Rx) :-
mut(Rest,x,Rx).
update(p(OX,X,Y),[p(P,X1,Y1)|Rp],[p(P,X1,Y1)|Rp1]) :-
X<>X1,
update(p(OX,X,Y),Rp,Rp1),!;
Y<>Y1,
update(p(OX,X,Y),Rp,Rp1),!.
185
Inteligenţă Artificială. Tehnici.
update(p(OX,X,Y),[p(l,X1,Y1)|Rp],[p(OX,X,Y)|Rp]) :-
X1 is X, Y1 is Y.
apartine(X,[X|_]).
apartine(X,[_|R]) :-
apartine(X,R).
2. Apoi urmează faza 2, de mutare a pieselor. O piesă se poate muta doar pe poziţiile
vecine, adică poziţiile legate cu linie de poziţia curentă.
3. Când un jucător rămâne doar cu 3 piese pe tablă, trece în faza a treia a jocului. În
această fază, jucătorul are voie să mute oriunde, nu doar în poziţiile vecine.
Când un jucător reuşeşte să-şi pună 3 piese în linie (poziţiile pieselor să fie legate
prin linii pe tabla de joc), se spune că acesta a închis o moară.
Când un jucător închide o moară, are dreptul sa-i captureze celuilalt jucător o
piesă.
Nu este voie să se captureze piese aflate în moară. Dacă un jucător închide o
moară şi toate piesele celuilalt jucător se află în câte o moară închisa, jocul se continuă,
nu se va scoate nici o piesă.
Scopul final al jocului este capturarea pieselor adversarului până acesta rămâne
doar cu 2 piese.
Un jucător câştigă atunci când adversarul rămâne cu numai 2 piese pe tablă sau
când toate piesele adversarului sunt blocate (când adversarul nu mai poate muta).
186
Inteligenţă Artificială. Tehnici.
B. Structura estimatorului
I. Este evident faptul că la calcularea punctajului unei configuraţii de joc trebuie privit
din prisma ambilor jucători. O configuraţie care este foarte bună pentru unul din
jucători, este, evident, nefavorabilă pentru celălalt jucător. Valoarea
estimatorului trebuie să indice în primul rând de partea cui este avantajul. De
aceea, în funcţiile de căutare în spaţiul soluţiilor, s-a recurs la notarea jucătorilor
cu Min şi Max. O valoare foarte mică (sau negativă, în funcţie de implementare)
este favorabilă pentru Min, iar una foarte mare (sau pozitivă) este favorabilă
pentru Max. Astfel, pentru fiecare jucător se va aplica aceeaşi funcţie de
evaluare a configuraţiei. Bineînţeles că pentru fiecare jucător în parte se va ţine
cont de piesele sale şi de relaţiile existente între piese. Calcularea punctajului
asociat unei configuraţii se face deci din două părţi. Să presupunem că primul
jucător este cel pentru care se doreşte găsirea unei mutări bune şi îl vom
considera pe acesta jucătorul Max. Prin urmare, se va calcula funcţia de
evaluare pentru Max (să o notăm EstimMax), iar apoi se calculează pentru Min
(notată EstimMin). Deoarece folosesc aceeaşi funcţie de estimare, este clar că
şi EstimMax şi EstimMin vor avea valori mari pozitive. Dacă EstimMax este mai
mare decât EstimMin, Max este în avantaj. Dacă EstimMin este mai mare,
atunci Min este în avntaj.
187
Inteligenţă Artificială. Tehnici.
III. În contextul jocului Moara sunt importante relațiile dintre piese.. Spre
exemplu o relaţie poate fi « «numărul de piese blocate », iar o altă relaţie
poate fi « moară închisă » reprezentând 3 piese ale aceluiaşi jucător aşezate
în linie. Ponderea unei relaţii este coeficientul sau punctajul asociat relaţiei
respective.
Prin urmare o funcţie de evaluare se stabileşte în doi paşi.
- În primul pas se aleg cu atenţie relaţiile considerate relevante pentru
jocul respectiv (pentru faza jocului) iar
- în pasul al doilea i se asociază un coeficient fiecărei relaţii.
188
Inteligenţă Artificială. Tehnici.
că unele apar în două etape, unele apar chiar în toate trei etapele, dar vor
avea asociate punctaje (ponderi) diferite în funcţie de etapa jocului.
189
Inteligenţă Artificială. Tehnici.
Moară deschisă – la acel pas se deschide moara; s-a dovedit important ca PC-ul să
ştie că este necesar să şi deschidă mori. Fără această relaţie, jucătorul calculator avea
tendinţa să nu mai deschidă o moară odată închisă, deoarece punctajul scădea. Nu este
în regulă să menţină morile închise deoarece astfel nu poate evolua. (relaţia poate lua
valoarea 0 – jucătorul nu a deschis o moară sau 1 – jucătorul a deschis o moară).
Moară dublă sau moară în vânt – două mori apropiate, iar o piesă poate face parte
din ambele astfel încât prin deschiderea unei mori, se închide cealaltă şi tot aşa. În
exemplul din Figura 7.1.1 (c), verdele are o structură de moară dublă.
Configuraţie de câştig – jucătorul care primeşte punctajul asociat acestei relaţii este
câştigător; poate lua valoarea 0 sau 1.
Spre exemplu configuraţia de 3 piese (Number of 3 pieces configuraţion) apare şi în
faza întâi şi în faza a treia dar cel mai probabil vor avea asociate punctaje diferite.
190
Inteligenţă Artificială. Tehnici.
191
Inteligenţă Artificială. Tehnici.
Pentru fiecare jucător în parte este necesar să se cunoască ce relaţii există pe tabla
de joc, de aceea pentru o configuraţie se vor salva două seturi de variabile
corespunzătoare relaţiilor. Să luăm spre exemplu cazul din figura 14.1.2.
Pentru jucătorul verde vom avea valorile relaţiilor:
Numărul morilor = 1
Numărul pieselor adverse blocate = 1 (portocalie încercuită cu verde)
Nr. de config. cu 3 piese = 1
Număr de piese = 6 (ale jucătorului verde)
Restul relaţiilor pentru jucătorul verde vor avea valoarea 0.
Pentru jucătorul portocaliu vom avea valorile relaţiilor:
Numărul morilor = 1
Nr. de config. cu 2 piese = 1 (cele două piese în linie unde se poate închide o
moară prin plasarea unei piese)
Număr de piese = 5 (ale jucătorului portocaliu)
Restul relaţiilor pentru jucătorul portocaliu vor avea valoarea 0.
192
Inteligenţă Artificială. Tehnici.
193
Inteligenţă Artificială. Tehnici.
Toţi jucătorii vor căuta asociaţii de genul blocarea pieselor adversarului sau
închiderea unei mori, însă importanța acestora diferă în ochii jucătorilor.
Importanța se traduce prin coeficienţi. Prin urmare, modul de joc al
calculatorului va fi influenţat în mod definitiv de aceşti coeficienţi.
În prima fază a jocului, se pot defini în mod logic două moduri de joc: ofensiv şi
defensiv, prin atribuirea de coeficienţi relaţiilor. Aceasta se realizează prin mai multe
încercări şi ajustări. Se plecă de la ideea că fiecare mod de joc se axează pe 2-3 relaţii
pe care le vede importante şi cărora li se atribuie un punctaj mare, iar celelalte relaţii au
asociat un punctaj mai mic, uneori chiar şi 0 (neutralizarea unei relaţii – nu se mai ţine
cont de ea). Pentru modul defensiv, se atribuie punctaj mare relaţiilor: număr total de
piese, piese oponent blocate şi moară închisă. Pentru modul ofensiv se atribuie punctaj
mare relaţiilor: moară închisă, moară dublă. O altă diferenţiere se face la nivelul
configuraţiei câştigătoare. Pentru modul defensiv se încearcă câştigarea meciului din
faza a doua (înainte ca jucătorul să rămână doar cu 3 piese pe tablă), în timp ce jucătorul
ofensiv cel mai probabil va ajunge în faza a treia, datorită modului de joc. Distincţia se
face astfel: relaţia de configuraţie câştigătoare în modul defensiv (de exemplu) are
asociată ponderea 1200 în faza doi şi 1000 în faza trei; în modul ofensiv are asociată
ponderea 1000 în faza doi şi 1200 în faza trei.
Una din cele mai utilizate funcții evaluare a poziției curente de joc este de forma
F(n) = c1 * valoare piese + c2 * mobilitate + c3 * siguranță rege +
c4 * control centru tablă + ...
de exemplu
F (n) = 9(Q-Q') + 5(R-R') + 3(B-B'+N-N') + (P-P') - 0.5(D-D'+S-S'+I-I') + 0.1(M-M') + ...
în care
Q, R, B, N, P sunt numărul (sau valoarea ) pentru ture, nebuni, cai, și pioni de pe
tabla de șah. Cu Q se notează numărul de regine . Piesele au culoare albă Q, R,
B, N, P respectiv culoare neagră Q', R', B', N', P'. În prezent cea mai utilizată
contorizare a valorii pieselor este dată în continuare
194
Inteligenţă Artificială. Tehnici.
Un alt aspect care trebuie luat în considerare este legat de valoarea de schimb a
pieselor. Această valoare de schimb apare în momentul în care se iau piese (o
piesă sau se sacrifică 2 sau mai multe piese minore pentru eliminarea unei piese
de valoare mai mare de pe tablă) În această situație este necesar de cuantizat
dacă poziția care se obține în perspectivă ( după două sau mai multe mutări ) este
mai bună decât ca din momentul începerii schimbului ( mai bun însemnând o
funcție de evaluare a poziției de joc mai mare valoric).
Remarcă
195
Inteligenţă Artificială. Tehnici.
196
15. Calcul evoluționist. Algoritmi genetici.
15.1. Istoric
Ideea de calcul evolutiv a fost introdus în 1960 de către I. Rechenberg în
lucrarea sa "Evolution strategies" (Evolutionsstrategie: Optimierung technischer
Systeme nach Prinzipien der biologischen Evolution). Ideea a reprezentat un alt
punct de vedere în tehnologia informației, prin aceea că la construirea strategiilor
specifice tehnologiei calculatoarelor se pleacă de la exemplele pe care lumea
biologică le prezintă.
Genetic Algorithms (GA) a fost inventat de John Holland și dezvoltat de el și
colegii săi. În 1975 acesta publică cartea "Adaption in Natural and Artificial
Systems".
În 1992 John Koza a folosit conceptul de algoritm genetic pentru a construi
programe care să poată evolua. Metoda propusă a numit-o "Genetic Programming"
(GP).
Concepte biologice
Toate organismele vii constau din celule. In fiecare celulă există același set de
cromozomi. Cromozomii sunt șiruri de ADN (DNA - Deoxyribonucleic acid) și
servesc ca model pentru întregul organism.
Un cromozom constă din gene, blocuri de ADN. O genă este o secvenţă a ADN-ului
care conţine instrucţiunile necesare sintezei unei anumite proteine. Practic se poate
spune, că fiecare genă codifică o trăsătură, de exemplu culoarea ochilor. Fiecare genă
195
are propria poziție în cromozom. Setul complet de material genetic (toți cromozomi)
este numit genom. Un set specific de gene în genomul este numit genotip. Genotipul
asociat cu dezvoltarea organismului (influența mediului în care se dezvoltă
organismul), după naștere definește phenotype organismului, respectiv
caracteristicile sale fizice și psihice, (cum ar fi culoarea ochilor, inteligență etc.). S-a
constatat că "setul de instrucţiuni" uman nu conţine decât în jur de 35000 de gene.
Genomul uman reprezintă practic totalitatea informației genetice stocată în ADN.
Spațiul tuturor soluțiilor posibile sau nu poartă numele de search space sau
spațiul stărilor. În acest spațiu o soluție posibilă este reprezentată de un
punct.
Fiecare soluție posibilă este caracterizată de o valoare care spune cât de bună
este soluția respectivă. Această valoare poartă numele de fitness.
Operația de căutare presupune găsirea unui extrem (minim sau maxim) în
spațiul stărilor. Spațiul stărilor poate fi cunoscut în totalitate (situație mai rar
întâlnită) sau numai parțial, situație care este cea care apare în majoritatea
cazurilor. Practic spațiul se generează pe măsură ce se avansează cu procesul
de căutare.
Exemplu de search
space
196
Problemele de căutare în spațiul stărilor pot fi foarte complicate deoarece nu se
cunoaște unde este prezentă soluția și de asemenea nu cunoaștem care este cel mai
bun punct din spațiul stărilor de unde putem începe operația de căutare. Există multe
metode de căutare care încearcă să optimizeze acest proces. Acestea vor găsi cea
mai adecvată soluție într-un context dat și în foarte puține cazuri se obține cea mai
bună soluție. Dintre acești algoritmi amintim hill climbing, A* și algoritmi genetici.
Soluțiile găsite prin aceste metode sunt adesea considerate ca fiind cea mai bună
soluție, deoarece în mod real este imposibil de cunoscut care este optimul real.
197
măsuri de potrivire (fitness). Pentru crearea următoarei populaţii cei mai buni
cromozomi din generaţia (populaţia) curentă sunt selectaţi şi noii cromozomi
sunt formaţii folosind unul dintre cei trei operatori genetici esenţiali: selecţia,
crossover şi mutaţia.
Terminologie.
Algoritmii evolutivi utilizează un vocabular împrumutat din genetica:
soluția candidat poarta numele de cromozom și este reprezentată ca un șir
de gene;
Un cromozom este compus din gene – variabile a problemei de optimizat
198
cromozomul asupra căruia se aplica un operator genetic se numește părinte
iar cromozomul rezultat se numește descendent (copil);
selecția este procedura prin care sunt aleși cromozomii ce vor supraviețui in
generația următoare; indivizilor mai bine adaptați li se vor da șanse mai mari;
gradul de adaptare la mediu este măsurat de funcția fitness. Practic funcția
fitness este utilizata pentru a măsura calitatea cromozomilor. Este formulata
plecând de la funcția numerica de optimizat. Este cunoscută și sub denumirea
de funcție de adaptare;
soluția returnata de un algoritm genetic este cel mai bun individ din ultima
generație.
199
Start
generație=0
GENEREAZĂ populația inițială
EVALUEAZĂ indivizii din populația inițială
REPETĂ
ÎMPERECHEAZĂ părinții
RECOMBINĂ părinții și generează moștenitori
APLICĂ MUTAȚII cu o probabilitate predefinită
EVALUEAZĂ indivizii
SELECTEAZĂ indivizii pentru generația următoare
generație = generație + 1
PÂNĂ CÂND condiția de terminare este satisfăcută
Stop
200
15.3. Exemplu numeric
a b c d
Pentru a mări viteza de calcul se vor restricționa valorile pe care le pot lua aceste variabile a,
b, c, și d la intervalul [0, 30]. Vom considera că în acest interval se iau numai valori întregi.
Pasul 1. Inițializare
Presupunem că populația inițială are un număr de 6 cromozomi. Vom genera
valori aleatoare pentru genele a, b, c, d pentru un număr de 6 cromozomi. Se va utiliza
un generator de numere aleatoare, uniform distribuite în intervalul [0, 30]. Obținem:
Pasul 2. Evaluare
Se calculează funcția obiectiv pentru fiecare cromozom definit în
pasul de inițializare:
F _ obj 1 abs 12 2*05 3*23 4*08 30 abs 123 30 93
F _ obj 5 abs 01 2*04 3*13 4*19 30 abs 124 30 94
Pasul 3. Selecție
1. În acest pas se selectează cei mai buni cromozomi pentru următoarea generație. Cei
mai buni înseamnă că respectivii cromozomi sunt cel mai bine adaptați la mediu..Acest
aspect care este măsurat de funcția de fitness care va defini probabilitatea de
adaptare la mediu. Pentru acest caz funcția de fitness este de forma
1
Fitness i i 1,6
1 F _ obj i
1 1 1 1
Fitness 1 0.0106 Fitness 2 0.0123
1 F _ obj 1 94 1 F _ obj 2 81
1 1 1 1
Fitness 3 0.0119 Fitness 4 0.0213
1 F _ obj 3 84 1 F _ obj 4 47
1 1 1 1
Fitness 5 0.0105 Fitness 6 0.0179
1 F _ obj 5 95 1 F _ obj 6 56
Fitness i
P i i 1,6
Total
202
0.0106 0.0123
P 1 0.1254 P 2 0.1456
0.0845 0.0845
0.0119 0.0213
P 3 0.1408 P 4 0.2521
0.0845 0.0845
0.0105 0.0179
P 5 0.1243 P 6 0.2118
0.0845 0.0845
Din probabilitățile calculate mai sus se observă că Cromozomul 4 prezintă cea mai
mare funcție fitness, deci acest cromozom prezintă cea mai mare probabilitate de a fi
selectat pentru următoarea generație de cromozomi. Pentru procesul de selecție se va
utiliza o ruletă. Pentru inițializarea acestui proces se va calcula probabilitatea
cumulativă. Vom avea:
c 1 0.1254
c 2 0.1254 0.1456 0.2710
c 3 = 0.1254 0.1456 0.1408 0.4118
c 4 0.1254 0.1456 0.1408 0.2521 0.6639
c 5 0.1254 0.1456 0.1408 0.2521 0.1243 0.7882
c 6 0.1254 0.1456 0.1408 0.2521 0.1243 0.2118 1.0
203
În acest scop se procedează la generarea unor numere uniform repartizate în
intervalul [0, 1]. Presupunem că s-au generat numerele R[1] = 0.201, R[2] = 0.284 ,
R[3] = 0.099 , R[4] = 0.822 , R[5] = 0.398 , R[6] = 0.501
NewChromosome[1] = Chromosome[2]
NewChromosome[2] = Chromosome[3]
NewChromosome[3] = Chromosome[1]
NewChromosome[4] = Chromosome[6]
NewChromosome[5] = Chromosome[3]
NewChromosome[6] = Chromosome[4]
Pasul 4. Crossover
În această etapă se vor genera noi cromozomi plecând de la 2 cromozomi
părinți. Tehnica utilizată este crossover cu un singur punct de tăiere (vezi figura
următoare).
204
Cromozomii părinți care sunt implicați în procesul de generare a noi cromozomi vor fi
selectați aleator din setul de cromozomi părinți existenți, utilizând un parametru de tip
crossover_rate (ρc) parameters. Pseudo codul pentru procesul de selecție este
următorul:
begin
k 0;
while k population do
R k random 0 1 ;
if ( R k ρc) then select
Chromosome k as parent;
end ;
k k 1;
end ;
end ;
R[1] = 0.191 , R[2] = 0.259 , R[3] = 0.760 , R[4] = 0.006 , R[5] = 0.159 , R[6] = 0.340
Pentru numerele aleatoare de mai sus părinții sunt Chromosome [1], Chromosome [4]
și Chromosome [5] care vor fi selectați pentru crossover
Chromosome[1] = [02;05;17;01]
Chromosome[2] = [10;04;13;14]
Chromosome[3] = [12;05;23;08]
Chromosome[4] = [20;04;13;14]
Chromosome[5] = [10;04;18;03]
Chromosome[6] = [20;01;10;06]
Pasul 5. Mutație
Numărul de cromozomi care au mutații din populație este determinată de rata
( frecvența ) de mutație. O notăm cu rate(pm). Procesul de mutație presupune
înlocuirea valorii unei gene cu o altă valoare. Procesul se desfășoară astfel: În
primul pas se calculează lungimea genelor din populație. În acest caz lungimea totală a
genelor este
Chromosome[1] = [02;05;17;01]
Chromosome[2] = [10;04;13;14]
Chromosome[3] = [12;05;23;02]
Chromosome[4] = [20;04;13;14]
Chromosome[5] = [10;05;18;03]
Chromosome[6] = [20;01;10;06]
Prin terminarea procesului de mutație s-a finalizat o iterație de evoluție în care s-a
generat un nou set de cromozomi. Pentru acest nou set se poate recalcula funcția
obiectiv
Chromosome[1] = [02;05;17;01]
Chromosome[2] = [10;04;13;14]
Chromosome[3] = [12;05;23;02]
Chromosome[4] = [20;04;13;14]
Chromosome[5] = [10;05;18;03]
Chromosome[6] = [20;01;10;06]
Acești noi Cromozomi vor intra într-un proces similar celui prin care au trecut Cromozomii
din anterioara generație, format din evaluare, selecție, crossover și mutație, proces care se
va încheia prin generarea unei noi generații de Cromozomi într-o nouă iterație. Acest
proces se va repeta pentru un număr determinat de iterații. Pentru acest exemplu , după
rularea unui număr de 50 iterații cel mai bun Cromozom care se obține este:
I.Codificarea binară.
208
Este varianta clasică. În acest caz cromozomii sunt vectori cu elemente din {0,1}
iar spaţiul de căutare este S = {0, l} , cu n numărul de gene (n este corelat cu
dimensiunea problemei). Este adecvată pentru problemele de optimizare
combinatorială (jocuri) în care configuraţiile pot fi specificate ca vectori binari. Un
cromozom poate arăta astfel
Fiecare cromozom este deci definit de un șir binar, unde un bit poate reprezenta o
caracteristică a soluției
Exemplul 1.
Problema maximizării numărului de biţi egali cu 1 (ONEMAX problem).
Se pune problema determinării şirului de biţi (xi,... ,xn), xi {0,1n } care
maximizează funcţia
f : 0,1 n — N , f x1 ,... , xn n
j 1
xj
Problema este echivalentă cu a determina configuraţia de biţi care are cele mai multe
elemente egale cu 1. Aceasta este evident (1, ..., 1) problema fiind folosită pentru a testa
algoritmii genetici. Un exemplu este dat în continuare
Exemplul 2.
209
Problema submulţimii de sumă maximă limitată de un prag.
Se consideră o mulţime W = {w1,... ,wn} de valori întregi şi M o valoare întreagă.
Se caută o submulţime S W cu proprietatea că suma elementelor lui S este cât mai
apropiată de M dar nu îl depăşeşte.
Orice submulţime S poate fi reprezentată printr-un vector (s1,s2,..., sn) cu sj = 0
dacă wi S şi sj = 1 dacă wi S.
n
Suma elementelor unei submulţimi S este în acest caz j 1
wi s j
w1 w2 w3 w4 w5 w6 w7 w8
17 40 32 55 4 72 11 6
s1 s2 s3 s4 s5 s6 s7 s8
1 0 0 0 1 0 1 1
Exemplul 3.
Problema rucsacului - Knapsack problem.
Se consideră un set de n obiecte caracterizate prin greutăţile (w1,... ,wn) şi prin
valorile (v1,... ,vn). Se pune problema determinării unui subset de obiecte pentru a fi
introduse într-un rucsac de capacitate C astfel încât valoarea obiectelor selectate să fie
maximă. Un exemplu este dat în continuare.
210
Exemplu de problemă a rucsacului
unidimensională (cu o singură constrângere):
Care cutii ar trebui să fie alese pentru a maximiza cantitatea de
bani în timp ce păstrează încă greutatea totală sub 15 kg?
O soluţie a acestei probleme (în contextul utilizării unui algoritm genetic) poate fi
codificată ca un şir de n valori binare în felul următor: și = 1 dacă obiectul i este
selectat, respectiv și = 0 dacă obiectul nu este selectat.
Obiecte 1 2 3 4 5
Greutăți 70 55 40 15 5
wi
Valori 40 15 5 30 10
Vi
211
constrângerea este: w = 55 + 40 + 5 = 100 ≤ C = 100 (ok), iar
funcţia de adaptare (fitness): v = 15 + 5 + 10 = 30
Exemplul 4.
Problema împachetării
Se consideră
un set de n obiecte caracterizate prin dimensiunile (d1, d2,..., dn) şi
un set de m cutii având capacităţile (c1, c2,..., cm).
212
II.Codificare reală.
Este adecvată pentru problemele de optimizare pe domenii continue (vezi
exemplul 5 următor). In acest caz cromozomii sunt vectori cu elemente reale, fiind
chiar elementele domeniului de definiţie al funcţiei (pentru exemplul următor
cromozomul este chiar x = (6.2945, 5.1548). Avantajul acestei reprezentări este
faptul că este naturală şi nu necesită proceduri speciale de
codificare/decodificare.
Exemplul 5.
Se consideră o funcţie
f : D a1 , b1 x a2 , b2 x.... an , bn R n R
şi se caută x* = (x1*,..., x*n) care minimizează funcţia f (f(x*) < f(x) pentru orice x
D).
f(x1, x2)= x1 + x2
cu
D = [ - 10, 10 ] x [ - 10 10 ]
Cromozom x1 x2
1 6.2945 5.1548
2 8.1158 4.8626
3 -7.4603 -2.1555
4 8.2675 3.1096
5 2.6472 -6.5763
6 -8.0492 4.1209
III.Codificare specifică.
Se alege o variantă cât mai apropiată de specificul problemei.
213
Exemplul 6.
Problema împachetării
În varianta de codificare binară apare dezavantajul că pot fi generate configuraţii
care nu sunt fezabile. Acestea sunt de exemplu matricele care conţin mai multe valori
egale cu 1 pe o linie (aceasta ar însemna că un obiect este simultan inclus în mai multe
cutii). Pentru a evita astfel de situaţii se poate utiliza un alt tip de reprezentare:
un vector cu n componente (s1,..., sn) în care
si {1,..., m} reprezintă cutia în care este inclus obiectul i.
Exemplul 7.
Problema comis-voiajorului
Se consideră un set de n oraşe şi se pune problema găsirii unui traseu care să
treacă o singură dată prin fiecare oraş şi care să aibă costul minim (dacă costul este
proporţional cu lungimea traseului atunci se caută trasee de lungime minimă).
Codificare naturală a unei configuraţii (traseu) este:
- (s1,..., sn) unde și {1, ... , n} reprezintă numărul de ordine al oraşului vizitat
la etapa i (la fiecare etapa comis-voiajorul se află într-un oraş). Pentru a fi
respectată restricţia ca fiecare oraş să fie vizitat o singură dată este necesar
ca elementele vectorului s să fie distincte (si sj pentru orice i j). Astfel
fiecare configuraţie poate fi interpretată ca o permutare de ordin n, motiv
pentru care această codificare este numită şi codificare de tip permutare.
Pentru a folosi analogia dintre procesele de căutare şi cele de evoluţie din natură
este util să se reformuleze problemele de optimizare ca probleme de maximizare (orice
problemă de minimizare poate fi transformată într-una de maximizare prin schimbarea
semnului funcţiei obiectiv).
„ Pentru o problemă de minimizare de forma: să se determine x* D cu proprietatea că
f(x*) < f(x) pentru orice x D, funcţia de adaptare are fi F(x) = -f(x). În cazul unei
probleme de maximizare atunci funcţia de adaptare poate fi chiar funcţia obiectiv.
În procesul de evoluție se folosește conceptul de fitness. Acesta definește cât de
214
departe este de obiectivul urmărit soluția curentă
Exemplul 8.
Problema ONEMAX.
În acest caz funcţia de adaptare coincide cu funcţia obiectiv a problemei,
calitatea unei soluţii fiind reflectată de numărul de componente egale cu 1.
Exemplul 9.
Problema comis-voiajorului.
În acest caz, dacă se foloseşte reprezentarea de tip permutare restricţia
problemei (trecerea o singură dată prin fiecare oraş) este implicit satisfăcută. Dacă
matricea C conţine costurile (c(i, j) reprezintă costul trecerii de la oraşul i la oraşul j)
atunci funcţia de cost poate fi descrisă prin:
n 1
f s1.............sn c si , si 1 c sn , s1
j 1
15.6. Selecţia
Selecţia are ca scop determinarea populaţiei de părinţii care vor fi supuşi
operatorilor genetici de încrucişare şi mutaţie precum şi determinarea elementelor ce
vor face parte din generaţia următoare. Criteriul de selecţie se bazează pe gradul de
adaptare al configuraţiei la cerinţele problemei, exprimat prin valoarea funcţiei fitness.
Nu este obligatoriu ca atât părinţii cât şi supravieţuitorii se fie determinaţi prin
selecţie, fiind posibil ca aceasta să fie folosită doar într-o singură etapă. De exemplu, toţi
indivizii populaţiei curente sunt potenţiali părinţi dar după încrucişare şi mutaţie doar cei
determinaţi prin procesul de selecţie vor supravieţui. Pe de altă parte este posibil ca
părinţi să fie doar indivizii selectaţi iar toţi cei generaţi prin încrucişare şi mutaţie să fie
transferaţi în noua generaţie.
Procesul de selecţie nu depinde de modul de codificare a elementelor populaţiei
fiind însă legat de funcţia de adaptare.
Există mai multe metode de selecţie.
15.6.1. Elitismul
Această modalitate de selecţie presupune că cel mai adaptat individ este copiat
direct în noua populaţie (mai rar primii câţiva cei mai adaptaţi). Aceasta asigură faptul că
215
niciodată nu se va pierde soluţia cea mai bună.
Exemplu 1
Cromozom: 1 2 3 4 5 6
Fitness: 8 2 17 7 4 11
Suma 8 10 27 34 38 49
parţială:
1. Suma este 49
2. Numărul aleator generat N cu distribuție uniformă în intervalul [1 , 49] este : 23
3. Selectat: 3
216
Exemplu 2
Exemplu de folosire a ruletei pentru aflarea maximului funcției
1
f x x2 2x 5
4
în intervalul [0, 10]. Se utilizează un cromozom pe 10 biți. Pe 10 biți
valoarea maximă de reprezentare în baza 10 este 1023. Împărțind valoarea
cromozomului zecimală la 1023 se obține o valoare numerică pentru x în
intervalul 0 – 10 cu zecimale.
Pentru 5 cromozomi avem.
217
Situația înainte de numerotare (graful reprezintă valori fitness)
Algoritm
i. Se ordonează crescător valorile funcţiei de adaptare pentru toate elementele
populaţiei. Se reţin valorile distincte şi li se asociază câte un rang (cea mai mică
valoare are rangul 1, iar cea mai mare are rangul maxim). Se partiţionează
populaţia în grupuri de elemente care au aceeaşi valoare a funcţiei de adaptare şi
li se asociază rangul corespunzător valorii.
Presupunând că sunt k grupuri se construieşte distribuţia de probabilitate:
1 2 .......... i ............. k i
p p ....... p .......... p cu pi
k
1 2 i k
j 1
j
rang i / m 1
pi
m
m
cu α < β valori alese astfel încât p
i 1
i 1 , ceea ce implică α + β = 2 care poate fi
interpretat ca numărul mediu de copii ale celui mai slab element iar / la numărul
218
mediu de copii ale celui mai bun element.
219
b) Selecția pe bază de vârstă
În selecția bazată pe vârstă nu mai apare noțiunea de fitness. Tehnica plecă de
la premisa că fiecare membru al populației poate rămâne și se poate reproduce,
indiferent de valoarea fitness pe care o prezintă un interval de timp determinat. Acest
criteriu de timp poate, de exemplu, fi dat de numărul de generații în care respectivul
membru a fost prezent în populație În exemplul dat în figura următoare cei mai vechi
membrii ai populației sunt P4 și P7. Aceștia sunt eliminați,înlocuiți eventual de copii lor,
iar vârsta pentru restul de membrii se incrementează cu 1.
Tipuri de recombinări:
220
- Recombinare intermediara
- Recombinare liniara
- Recombinare liniara extinsa
221
Încrucişarea uniformă. La construirea fiecărui urmaş se selectează cu probabilitatea p
o genă din primul părinte şi cu probabilitatea 1-p o genă din al doilea părinte.
A. Cazul cel mai natural este cel în care p = 0.5.
Recombinare aritmetică.
Crossoverul aritmetic intermediar combină materialul genetic al părinților P1 și P2
aplicând regulile
VarjU j VarjP1 1 j VarjP 2 j=1,2, ... , Nvar
doilea părinte
α – reprezintă factorul de scalare generat aleator în intervalul [-d , 1+d ].
Uzual d=0.25
222
Aria posibilă a urmașilor apare în figura de mai jos
Exemplificare
Presupunem că cromozomii celor doi părinți sunt de forma
Cromozomi
P1 -1 6
P2 0 -2
Se consideră d=0.25.
- Pentru generarea primului copil C1, s-au generat aleatoriu valorile ponderilor
α 1=1.1 pentru prima variabilă și α 2=0.7 pentru cea de a doua variabilă.
Valorile variabilelor primului copil sunt
Cromozom
C1 -1.1 3.6
223
Cromozom
C2 -0.2 -3.2
Recombinarea liniară
Este similară cu cea intermediară cu deosebirea că se utilizează un singur factor de
scalare α care se generează de asemenea aleatoriu în intervalul [-d , 1+d ].
Relațiile de calcul sunt de forma
doilea părinte
α – reprezintă factorul de scalare generat aleator în intervalul [-d , 1+d ].
Uzual d=0.25
Exemplificare
Presupunem că cromozomii celor doi părinți sunt de forma
Cromozomi
P1 -1 6
P2 0 -2
Se consideră d=0.25.
- Pentru generarea primului copil C1, s-au generat aleatoriu valorile ponderilor
224
α 1=1.1 pentru ambele variabile.
Cromozom
C1 -1. 6.8
Cromozom
C2 -0.2 -0.4
Dacă reluăm formula de recombinare prezentată anterior pentru cazul a doi părinți într-o
formă simplificată vom avea
Copil1 gx 1 gy
Copil2 gx 1 gy
Atunci pentru α=0.5 cei doi copii vor fi identici, aspect care poate fi văzut în imaginea de
mai jos
225
15.8. Mutaţia
Mutaţia realizează mici schimbări aleatoare în una sau mai multe variabile ale
individului supus mutaţiei. În felul acesta este asigurată diversitatea populaţiei.
Trebuie definite:
- Probabilitatea ca o variabila sa sufere o mutație(rata de mutație)
o Este invers proporționala cu numărul variabilelor
o O valoare optima se poate considera 1/Nvar
o o singura variabila a unui individ suferă procesul de mutație
- Valoarea schimbării variabilei prin procesul de mutație
ii. O altă variantă este aceea în care toate genele se consideră ca făcând parte din
aceeaşi structură şi pentru fiecare dintre ele se decide dacă va fi modificată sau nu.
In felul acesta este posibil ca mai multe gene din cadrul unui cromozom să fie
modificate. În cazul codificării de tip permutare mutaţia cea mai simplă constă în
schimbarea poziţiei a două elemente. De exemplu de la configuraţia (D, C, F, A, B, E,
G) se ajunge la configuraţia (D, C, E, A, B, F, G) prin interschimbarea elementelor de
pe poziţiile 3 şi 6.
iii. Mutația uniformă modifică valoarea unor gene alese aleatoriu.
Cromozomul c = (c(1), c(2),..., c(k),..., c(LIND)) este transformat în
cm = (c(1), c(2),..., cm(k),..., c(LIND)).
226
Gena cm(k) va fi selectată în mod aleator din intervalul [c(k)-a; c(k)+a], a>0. Şi
operatorul de mutaţie este aplicat cu o probabilitate notată cu pm, care trebuie să fie
mică, de exemplu între 0.01 - 0.03.
Exemplificare
50
scale50 1 1 1 0.5
100
domeniul de valori este [-10; 10] d1=d2=20
Cromozom
Părinte -3 1
227
r1 0.05 Var1C 3 0,05 20 0.5 2.5
r1 0.2 Var2C 1 0.2 20 0.5 1
Cromozom
Părinte -2.5 -1
Î n contextul realizării unui joc strategic, este necesar să fie rezolvate două
probleme:
• alegerea unor algoritmi de căutare eficienţi (algoritmii de căutare în spaţiul
stărilor sunt preluaţi din teoria jocurilor) şi
• găsirea unei funcţii/unor funcţii eficiente pentru jucătorul calculator (este
abordată prin utilizarea algoritmilor genetici).
6. In general estimatorul este compus din 3 funcţii de evaluare, câte una pentru
fiecare fază a jocului; este necesară această diferenţiere, deoarece relaţii între piese
ce sunt importante în faza 1 pot să nu fie relevante în faza 2 sau 3.
230
10 şi vrem să obţinem 40 de fii,funcţia de fitness va atribui fiecărui părinte o valoare ce
reprezintă numărul de încrucișări la care va lua parte
La pasul 4 În acest pas, folosindu-se funcţia de fitness de mai sus, se generează
cei 40 de membrii ai noii generaţii. Fiecare estimator va avea asociată o variabilă care
atestă posibilitatea acestuia de a participa la încrucişare. După fiecare încrucişare se
decrementează valoarea. Când se ajunge la 0, cromozomul respectiv nu mai are
dreptul la încrucişare. Cromozomii părinţi (estimatorii) sunt generaţi aleator. După ce
participă la o încrucişare, se decrementează variabila asociată ce ne informează
asupra posibilităţii de încrucişare. Dacă se generează aleator un cromozom care nu
mai are dreptul să participe, se va genera altul şi în cazul unui nou eşec, se verifică pe
rând pentru fiecare estimator variabila (posibilitatea de încrucișare) şi se ia primul găsit
pentru care valoarea acelei variabile este mai mare decât 0.
Pentru încrucişare, se utilizează de obicei un algoritmul genetic cu un punct de
tăiere. Se generează aleator un punct şi se interschimbă şirurile de coeficienţi ai celor
doi estimatori părinţi.
Pasul 5 arată punerea împreună a părinţilor şi fiilor pentru a forma noua
generaţie. La estimatorii rezultaţi se aplică aleator mutaţia, un factor important al
procesului de evoluţie care asigură varietate. Mutaţia poate apărea la spre exemplu la
5% din membrii generaţiei şi constă din alterarea unei gene, dar alterarea să fie mică. În
cazul nostru, vom acţiona prin modificarea mică (cu câteva unităţi) a câte unui coeficient
(un coeficient este echivalent cu o genă în cazul nostru) la 2 sau 3 fii din cei 40.
232
16. CALCULUL EVOLUȚIONIST
Furnicile în natură
În principiu, algoritmul se bazează pe faptul că furnicile călătoresc la întâmplare. În
momentul în care ele găsesc o sursă de hrană, marchează drumul până la colonie cu
feromoni. Studiile au arătat că acest lucru este posibil datorită unei substanţe, numită
233
feromon, cu care furnicile marchează traseul pe care îl urmează. O furnică lasă o urmă
de feromon pe unde circulă şi este influenţată de mirosul de feromon lăsat de alte
furnici. Feromonul este supus, odată cu trecerea timpului, fenomenului de evaporare.
Studiile au arătat că dacă pe traseul dintre muşuroi (N) si sursa de hrană (F) se
plasează un obstacol, după un timp toate furnicile îl vor ocoli pe drumul cel mai scurt.
Explicaţia este următoarea: când primele furnici ajung la obstacol ele aleg sa îl
ocolească prin partea stângă sau prin partea dreaptă cu o probabilitate egală. La
întoarcere mirosul de feromon de pe traseul mai lung este mai slab decât cel de pe
traseul mai scurt datorita fenomenului de evaporare. Prin urmare mai multe furnici vor
urma calea mai scurtă. După un anumit număr de ture efectuate între cele două
destinaţii, toate furnicile se vor deplasa pe traseul cel mai scurt.
Modelul presupune:
Datele de intrare ale problemei corespund grafului asociat problemei
combinatoriale și a costurilor acestor drumuri (matricea de costuri).
Se folosește o populație de m furnici plasate inițial aleator în noduri (se poate
considera că toate furnicile sunt inițial plasate în același nod – de exemplu în
primul nod).
La fiecare generație, fiecare furnică efectuează n deplasări între noduri. Furnicile
memorează nodurile vizitate astfel încât să nu treacă de două ori prin același
nod. Trecerea furnicii k din nodul i în nodul j, la etapa t, se bazează pe
distribuția de probabilitate:
ijij
j nu a fost vizita
Pt k i, j il il
lN i , k
0 j a fost vizitat
235
- cost(Tk) reprezintă costul traseului.
2. ηij modelează informația locală privind calitatea arcului; cea mai simplă variantă
este când ηij este invers proporțional cu costul arcului (i,j)
Funcție de valoarea acestor doi parametrii furnicile vor fi ori orientate mai mult:
spre a găsi noi surse de hrană și mai puțin spre exploatarea surselor deja
existente fie
3. N(i,k) reprezintă lista vecinilor nodului i care nu au fost încă vizitați de către furnica k
Vom studia în continuare, cum un proces similar poate fi utilizat într-o lume
locuită de furnici artificiale care să încerce să rezolve problema comis-voiajorului.
Problema comis-voiajorului (TSP) este problema găsirii celui mai scurt tur închis care
vizitează toate oraşele dintr-un set dat. Se consideră problema TSP restricţionată la
cazul în care, oraşele se află situate într-un plan şi există o cale între fiecare două oraşe
(graful TSP este complet conectat).
236
Algoritmul Ant Colony Optimization (ACO) pentru TSP
Presupunem că avem o problem de tip TSP cu 5 orașe. Distanța dintre orașe este dată
de următoarea matrice
0 10 12 11 14
10 0 13 15 8
D 12 13 0 9 14
11 15 9 9 16
14 8 14 16 0
Se cere determinarea celei mai bune rute care are o distanță minimă utilizând ACO
Pasul 1:
Presupunem că numărul de furnici este N=3. Determinăm vizibilitatea (h) între
orașe luând în considerare că acesta este egală cu inversul distanței 1 / d.
Se obține
0 0.1000 0.0833 0.0909 0.0714
0.1000 0 0.0769 0.0667 0.1250
h 0.0833 0.0769 0 0.1111 0.0714
0.0909 0.0667 0.1111 0 0.0625
0.0714 0.1250 0.0714 0.0625 0
237
Pentru fiecare segment între orașe vom considera că feromonul are o valoare
inițială 0 , și presupunem că prezintă aceeași valoare pentru toate segmentele fiind
egală cu 1.
1 1 1 1 1
1 1 1 1 1
o 1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
Pasul 2:
Se determină probabilitatea de a trece de la un oraș la altul. În acest caz
considerăm că orașul 1 este punctul de plecare. Acest aspect, impune ca din ultimul
oraș vizitat să ne reîntoarcem înapoi în orașul 1. Deoarece orașul 1 este ales ca oraș
de plecare el nu va mai putea fi vizitat din nou, astfel că nivelul de vizibilitate a acestui
oraș este setat pe 0.
r , s r , s
dacă s M k
pk r , s
r , u r , u
uM k
0 dacă orasul a fost vizitat
Unde
pk r , s este probabilitatea de mișcare din orașul r spre orașul s a furnicii k
238
r , s este vizibilitatea orașului s din r
s 2,3,4,5
Astfel că probabilitatea ca furnica 1 să meargă din orașul 1 spre unul din celelalte orașe
este dată de relația
1, s 1, s
1 2
p1 1, s
1, s 1, s
1 2
s 2,3,4,5
239
Pasul 3
Se va genera un număr aleatoriu uniform distribuit pentru a determina care oraș
se vizitează prin compararea acestei valori cu probabilitățile cumulate. Presupunem că
generăm numărul r=0.6841. Prin compararea acestuia cu probabilitățile cumulate
observăm că acesta este situat sub valoarea 0.8317. Astfel alegerea furnicii este aceea
de a vizita orașul 4.
Deoarece orașul 4 a fost selectat vizibilitatea acestui oraș pentru furnica 1 se va seta pe
0, astfel încât matricea aferentă va apare de forma
0 0.1000 0.0833 0 0.0714
0 0 0.0769 0 0.1250
h 0 0.0769 0 0 0.0714
0 0.0667 0.1111 0 0.0625
0 0.1250 0.0714 0 0
Se pune din nou problema alegerii următorului oraș ( cu excepția orașului 1 ) spre care
se va efectua deplasarea din orașul 4. Vom avea
4, s 4, s
1 2
=0.0207
s 2,3,5
Astfel că probabilitatea ca furnica 1 să meargă din orașul 4 spre unul din celelalte orașe
este dată de relația
240
4, s 4, s
1 2
p1 4, s
4, s 4, s
1 2
s 2,3,5
r ,s 1 r ,s k 1 k
N
r ,s
241
Pasul 4:
Toate furnicile vor aduna o cantitate suplimentară de feromon la matricea feromonilor în
concordanță cu ruta pe care o parcurg.
Cantitatea depusă este egală r ,s 1/ lenght tour pe fiecare segment care leagă
două orașe
În același timp apare un fenomen de evaporare a feromonului. Evaporarea este
dată de relația r , s 1 r ,s
Pentru cazul prezent avem în acest pas r , s = 1 iar rata de evaporare = 0.5
242
Furnica 3 va aduce un surplus de feromon de 1 / 60 = 0.0167, timp în care reducerea
de feromon datorită evaporării este (1 - 0.5) x 1 = 0.5. Vom obține pentru furnica 3 care
parcurge drumul 1-4-5-2-3-1 următoarea matrice de feromoni.
Albinele în natură
Pentru construirea unui algortm de tip BCO este necesară cunoașterea modului în care
funcționează o colonie de albine:
A. O colonie de albine poate explora un spațiu în care explorează și exploatează resurse
de tip polen / nectar într-o arie circulară cu raza de 10 Km.
B. Sunt exploatate prioritar resursele cele mai bogate. Acestea sunt exploatate de un
număr mare de albine. Zonele mai puțin promițătoare sunt explorate de un număr mai
mic de albine.
1
Pham D.T., Ghanbarzadeh A., Koc E., Otri S., Rahim S., and M.Zaidi. "The Bees Algorithm - A Novel Tool
for Complex Optimisation Problems"", Proceedings of IPROMS 2006 Conference, pp.454-461
2
The Bees Algorithm, and Its Applications, Dr. Ziad Salem, Computer Engineering Department Electrical
and Electronic Engineering Faculty
243
C. Explorarea zonelor se face de către albine cercetaș. Acestea caută aleator, la
întâmplare, surse potențiale de hrană.
E. După depozitarea cantității de hrană (polen, nectar) adusă, albinele merg spre o zonă
de comunicare (dance floor). În această zonă vin albinele care au găsit o sursă de
hrană sau au adus hrană. În această zonă se transmit informații privind calitatea ,
cantitatea și unde se găsește hrană. Este evident faptul că dacă o albină a găsit o
sursă de hrană bogată prin intermediul zonei de comunicare va atrage alte albine.
Acestea după aducerea hranei din zona semnalată vor mobiliza alte albine pentru
exploatarea aceleiași zone, apărând astfel un fenomen de creștere a numărului de
albine care exploatează aceiași zonă.
244
Informațiile se transmit prin intermediul unui dans numit „waggle dance” următoarele
informații:
În acest mod, numărul de albine care exploatează o zonă va depinde de calitatea (fitness)
zonei respective, apărând un fenomen modificare a numărului de albine dinamic funcție de
contextul zonelor care se exploatează. Astfel o zonă poate fi exploatată de mai multe albine
sau poate fi abandonată.
Bees Algorithm (BA) este un algoritm de optimizare care se inspiră din modul în care
albinele caută hrană pentru a găsi o soluție optimă. În pseudocod algoritmul are aspectul
245
Exemplu: Găsirea optimului unei funcții matematice.
246
2. Se evaluează calitatea (fitness-ul) zonelor vizitate de albine. Valorile obținute prin
evaluarea albinelor ( a locaților în care sunt prezente) este memorată într-o matrice
de dimensiune 10 care se ordonează descrescător de la cea mai mare valoare a lui
y la cea mai mică a acesteia, valorile depinzând de funcția matematică care se ia în
considerare.
3. Un număr de m albine din cele n existente care au cel mai bun fitness sunt
selectate. Aceasta are drept corespondent selectarea a m zone. În zonele vecine
fiecăreia din aceste m locații se vor efectua căutări. Din cele m albine sunt
selectate e albine elită, operația având ca rezultat selecția celor mai bune zone din
cele m selectate anterior. Presupunem că avem
m=5, e=2, m-e=3
Fig 2. Selecția
celor mai bune (m=5) zone pentru căutări ulterioare în vecinătatea acestora;
a unui număr de (e=2) albine de elită “▪” și
selecția unui număr de (m-e=3) alte albine “▫” din zonele cele mai promițătoare.
4. Selectează zonele vecine locațiilor în care sunt prezente albinele pentru explorare.
Zona este de mărime ngh (ngh ϵ [0, 1]).
247
Fig. 3 Determinare mărimii zonelor vecine (mărime specificată de ngh)
5. Se recrutează albine pentru zonele selectate și evaluează fitness-ul albinelor
respective
Se trimit albine la e zone (zone bogate) și la m-e zone (zone sărace)
Se vor trimite mai multe albine la e zone (zone de elită)
n2 = 4 (zone bogate)
n1 = 2 (zone sărace)
Fig 4 Recrutarea albinelor pentru zonele selectate (mai multe albine pentru e=2
zone de elită)
248
6. Selectează cele mai bune albine din fiecare locație (cu valoarea fitness-ului cea mai
mare) pentru a forma noua populație de albine. Se alge cea mai bună albină din
fiecare cele m zone astfel
Fig 5 Selectarea abinelor * care au fitness-ul maxim din fiecare zonă de căutare
7. Se inițializează o nouă populație de albine. Aceasta este formată din restul albinelor
în număr de n-m care nu au fost implicate în procesul de căutare anterior. În cazul
dat avem n = 10 m = 5, respectiv n-m=5 albine.
o
Fig. 6 Se atribuie restul de (n-m) albine pentru o nouă căutare aleatoare
249
8. Se repetă pașii de la 2 la 7 până când se atinge condiția de stop (sfârșitul
numărului de repetiții definit de imax). În final se va obține cea mai bună soluție care
se vede în figura următoare. Această cea mai bună valoare a locației în care se va
găsi cea mai bună albină din m albine va reprezenta optimul funcției matematice.
uzuale
Numărul celor mai bune locații, selectate din cele n locații explorate. m 10
Numărul locațiilor elită, alese din cele m selectate (corespund albinelor elită) e 3
Numărul de albine alese pentru explorarea vecinătății din cele mai bune e locații nep / 40
n2
Numărul de albine alese pentru explorarea restului de (m-e) locații rămase de nsp / 20
cercetat n1
Mărimea vecinătății din jurul locației unde este prezentă albina în care se face ngh 0.2
căutarea [0 - 1]. Rezultă o zona de căutare.
250
Pașii Algoritmului
Valoare fitness 20 50 60 30 80 10 … … … 35 72
Matricea se va ordona de la cea mai mare valoare a funcției fitness la cea mai mică
valoare a acesteia.
3. Un număr de m locații vor fi selectate (acestea vor corespunde celor mai bune
rezultate obținute de m albine din cele n prezente. De exemplu m=10
Albină 1 2 3 4 5 6 7 8 9 10
Valoare fitness 80 78 75 72 69 66 65 60 59 58
În continuare din cele m locații se aleg un număr de e locații. De exemplu e=2, deci
m-e=10-2=8.
251
5. Se recrutează albine pentru zonele selectate și se evaluează fitness-ul acestor zone.
Un număr de albine (n2) vor fi selectate aleatoriu și vor fi trimise la e zone
(n2=40)
Se aleg un număr de n1 albine (numărul este mai mic decât n2) care vor fi
trimise la cele m-e zone rămase. Presupunem că n1=20.
6. Se aleg albinele care prezintă cel mai bun fitness pentru fiecare zonă pentru a forma
următoarea populație de albine. Acest aspect nu există în natură. S-a procedat astfel
pentru a reduce numărul zonelor care se explorează.
Cele mai bune albine din cele m zone se vor selecta astfel:
a. Se iau în calcul succesiv cele e zone.
b. Se construiesc matrice care conțin n2=40 albine, în care, fiecare albină prezintă
un fitness egal cu valoarea fitness-ului albinei care a descoperit zona modificată
cu o valoare care depinde de rezultatul explorării zonei în cauză ( rezultată din
aplicarea parametrului ngh locației albinei care a descoperit zona) .
Matricea se va ordona și cea mai bună valoare se va lua în considerare.
Albină 1 2 3 … 40
Pasul 6 se repetă pentru toate cele m zone. La final se vor obține cele mai bune
m=10 albine care se vor memora la începutul matricei (n=100).
Albină 1 2 3 4 5 6 … 10 11 … 99 100
Căutarea în zonele vecine celor mai bune e zone care prezintă cele mai
promițătoare soluții se va face mai amănunțit prin recrutarea mai multor albine care
vor urma pe cele care au descoperit zona în detrimentul altor albine.. Împreună cu
albinele această recrutare diferențială reprezintă cheia operațiilor în Bee Algorithm.
252
7. Se inițializează noua populație:
Albinele din populația rămasă vor fi atribuite aleator în spațiul de căutare (pozițiile de
la 11 la 100 din matricea anterioară)
Albină 1 2 3 4 5 6 … 10 11 … 99 100
Prima este formată din albinele care vor explora zonele cele mai profitabile găsite iar
cea de a doua din albinele care vor continua să caute aleatoriu alte zone
BA – Aplicații
Domeniile de aplicabilitate în care BA poate fi utilizat sunt
Optimizarea funcțiilor
Recunoașterea formelor (Clasificare ECG, Tehnici de clustering, Clasificare
imagini, etc.)
Optimizarea Rețelelor Neuronale
Jocuri strategice
253
BA – Eficiență
Rezultate
254
16.3. Particle Swarm Optimization
Introducere
Particle swarm optimization (PSO) - Tehnica optimizării roiului de particule, este
unul de inspirație socială având ca punct de plecare mișcarea roiurilor de păsări.
Rezolvă majoritatea problemelor pe care algoritmii genetici le rezolvă. Un avantaj destul
de semnificativ în fața altor tehnici similare, este abilitatea de a opera fără a avea
nevoie de informații legate de gradient. Alt avantaj este ușurința de implementare. A
fost propus de Kennedy, J.; Eberhart, R. (1995). "Particle Swarm Optimization".
Proceedings of IEEE International Conference on Neural Networks. IV. pp. 1942–1948.
doi:10.1109/ICNN.1995.488968.
Concepte
Particle Swarm Optimization, sau „tehnica optimizării roiului de particule”, ,
folosește un model populațional.
Populația, roiul, este formată din particule, potențiale soluții. Roiul de particule,
se spune că „zboară” în hiperspațiul de dimensiune n, unde n este dimensiunea unei
soluții / nr. de parametri căutați. Acest zbor presupune găsirea unei soluții acceptabile
plecând de la o populație de soluții inițială generată aleatoriu, care se îmbunătățește pe
parcursul a mai multor iterații.
O particulă tinde să orbiteze
în jurul celei mai bune sale poziții (pbest) și
în jurul celei mai bune poziții (gbest) din grupul din care face parte.
255
Algoritmul se poate termina după mai multe criterii, spre exemplu când o soluție
satisfăcătoare a fost găsită ori s-au executat un număr predefinit de iterații.
Există două tipuri de PSO:
- varianta gbest și
- varianta lbest.
Pe scurt, cele două variante se deosebesc prin mulțimea particulelor cu care o
oarecare particulă se află în interacțiune:
în cadrul modelului gbest, o particulă schimbă informație cu tot roiul,
pe când în cadrul modelului lbest, informația este schimbată doar cu particulele
aflate într-o vecinătate a acesteia.
Algoritmul original
În cele ce urmează vom prezenta algoritmul original PSO, o variantă gbest, așa
cum a fost descris de către creatorii săi (Kennedy, J.; Eberhart, R. (1995). "Particle
Swarm Optimization". Proceedings of IEEE International Conference on Neural
Networks. IV. pp. 1942–1948)
În acest model, la un moment oarecare t, fiecare particula i, are următoarele
caracteristici:
xi – poziția curentă;
vi – viteza curentă;
fiecare particulă are în propria memorie cea mai bună poziție descoperită de-
a lungul iterațiilor, notată cu pi, iar
întreg roiul are în propria memorie cea mai bună poziție găsită de toate
particulele sale, notată cu pg definită ca:
256
Atât pi, cât și pg sunt actualizate la fiecare iterație a algoritmului.
Acest model de PSO, numit „global”, menține o singură cea mai bună poziție
pentru tot roiul. Deoarece toate particulele din roi se îndreaptă spre această poziție,
dacă ea nu ar fi actualizată destul de des, la fiecare iterație sau câteva iterații, atunci tot
roiul ar converge prematur.
Vom împărți algoritmul în trei mari faze, pe care le vom descrie separat: faza de
inițializare, faza iterațiilor și faza de terminare.
Inițializarea
Înainte de a „zbura”, particulele au nevoie de o inițializare a componentelor
vectoriale descrise mai sus.
Fiecărei componente
xti ale vectorului de poziție i se va asigna o valoare aleatoare uniform distribuită
în intervalul maxim din spațiul de căutare [−𝑥𝑚𝑎𝑥 , +𝑥𝑚𝑎𝑥 ],
vti ale vectorului de viteză, fie i se va asigna inițial valoarea 0, fie o valoare
uniform aleatoare din intervalul [−𝑣𝑚𝑎𝑥 , +𝑣𝑚𝑎𝑥 ],
cele specificate mai sus se traduc prin următoarele calcule
257
Faza iterațiilor
În faza iterațiilor se actualizează pentru fiecare particulă în parte vectorul de viteză, vti ,
Figura următoare arată cum fiecare din aceste componente se combină pentru a
rezulta noua viteză și poziția care rezultă pentru o particulă la sfârșitul unei.
vi
wv i
c1 rand
p x c2 rand p x
i i
k
g
k
i
k
k 1
t t
k
258
Pentru a căpăta proprietăți stohastice, algoritmul folosește, după cum se
observă, doi vectori care au conținut uniform aleatoriu 𝑟𝑎𝑛𝑑 ~ 𝑈(0,1), scalați de
coeficienții de accelerație c1 , c2 0, 2 .
t
Această componentă ia în considerare doar experiențele personale ale particulei i, și
influențează cât se va deplasa particula spre cea mai bună performanță a sa din trecut.
Pentru actualizarea vitezei, Kennedy a folosit într-un experiment de-al sau doar această
componentă în ecuație, sub forma
v i
wv i
c1 rand
p x ,
i i
k
k 1
t
k
omițând cea de-a doua componentă. Rezultatele obținute au fost mult inferioare soluției
complete, deoarece particulele nu aveau nici o interacțiune.
vi
wv
i
c 2 rand
p
g
k xki
,
k 1
t
k
259
iar rezultatele au fost superioare primei încercări în care s-a folosit doar componenta
cognitivă.
În prezent nu se știu prea multe despre cât de importante sunt cele două
componente în parte, deși empiric s-a demonstrat că pe un set mai larg de probleme
componenta socială ar fi mai importantă. Cert este că, folosind ambele componente,
rezultatele sunt satisfăcătoare în comparație cu alți algoritmi care încearcă să rezolve
aceleași probleme.
Pe baza vectorului de viteză se calculează vectorul de poziție după formula:
xki 1 xki vki 1 t
Urmează actualizarea celei mai bune poziții găsite de particula i până la
momentul t. După ce toate particulele au fost procesate, se poate calcula din nou cea
mai bună poziție găsită de roi.
Faza de terminare
Algoritmul se rulează de un număr de ori stabilit dinainte sau până se atinge un nivel
prestabilit de eroare. Desigur pot exista și alte criterii de oprire, acestea fiind date de
natura problemei de rezolvat. În figura următoare se prezintă faza de iterație și ultima
iterație în care s-a atins un optim.
260
În continuare redăm o simplă variantă de pseudo-cod, care sintetizează cele discutate
mai sus.
Exemplu
Algoritmul PSO poate fi utilizat pentru optimizarea unui portofoliu în contextul unor tranzacții
bursiere. În contextul optimizării portofoliului, fiecare particulă poate defini o posibilă alocare de
capital între diverse mărfuri din contextul portofoliului. Funcția de fitness a acestui portofoliu
poate fi determinată utilizând funcții financiare care calculează riscul unei investiții.
Presupunând că se utilizează pentru funcția de fitness – Sharpe ratio - (Indice de performanță
a unui portofoliu. A fost descrisa de Sharpe care corelează castingul prognozat al unui portofoliu
eficient cu rata dobânzii pentru titlul cu risc zero si castingul prognozat al pieței. Este în prezent
un standard de măsură a eficienței unui portofoliu)
E RM R f
E Rp R f P
M
Unde:
261
Rf câștigul prognozat al titlului cu risc zero;
E(RM) câștigul prognozat al pieței (indice);
P abaterea standard a portofoliului;
M abaterea standard a pieței.
Considerăm următoare ilustrare a tehnicii PSO aplicată unui portofoliu constând din 3 bunuri
Particula gri este particula care a fost actualizată, Particula roșie este cea mai bună poziție a
particulei gri (pbest) iar cea albastră cea mai bună poziție globală (gbest).
Particula gri glisează în vectorul (0.5, 0.2, 0.3) care înseamnă că 50% din portofoliu este alocat
pentru bunul 1, 20% pentru bunul 2 și 30% pentru bunul 3. Coeficientul Sharpe pentru această
alocare de fonduri este de 0.38 care este mai mică decât cea mai bună poziție personală
(particular roșie) și cea mai bună poziție global (particular albastră). Din această poziție
particula gri este actualizată astfel încât aceasta se va apropria mai mult atât de valorile cele
mai bune atât personale (pbest) cât ți globale (gbest). Rezultatul este mai bun decât cel din
pasul anterior.
Particula gri prezintă în acest pas valoarea (0.3, 0.3, 0.4) care are un coeficient Sharpe de 0.48.
Deoarece această valoare este mai mare decât valoare pbest din pasul anterior poziția
particulei va actualiza valoare pbest
262
Adevărata provocare în procesul de optimizare cu (PSO) este legată de asigurarea respectării
faptului că constrângerile de optimizare a portofoliului sunt satisfăcute. Cele mai frecvente
constrângeri sunt în primul rând, legate de faptul că nu mai mult și nu mai puțin de 100% din
capitalul disponibil se alocă între active (de exemplu, valoarea vectorului trebuie să fie 1,0). În
al doilea rând, alocările negative de active nu sunt permise. Și, în sfârșit, capitalul disponibil
trebuie să fie alocat tuturor activelor din portofoliu. Aceasta din urmă fiind o constrângere
cardinalitate. Două tehnici comune sunt utilizate pentru a se asigura că particulele satisfac
constrângerile.
1. Pentru fiecare particulă care nu satisface constrângerile, se aplică un set de reguli pentru a
modifica poziția particula lui astfel încât aceste restricții să fie îndeplinite.
2. Se penalizează prin intermediul funcției de fitness de particule care nu satisfac constrângeri
263
Anexa
264
265
17. Machine learning
266
Algoritmi de învățare
17.1 Clasificare. Arbori de decizie
17.1.1 Tipuri de date
Modelele care sunt construite în cadrul tehnicilor de clasificare descriu
fenomene și aspecte diferite (obiecte) ale realității înconjurătoare. Aceste
aspecte sunt descrise prin intermediul unor instanțe (măsurători) care conțin
fiecare două sau mai multe atribute numerice sau alfanumerice.
Există mai multe tipuri de atribute care pot apare in descrierea unui
obiect. Acestea vor trebui tratate unitar in contextul păstrării semnificaţiei pe
care o prezintă. Tipurile de atribute care pot apare sunt
Atribute numerice:
Atribute nominale
Atribute de tip interval:
Atribute mixte
De exemplu
Atribute Numeric Numeric Nominal Numeric
Tip discret continuu de tip
interval
Exemplu 2 4.53 red [2, 30]
valoare atribut
Domeniu [1, 2, 4, 8] [2, 10] [red, yellow, blue, green] [2, 30]
267
specifice. De exemplul la nivelul caracteristicii „outlook” apar un număr de 3
trăsături specific (clase) și anume: sunny, overcast, rainy, iar la nivelul
caracteristicii “play” doua trăsături specifice : no, yes. La nivelul unui atribut
numeric aceste trăsături specific se definesc prin intermediul intervalelor la
care pot aparține valorile numerice respective. De exemplu pentru atributul
“temperature”, pot apare un număr de 3 caracteristici (clase) corespunzătoare
intervalelor (60 – 70), (71 – 80), (81 – 90).
268
Decizia 1 Ramură
DA NU
Decizia 2 Decizia 3
DA NU
DA NU
Decizia 4 Decizia 5
DA NU DA NU
Frunze
269
Modelul care urmează să fie utilizat depinde de obiectivul urmărit de
utilizator. Obiectivul este definit de caracteristica (clasa) funcție de care se
dorește a fi reprezentat setul de date.
270
Entropia se calculează astfel :
Fiind dat un set S, conţinând doar exemple pozitive și negative a unui
concept dorit, entropia setului S este:
15 15 10 10
Entropie( S ) log 2 log 2 0.97
25 25 25 25
Utilizând acest indicator pentru fiecare nivel de construire a arborelui de
decizie se ia în considerare atributul care introduce cea mai puțină dezordine.
271
Sv
Gain( S , A) Entropie( S )
vValori ( A) S
Entropie( Sv )
unde:
Valori(A) este un set de posibile valori pentru atributul A ,
Sv este o submulţime a lui S pentru care atributul A are valoarea v
Sv = {s S | A(s) = v}
Exemplu
A. Care din cele două atribute induce cea mai mare dezordine în setul de
date (deci prezintă cel mai mic câștig informațional) ?
29 29 35 35
Entropy (29,35) log 2 log 2 0.99
64 64 64 64
272
Entropy 18,33 0.94
Entropy 8,30 0.62
273
1. Se calculează Câștigul informațional pentru cele 4 atribute
274
2. Câștigul informațional pentru cele 4 atribute este dat în tabelul de mai
jos
Atribut Câștig informațional
Gain(S,Outlook) 0.247
Gain(S,Humidity) 0.151
Gain(S,Wind) 0.048
Gain(S,Temperature) 0.029
275
În final vom obține următorul arbore de decizie
276
17.2 Rețele Neuronale
O reţea neuronală artificială este un model care emulează reţeaua
neuronală biologică. Nodurile într-o reţea neuronală se bazează pe
reprezentarea matematică simplistă a cărei funcționare se aseamănă cu
neuronii reali.
Neuronul biologic
Celula nervoasă – sau neuronul – este elementul fundamental al
sistemului nervos. Schematic, în Figura 1 este redat simplist un lanţ de
neuroni, având menţionate componentele semnificative din punctul de vedere
al utilităţii în modelele matematice ulterioare:
277
pentru neuronii din cortex şi 10 centimetrii pentru neuronii periferici.
Axonul reprezintă conexiunea de ieşire a semnalului procesat de către
neuron.
278
cunoştinţele sunt acumulate în timpul unui proces de învăţare
stocarea cunoştinţelor se realizează prin valoarea conexiunilor inter
neuronale, denumite şi ponderi sinaptice
279
capacitatea de a învăţa
capacitatea de generalizare
Capacitatea de a învăţa :
Capacitatea de generalizare :
280
axonii neuronilor vecini; în momentul în care valoarea sarcinii depăşeşte o
anumită valoare – numită prag – neuronul devine activ, transmiţând prin
axonul său un curent constant. Această funcţionare poate fi descrisă
matematic prin:
n
U pentru x i T
o i 1
n
0 pentru
x
i 1
i T
unde:
xi = intrarea i
o = ieşire
x1
x2
U
n
O
i 1
xn
281
un mod similar cu calculatoarele digitale, al căror model era definitivat în
aceeaşi perioadă.
Această prezumţie s-a dovedit a fi greşită, însă are valoare intuitivă,
deoarece s-a dovedit ulterior că neuronii funcţionează oarecum după modelul
activării la atingerea unui prag.
Acest model neuronal este caracterizat prin formalism şi printr-o definire
matematică elegantă, având un potenţial de calcul considerabil.
Simplicitatea sa presupune:
stări binare de tip 0 şi 1
asumarea operării în timp discret
sincronicitatea operării tuturor neuronilor
B. Modelul Hebb
În 1949, Daniel Hebb, un biolog care se ocupa cu studiul
comportamentului primatelor, presupune că prin modificarea sinapselor,
conectivitatea celulelor nervoase este într-o continuă schimbare, pe măsură
ce organismul îşi dezvoltă diferite aptitudini. Hebb a enunţat o regulă a
învăţării, conform căreia:
282
dacă neuronul transmiţător şi neuronul receptor sunt ambii activi în
acelaşi interval de timp, valoarea ponderii asociate conexiunii creşte;
n
1 pentru x
j 1
j wj T
oi n
0 pentru
x
j 1
j wj T
283
x1 w1
x2 w2
n 1
i 1
(hi) oi
xn wn
284
intrare la ieşire (feedforward), caracteristică care este aplicată prin faptul că
un neuron poate avea ca intrări numai ieşirile neuronilor de pe straturile
precedente. Vom începe analiza noastră plecând de la o reţea neuronală
simplă cu un singur strat, perceptronul simplu, şi vom continua analiza până
la reţelele neuronale multistrat cu propagare înainte (multi-layer feed forward
networks).
x0
w0
x1
w1 y
wN-1
xN-1
N 1
y f h wi xi
i 0 (17.1)
285
1 daca s 0
f h s
1 daca s 0 (17.2)
Această reţea clasifică într-una din cele două clase disponibile (A sau B) un
set de intrări. Astfel dacă ieşirea y este 1 atunci avem clasa A, în timp
ce pentru ieşirea -1 avem clasa B. Altfel spus reţeaua reuşeşte
divizarea spaţiului intrărilor în două regiuni separate de un hiperplan.
Putem observa acest lucru considerând că avem 2 intrări. În acest caz
reţeaua separă spaţiul intrărilor în două după o linie ce are următoarea
ecuaţie:
w1 x1 w2 x2 0 (17.3)
Observăm cum toate intrările care sunt deasupra liniei aparţin clasei A în
timp ce intrările de sub linie aparţin clasei B (Figura 6).
286
Situațiile în care cele două clase sunt liniar separabile sunt rare, în
majoritatea cazurilor acestea sunt neliniar separabile. Un exemplu este dat în
figura următoare
287
Există și o împărţire a funcţiilor de activare pe categorii, în funcţie
de valoarea pe care reţeaua neuronală o prezintă la ieșire. Astfel avem
următoarele categorii:
Dacă ieșirile reţelei sunt binare se utilizează funcţiile sigmoidă
si softmax. Problemele care se încadrează în această categorie sunt acelea
de recunoaștere de tipare, de clasificare, etc. Funcţia softmax este
predominant folosită la stratul de ieșire pentru un sistem de clustere. Aceasta
convertește o valoare brută într-o probabilitate posterioară ce ne oferă o
măsură a certitudinii.
Pentru ieșiri ale reţelei care se doresc a fi continue și limitate de
un interval avem funcţia de activare sigmoidă, sinus și tangentă
hiperbolică. În această categorie se regăsesc funcţii de aproximare, metode
de interpolare și metode statistice.
Pentru ieșiri continue și nelimitate avem funcţia exponenţială, radical
sau identitate.
Exemple
(A)
288
Ca şi limitare a acestor reţele putem aminti problematica
XOR (sau-exclusiv),
XNOR negația operației de disjuncție exclusivă (XOR) sau
orice tip de problema al cărui strat de intrare nu poate fi separabil în două
regiuni.
Pentru problema XNOR cele afirmate sunt prezentate în figura de mai jos în
care x1 și x2 primesc valorile binare 0, 1.
289
B. Perceptronul cu mai multe straturi
Reţelele de tip perceptron cu mai multe straturi (multi-layer
perceptron) sunt reţele de tip propagare înainte cu unul sau mai multe straturi
situate între nodurile de intrare şi nodurile de ieşire. Aceste straturi (straturi
ascunse) conţin neuroni care nu sunt direct conectaţi cu intrările sau ieşirile
reţelei. Toate limitările impuse de perceptronul cu un singur strat sunt
depăşite de acest tip de reţea.
290
Performanţele unei reţele de tipul perceptron cu mai multe straturi
constau în folosirea unor funcţii de activare neliniare pentru nodurile interne.
Dacă am folosi numai funcţii de activare liniară putem aproxima o reţea
neuronală de tip perceptron cu mai multe straturi cu o reţea de tip perceptron
cu un singur strat.
Ca şi arhitectură, perceptronul cu mai multe straturi se prezintă ca în
Figura 7.
Ni No
Nh,1 Nh,s
Nh,2
Figura 7. Perceptronul multistrat cu s straturi ascunse
291
Minsky şi Papert au arătat în 1969 că o reţea neuronală de tip
perceptron multistrat cu 1 strat ascuns, rezolvă multe dintre problemele
rămase nerezolvate de perceptronul cu un singur strat, dar nu au putut
prezenta o soluţie la modul de ajustare a ponderilor în această reţea. Soluţia
la această problemă a venit în 1986, când Rumelhart, Hinton şi Williams au
determinat modul de ajustare al ponderilor propagând eroarea de la stratul de
ieşire spre stratul de intrare. Această tehnică s-a şi numit back-propagation.
Deşi tehnica back-propagation poate fi aplicată la reţele de tip perceptron cu
oricâte straturi ascunse, s-a arătat că pentru reţele cu intrări binare, un singur
strat ascuns este suficient pentru aproximarea oricărei funcţii ce are un număr
finit de discontinuităţi (Teorema aproximării universale). În cele mai multe
aplicaţii este utilizată funcţia sigmoid ca şi funcţie de activare a neuronilor.
Aşa cum am spus şi mai sus un singur strat ascuns e suficient pentru
rezolvarea majorităţii problemelor. Putem folosi însă şi două sau trei straturi
ascunse pentru probleme dificile. Dacă numărul neuronilor de pe straturile de
intrare şi ieşire este uşor determinabil (ţine exclusiv de natura aplicaţiei),
numărul neuronilor de pe stratul ascuns este dificil de aproximat.
Neuronii de pe straturile ascunse au rol în detectarea trăsăturilor
comune pentru tiparele de antrenament. De aceea un număr prea mic de
neuroni va influenţa negativ capacitatea de generalizare a reţelei conducând
la o eroare medie pătratică mare. Un număr mare de neuroni conduce la un
volum de calcul mare şi măreşte exponenţial timpul de antrenament.
292
Ca şi concluzie putem nota faptul că în prezent alegerea numărului de
neuroni de pe stratul ascuns este făcută experimental.
Exemplu
0.5 0.5
(2) 1 1 0
(1)
0.2 0.2
1 1
293