Ciprian Chichirita
grupa 407 (I.A.)
Programarea Algoritmilor Eficienti
Metoda de descoperire a unor premise noi folosind premise si concluzii vechi, astfel, rezultatul unui argument va deveni premisa.
In programare, euristica e o tehnica proiectata pentru a rezolva o problema intr-un mod mai rapid decat metodele clasice sau pentru a gasi o solutie aproximativa atunci cand metodele clasice nu pot gasi nici o solutie exacta. In termeni generali, euristica poate fi privita ca o scurtatura.
Un exemplu in care o euristica face ca un algoritm sa se comporte mai rapid in anumite scenarii este algoritmul de cautare. Initial, euristica incearca orice posibilitate la fiecare pas, la fel ca algoritmul clasic (in cazul nostru minMax) dar poate sa se opreasca din cautat oricand daca posibilitatea curenta sau rezultatul curent e mai rau decat cel precedent. In astfel de scenarii, o euristica poate fi folosita pentru a incerca mai intai posibilitatile sau rezultate bune astfel, cele rele pot fi elimminate devreme.
MinMax e o regula de decizie folosita in teoria jocurilor, statistica si filosofie pentru minimizarea pierderilor posibile in cel mai rau caz (pierdere maxima/totala). Initial a fost formulata pentru teoria jocurilor cu 2 jucatori si suma zero (daca adunam toate castigurile si scadem toate pierderile, rezultatul va fi zero), suportand ambele cazuri in care jucatorii actioneaza alternativ sau simultan, de asemenea a fost extinsa sa suporte jocuri mai complexe si sa ia decizii generale in prezenta incertitudinii.
Calcularea valorii maxime a unui jucator se face folosind abordarea cazului cel mai rau: pentru oricare actiune posibila a jucatorului, varificam toate actiunile posibile ale celorlati jucatori si determinam combinatia cea mai proasta de actiuni - cea in care jucatorul "i" primeste cea mai mica valoare. Apoi, determinam care actiune poate jucatorul "i" sa ia a.i. valoarea cea mai mica gasita e cea mai mare posibila.
In teoria jocurilor, un arbore joc (game tree) e un graf orientat ale carui noduri sunt pozitii in joc si ale carui laturi (ramure) sunt mutari. Un arbore joc complet pentru un joc e un arbore joc care incepe de la pozitia initiala a jocului (de start) si contine toate mutarile posibile pentru toate pozitiile.
Alpha–beta pruning e un algoritm de cautare care incearca sa reduca numarul de noduri evaluate din arborele de cautare ale algoritmului minmax. Este un algoritm de cautare folosit in general pentru jocuri in care participa 2 jucatori (Ex.: Sah). Atunci cand este aplicat unui arbore minmax, acesta returneaza aceleasi valori dar sterge/taie ramurile arborelui care nu pot influenta solutia/decizia finala.
Algoritmul mentine 2 valori, alpha(max) si beta(min), care reprezinta punctajul maxim pe care jucatorul maximizat il poate avea si scorul minim pe care jucatorul minimizat il poate avea. Initial alpha e -∞ iar beta e +∞, astfel, fiecare jucator incepe cu scorul cel mai mic posibil. Se poate intampla ca atunci cand alegem o ramura a unui nod, scorul minim al jucatorului minimizat poate deveni mai mic decat scorul maxim al jucatorului maximizat, adica beta <= alpha. Daca se intampla acest lucru, nodul parinte nu ar trebui sa aleaga acest nod, pentru ca va inrautati scorul nodului parinte, astfel, celelalte ramuri ale acestui nod nu necesita a fi parcurse.
function alphabeta(node, depth, α, β, maximizingPlayer)
if depth = 0 or node is a terminal node
return the heuristic value of node
if maximizingPlayer
v := -∞
for each child of node
v := max(v, alphabeta(child, depth - 1, α, β, FALSE))
α := max(α, v)
if β ≤ α
break (* β cut-off *)
return v
else
v := ∞
for each child of node
v := min(v, alphabeta(child, depth - 1, α, β, TRUE))
β := min(β, v)
if β ≤ α
break (* α cut-off *)
return v
(* Initial call *)
alphabeta(origin, depth, -∞, +∞, TRUE)
Pseudo-cod