Strategia Minimax

 

            La modul general, strategia Minimax se bazeaza pe utilizarea unei functii care decide cat de buna este o pozitie, atribuindu-i o valoare numerica. De exemplu, daca pozitia e castigatoare pentru calculator, aceasta ar putea avea scorul 1000,  daca e remiza, atunic zero, iar daca calculatorul pierde -1000. Vom numi o pozitie pentru care se poate spune cert care e scorul o pozitie terminala.

            Daca o pozitie nu e terminala, valoarea pozitiei e determinata recursiv, presupunand ca ambii jucatori vor juca optim. De aici provine numele Minimax, deoarece unul din jucatori (omul) incearca mereu sa minimizeze scorul pozitiei, in timp ce calculatorul incearca sa-l maximizeze.

            O pozitie succesor a lui P este orice pozitie Ps la care se poate ajunge din P efectuand o mutare. Daca calculatorul e la mutare, intr-o pozitie oarecare P, atunci el evalueaza in mod recursiv valoarea tuturor pozitiilor succesor. El va alege pozitia cu valoarea cea mai mare. Aceasta e valoarea lui P. Pentru a evalua orice pozitie succesor Ps, toti succesorii lui Ps sunt evaluati recursiv, si se alege valoarea cea mai mica. Aceasta reprezinta mutarea cea mai buna cu care omul poate raspunde.

            Daca la un joc simplu, precum X-0, calculatorul poate evalua toate pozitiile ºi alege astfel mutarea cea mai buna, pentru jocuri mai complexe cum e Moara, acest lucru  nu e posibil. In acest caz, trebuie sa oprim analiza dupa un anumit numar de mutari. Nodurile unde s-a oprit recursivitatea devin noduri terminale. Aceste noduri sunt evaluate cu  o functie care estimeaza valoarea pozitiei. De exemplu, la jocul de Moara, functia ar putea numara piesele de pe tabla, numarul de locuri unde mai poate muta fiecare piesa, numarul de mori ale fiecarui jucator etc. Functia de evaluare este foarte importanta pentru ca mutarea cea mai buna sa fie aleasa.

            Pentru a mari adancimea recursivitatii, trebuie sa aplicam diferite tehnici. Mai exact trebuie sa generam mai putine pozitii, fara a pierde informatie.

            O astfel de metoda este alpha-beta pruning.

 

Alpha-beta Pruning

 

            Cea mai importanta imbunatatire ce se poate aduce algoritmului Minimax este alpha-beta pruning.

            Strategia consta in a renunta la a mai evalua pozitiile care in mod clar sunt mai defavorabile decat ceea ce a fost gasit pana in prezent. Sa luam ca exemplu urmatoarea figura:

 

            Sa consideram nodul E. Figura arata informatia care  a fost adunata pana in momentul de fata. Nodul E nu a fost evaluat inca, dar daca privim atent, nu e necesar sa-l evaluam. Aceasta deoarece din nodul C, omul, care e la mutare va alege valoarea minima. Deci el ar putea sa aleaga 5 sau chiar mai putin daca nodul E are valoare mai mica. In orice caz, calculatorul, din nodul A va prefera sa aleaga varianta B, unde castigul este de 10. Asadar, indiferent ce valoare are nodul E, acesta nu va influenta alegerea calculatorului, deci nu mai e necesar sa-l evaluam. Aceasta strategie poarta numele de alfa. Similar, se poate construi o strategie pentru om, care se numeste beta. Combinand cele doua strategii obtinem alfa-beta pruning, care inseamna asadar a renunta la evaluarea unor pozitii care nu vor modifica alegerea ce trebuie facuta.

            Pentru a profita la maxim de aceasta strategie, uneori e bine sa ordonam nodurile inainte sa incepem sa le evaluam. Aceasta deoarece, exista o probabilitate destul de mare ca o pozitie care pare buna in momentul de fata, sa fie intr-adevar buna, in timp ce o mutare proasta, doar rareori se dovedeste a fi buna la o analiza mai adanca.

            Codul care implementeaza algoritmul Minimax impreuna cu strategia alpha-beta pruning este definit in fisierul GameEngine.java.

 

Aplicarea algoritmului Minimax in jocul „Moara”

 

          1. Descrierea jocului

          Moara este jucata de doi jucatori. Fiecare jucator are la inceputul partidei disponibile 9 piese pe care le poate plasa pe tabla. Scopul jocului este capturarea tuturor pieselor adversarului, sau blocarea sa in asa fel incat sa nu mai poata muta, caz in care acesta pierde.

            Tabla de moara arata ca in figura urmatoare:

            O piesa poate fi asezata in unul din cercurile de pe tabla, daca acesta e liber.

            Atunci cand trei piese de aceiasi culoare se afla in linie, structura poarta numele de „moara”. Jucatorul care a facut „moara” are dreptul sa captureze o piesa adversara de pe tabla, cu conditia ca aceasta sa nu faca parte la randul ei dintr-o „moara”.

            In prima etapa a jocului jucatorii aseaza alternativ piese pe tabla. Daca fac „moara”, captureaza o piesa adversa. Dupa ce toate piesele au fost introduse, urmeaza faza a doua a jocului, cand fiecare jucator poate muta cu piesele sale. Piesele pot fi mutate de pe un cerc pe altul cate un pas, cu conditia ca cercul destinatie sa fie liber. Cei dor jucatori vor urmari sa construiasca alte mori pentru a captura piese, sau pot incerca sa-l blocheze pe celalalt jucator. O moara poate fi „deschisa” apoi „inchisa” din nou pentru a captura piese.

            Cand unul din jucatori ramane doar cu trei piese, acestea pot „sari”, adica pot fi mutate oriunde pe tabla.

 

          2. Implementarea jocului

Pentru a implementa acest joc avem nevoie sa construim urmatoarele functii, pe care algoritmul general Minimax le foloseste:

-         functia de evaluare a unei pozitii;

-         functia de generare a tuturor pozitiilor succesoare.

a) Functia de evaluare

            Trebuie sa tinem cont de urmatoarele aspecte cand evaluam o pozitie: numarul de piese ale calculatorului, numarul de piese ale jucatorului, libertatea de miscare a calculatorului, libertatea de miscare a jucatorului.

            Pentru fiecare piesa in plus pe care o are calculatorul acesta va primi un bonus de 50 de puncte. Pentru fiecare piesa in minus va primi o penalizare de -5 de puncte.

            De asemenea pentru fiecare grad de libertate in plus va primi 2 puncte, altfel va primi penalizari de -2 puncte.

 

b)Functia de generare.

            E alcatuita de fapt din trei functii separate, corespunzatoare celor trei faze ale jocului: introducerea de piese pe tabla, mutari normale, salturi.

            Implementarea acestor functii se gaseste in fisierul MillBoard.java

 

 

3. Moara in actiune

 

            Mai jos sunt ilustrate principalele momente dintr-o partida:

 

                   Tabla de moara inaintea inceperii jocului.  

 

    Jucatorul poate seta diferiti parametrii care influenteaza puterea de

gandire a calculatorului.

 

Desfasurarea partidei

 

 

 

Rezultatul confruntarii