Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-07-23 14:45:56.
Revizia anterioară   Revizia următoare  

Adunarea jocurilor

Valorile Sprague-Grundy reprezinta o generalizare fata de algoritmul de programare dinamica in cazul jocului cu un singur pion, deoarece cu ajutorul acestor valori pot fi combinate mai multe jocuri. De exemplu, putem presupune ca in graful orientat sunt mai multi pioni in loc de unul singur si ca o mutare consta in deplasarea unui pion din nodul in care se afla intr-un nod adiacent. La fel ca mai sus, cine nu mai poate muta pierde. In acest caz, castigatorul in cazul unui joc perfect nu se poate determina pe baza programarii dinamice. Mai mult, determinarea castigatorului nu este deloc triviala, asa cum era in cazul jocului cu un pion. Atunci cand combinam (adunam) mai multe jocuri elementare, rezultatul poate fi determinat in mod eficient cu ajutorul valorile Sprague-Grundy.

In cazul jocului cu mai multi pioni, in loc sa consideram un singur graf, putem considera (conceptual) mai multe grafuri de joc identice, in fiecare dintre acestea aflandu-se cate un pion. Acum, o mutare inseamna alegerea unui graf si deplasarea pionului din graful ales conform regulilor pentru un singur pion. In acest fel, am separat jocul initial in mai multe jocuri independente. Dupa cum s-a demonstrat mai sus, stim rezultatul pentru fiecare joc independent in parte si dorim sa determinam castigatorul pentru jocul cu mai multe grafuri.

Sa presupunem ca avem P jocuri notate G1, G2, ..., GP, pe care dorim sa le adunam. Fiecare din cele P jocuri poate fi reprezentat ca un graf orientat fara circuite in care multimea nodurilor (notata Vi pentru jocul i) este data de multimea starilor iar multimea arcelor (notata Ei pentru jocul i) este data de perechile ordonate de stari adiacente (exista arc de la x la y daca se poate ajunge printr-o mutare din starea x in starea y). Adunand cele P jocuri obtinem un nou joc G pentru care o stare (nod in graful asociat) este un P-uplu (v1,v2, ..., vP) care ne precizeaza starea curenta pentru fiecare joc individual (vi este starea curenta in jocul i). Pentru a afla daca pentru o anumita stare din jocul G exista sau nu strategie sigura de castig am putea aplica algoritmul simplu de programare dinamica (prezentat mai sus) pentru graful asociat jocului G. Se observa insa ca acest graf are |V1|*|V2|* ...*|VP| noduri, deci algoritmul nu este eficient.
In continuare vom arata cum putem sa determinam eficient daca o stare este castigatoare sau nu pentru un joc compus folosindu-ne de informatiile preprocesate pentru fiecare joc individual.

Adunarea xor

Vom aduna jocurile G1, G2, ..., GN astfel incat la fiecare pas jucatorul care urmeaza trebuie sa isi aleaga exact un joc si sa faca o mutare in jocul respectiv. Ultimul jucator care muta castiga. Un astfel de joc este si jocul NIM: atunci cand este la mutare, un jucator alege doar una din gramezile existente si efectueaza o mutare doar in aceasta gramada (ia un numar de pietre).

Teorema: Pentru un anumit joc G care este suma jocurilor G1, G2, ..., GN dupa cum a fost definita mai sus o stare v = (v1,v2, ..., vN) este pierzatoare daca si numai daca mex(x1) xor mex(x2) xor ... xor mex(xn) = 0.

Demonstratie: Vom arata ca jocul G este echivalent cu un joc NIM cu N gramezi in care gramada i are mex(vi) pietre. In jocul NIM putem alege o gramada cu g(xi) pietre si sa luam cateva astfel incat in gramada sa ramana a<g(xi) pietre. Acestei mutari in jocul NIM ii corespunde o mutare in jocul compus G in care se alege jocul individual Gi si se muta din stare curenta xi intr-o stare y cu g(y)=a. Deoarece a<g(xi) va exista mereu o astfel de stare y. Nu vom lua in considerare mutarile cand dintr-o stare xi se muta intr-o stare y cu g(y)>g(xi) deoarece urmatorul jucator poate muta din starea y intr-o stare z cu g(z)=g(xi) si anuleaza practic mutarea precedentului. (de editat)

Adunarea or

Sa presupunem ca dorim sa adunam jocurile G1, G2, ..., GN in asa fel incat la fiecare pas jucatorul care urmeaza poate sa isi aleaga oricate jocuri si sa faca o mutare in fiecare din jocurile alese. Ultimul jucator care muta castiga. Un astfel de caz se intalneste in problema Pioni.

Teorema: Pentru un anumit joc G care este suma jocurilor G1, G2, ..., GN dupa cum a fost definita mai sus o stare v = (v1,v2, ..., vN) este pierzatoare daca si numai daca mex(v1) = mex(v2) = ... = mex(vN) = 0.

Demonstratie: Daca toate starile v1, v2, ..., vn sunt terminale atunci starea v este pierzatoare si mex(v1) = mex(v2) = ... = mex(vN) = 0, deci teorema este adevarata. Daca starea x contine cel putin un joc cu valoarea Sprague-Grundy nenula se fac mutari in toate aceste jocuri astfel incat sa lase adversarul intr-o stare in care toate jocurile au valoarea SG egala cu 0. Dintr-o astfel de stare, orice mutare ar face adversarul va exista cel putin un joc cu valoarea SG nenula.