Negamaks algoritam

S Vikipedije, slobodne enciklopedije

Negamaks pretraga je varijanta minimaks pretrage koja se oslanja na nultu-sumu prilikom igre u kojoj učestvuju dva igrača.

Ovaj algoritam se zasniva na činjenici da je maks(a, b) = -min(-a, -b) kako bi se pojednostavila implementacija minimaks algoritma. Preciznije, vrednost koja odgovara poziciji igrača A u toku igre jednaka je negaciji vrednosti koja odgovara poziciji igrača B. Prema tome, igrač koji je na potezu želi da maksimizuje negaciju vrednosti koja proizilazi iz tog poteza: pozicija naslednika mora, po definiciji, da bude vrednovana od strane protivnika. Prethodna rečenica je korektna nezavisno od toga koji igrač je na potezu, igrač A ili igrač B. Iz toga proizilazi da se jednim potezom mogu vrednovati obe pozicije. Ovo je pojednostavljena verzija minimaks algoritma koja zahteva da igrač A odabere potez sa maksimalnom vrednošću naslednika, dok igrač B odabere potez sa minimalnom vrednošću naslednika.

Ovaj algoritam ne bi trebalo mešati sa negaskaut algoritmom, koji veoma brzo izračunava minimaks ili negamaks vrednost, mudro koristeći alfa-beta pretragu, otkrivenu 1980—ih godina.[1] Potrebno je imati na umu da je alfa-beta pretraga, sama po sebi, jedan od načina da se izračuna minimaks ili negamaks vrednost pozicije, brzo, izbegavajući pretragu konkretnih neintersantnih pozicija.

Većina algoritama pretraživanja su zasnovani na negamaks pretrazi.

Osnovni negamaks algoritam[uredi | uredi izvor]

Negamaks radi nad istom vrstom stabla (game tree) koja se koristi prilikom algoritma minimaks pretrage. Svaki čvor i koren stabla predstavljaju određene faze igre u kojoj učestvuju dva igrača. Prelazak na čvorove potomaka predstavlja poteze koji su na raspolaganju igraču koji se nalazi na datom čvoru, odnosno igraču koji je na potezu.

Cilj negamaks pretrage je pronaći čvor ciljne vrednosti za igrača koji se nalazi na korenu stabla.[2] Naredni pesudokod prikazuje osnovni negamaks algoritam, sa mogućnošću pedašavanja maksimalne dubine pretrage.

01 function negamax(čvor, dubina, boja)
02     if dubina = 0 ili čvor je terminalni čvor
03         return boja * heuristička vrednost čvora

04     najboljaVrednost := −∞
05     foreach potomak čvora
06         v := −negamax(potomak, dubina − 1, −boja)
07         najboljaVrednost := max( najboljaVrednost, v )
08     return najboljaVrednost
Inicijalni poziv za koren igrača A
negamaxVrednostKorena := negamax( koren, dubina, 1)
minimaxVrednostKorena := negamaxVrednostKorena
Inicijalni poziv za koren igrača B
negamaxVrednostKorena := negamax( koren, dubina, −1)
minimaxVrednostKorena := −negamaxVrednostKorena

Koren nasleđuje vrednost jednog od svojih neposrednih potomaka, odnosno sinova. Na kraju, onaj potomak čiju je vrednost koren nasledio predstavlja ujedno i najbolji potez koji je moguće odigrati. Iako se u pseudokodu u okviru promenljive najboljaVrednost čuva samo najbolji rezultat, praktična implementacija će takođe čuvati i najbolji potez, zajedno sa najboljaVrednost.

Ono što može biti zbunjujuće je način izračunavanja heurističke vrednosti trenutnog čvora. U ovoj implementaciji, ova vrednost se uvek izračunava sa tačke gledišta igrača A, čija boja je 1. Drugim rečima, veća heuristička vrednost uvek predstavlja situaciju koja je povoljnija za igrača A. Ovo je ponašanje koje odgovara i minimaks algoritmu. Heuristička vrednost se ne mora nužno poklapati sa povratnom vrednošću čvora, najboljaVrednost, usled negacije vrednosti koja se javlja prilikom primene negamaks agoritma, kao i zbog parametra boja. Negamaks povratna vrednost čvora je heuristička sa tačke gledišta čvora igrača koji je trenutno na potezu.

Negamaks rezultat se poklapa sa minimaks rezultatom koji se odnosi na čvorove gde je igrač A na potezu, kao i onde gde je igrač A maksimizujući igrač u minimaks ekvivalentu. Negamaks uvek pretražuje maksimum vrednosti za sve svoje čvorove. Otuda, kada su čvorovi igrača B u pitanju, minimaks rezultat predstavlja negaciju njihovih negamaks rezultata. Igrač B je minimizujući igrač u minimaks ekvivalentu.

Određene varijacije negamaks algoritma mogu da izostave parametre boja. U tom slučaju, funkcija koja izračunava heurističku vrednost vraća vrednost sa tačke gledišta čvora trenutnog igrača.

Negamaks algoritam sa alfa-beta pretragom[uredi | uredi izvor]

Određene optimizacije minimaks algoritma su jednako primenjive za negamaks algoritam. Alfa-beta pretraga može smanjiti broj čvorova koji negamaks algoritam obrađuje u pretrazi na sličan način kao u minimaks algoritmu.

Ovaj pseudokod prikazuje negamaks algoritam sa alfa-beta pretragom ograničene dubine.

01 function negamax(čvor, dubina, α, β, boja)
02     if dubina = 0 ili čvor je terminalni čvor
03         return boja * heuristička vrednost čvora

04     potomciČvora := GenerišiPoteze(čvor)
05     potomciČvora := RedosledPoteza(potomciČvora)
06     najboljaVrednost := −∞
07     foreach potomak u potomciČvora
08         v := −negamax(potomak, dubina − 1, −β, −α, −boja)
09         najboljaVrednost := max( najboljaVrednost, v )
10         α := max( α, v )
11         if α ≥ β
12             return β
13     return najboljaVrednost
Inicijalni poziv za koren igrača A
negamaxVrednostČvora := negamax( koren, dubina, −∞, +∞, 1)

Alfa (α) i beta (β) predstavljaju gornje i donje granice za vrednosti čvorova potomaka za datu dubinu stabla. Negamaks postavlja argumente α i β za koren stabla na najmanju i najveću moguću vrednost. Ostali algoritmi pretrage, kao što su negaskaut i MTD, mogu inicijalizovati α i β određenim alternativnim vrednostima kako bi se kasnije unapredile performanse pretrage stabla.

Kada negamaks naiđe na vrednost čvora potomka izvan alfa-beta granica, tada se odsecaju određeni delovi stabla i eliminišu se iz dalje pretrage. Odsecanja su implicitno zasnovana na povratnim vrednostima čvorova, najboljaVrednost. Vrednost čvora koja odgovara inicijalnom intervalu od α do β predstavlja konkretnu (pravu) vrednost čvora. Ta vrednost se poklapa sa vrednošću koju bi vratio i osnovni negamaks algoritam, bez odsecanja i bez ikakvih α i β granica. Ukoliko je povratna vrednost čvora izvan intervala, onda ta vrednost predstavlja gornju (ukoliko je vrednost ≤ α) ili donju (ukoliko je vrednost ≥ β) granicu za pravu vrednost datog čvora. Alfa-beta pretraga na kraju odbacuje sve vrednosti koje proizilaze iz granica. Te vrednosti ne doprinose i ne utiču na krajnji rezultat algoritma.

Pseudokod prikazuje fail-soft varijacije alfa-beta pretrage. Fail-soft nikada ne vraća α ili β direktno kao vrednost čvora. Tako, vrednost čvora može biti izvan inicjalnih granica α-β intervala. Sa druge strane, fail-hard alfa-beta pretraga uvek ograničava vrednost čvora alfa-beta intervalom.

Ova implementacija takođe prikazuje opcioni redosled poteza u odnosu na forič petlju koja obrađuje čvorove potomaka. Redosled poteza je optimizacija alfa-beta pretrage koja pokušava da pogodi čvorove potomaka koji imaju vrednost najpribližniju vrednosti datog čvora. Algoritam najpre pretražuje te čvorove. Rezultat dobrog nagađanja je poboljšanje vremena, a česta alfa-beta odsecanja utiču na odsecanje dodatnih grana i preostalih potomaka čvorova u stablu.

Negamaks algoritam sa alfa-beta pretragom i transpozicionim tabelama[uredi | uredi izvor]

Transpozicione tabele selektivno pamte vrednosti čvorova u stablu. Transpozicija je termin koji podrazumeva da se do date pozicije na tabli igre (game board) može doći primenjujući niz različitih poteza u igri.

Kada negamaks pretražuje stablo, i nailazi na isti čvor više puta, transpoziciona tabela može vratiti prethodno izračunatu vrednost čvora, preskačući potencijalno dug proces ponovnog izračunavanja vrednosti čvora. Efikasnost negamaks algoritma se naročito poboljšava za ona stabla sa mnogo puteva do datog čvora.

Ispod je prikazan pseudokod koji dodaje transpozicione tabele u algoritam sa alfa-beta pretragom:

function negamax(čvor, dubina, α, β, boa)
    alfaOrig := α

    // Transpoziciona Lukap Tabela, čvor je lukap ključ za ttUnos
    ttUnos := TranspozicionLukapTabela( čvor )
    if ttUnos je validan i ttUnos.dubina ≥ dubina
        if ttUnos.Flag = EXACT
            return ttUnos.Vrednost
        else if ttUnos.Flag = LOWERBOUND
            α := max( α, ttUnos.Vrednost)
        else if ttUnos.Flag = UPPERBOUND
            β := min( β, ttUnos.Vrednost)
        endif
        if α ≥ β
            return ttUnos.Vrednost
    endif

    if dubina = 0 ili čvor je terminalni čvor
        return boja * heuristička vrednost čvora

    najboljaVrednost := -∞
    potomciČvora := GenerišiPoteze(čvor)
    potomciČvora := RedosledPoteza(potomciČvora)
    foreach potomak u potomciČvora
        vr := -negamax(potomak, dubina - 1, -β, -α, -boja)
        najboljaVrednost := max( najboljaVrednost, vr )
        α := max( α, vr )
        if α ≥ β
            break

    // Transpoziciona Tabela Store; čvor je lukap ključ za ttUnos
    ttUnos.Vrednost := najboljaVrednost
    if najboljaVrednost ≤ alfaOrig
        ttUnos.Flag := UPPERBOUND
    else if najboljaVrednost ≥ β
        ttUnos.Flag := LOWERBOUND
    else
        ttUnos.Flag := EXACT
    endif
    ttUnos.dubina := dubina	
    TranspozicionaTabelaStore( čvor, ttUnos )

    return najboljaVrednost
Inicijalni poziv za koren igrača A
negamaxVrednostČvora := negamax( koren, dubina, −∞, +∞, 1)

Alfa-beta odsecanja, kao i ograničena maksimalna dubina pretrage u negamaks algoritmu mogu dovesti do delimično netačne, i u potpunosti zanemarene procene čvorova u stablu. Ovo komplikuje dodavanje transpozicione tabele zarad optimizacije negamaks algoritma. Nedovoljno je pratiti samo najboljaVrednost datog čvora u tabeli, zato što najboljaVrednost ne mora ujedno biti i prava vrednost čvora. Kod stoga mora sačuvati i povratiti vezu najboljaVrednost sa određenim alfa-beta parametrima i dubinom pretrage za svaku stavku transpozicione tabele.

Transpozicione tabele će obično izostaviti ili zameniti prethodne vrednosti određenih čvorova u svojim tabelama. Ovo je neophodno pošto je broj čvorova koji negamaks posećuje često veći od veličine same tabele. Izgubljene ili izostavljene stavke u tabeli neće uticati na krajnji negamaks rezultat. Međutim, izgubljene stavke mogu zahtevati od negamaks pretrage češće ponovno izračunavanje određenih vrednosti čvorova stabla, što utiče na njegovu efikasnost.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Schaeffer, Jonathan. The History Heuristic and Alpha-Beta Search Enhancements in Practice. CiteSeerX 10.1.1.56.9124Slobodan pristup. , IEEE Transactions on Pattern Analysis and Machine Intelligence, 1989
  2. ^ Breuker, Dennis M. Memory versus Search in Games, Maastricht University, October 16, 1998

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]