Základy teorie her

Typy her. Hra v normálním tvaru. Hra v explicitním tvaru. Optimální strategie
u antagonistických her. Minimax. Alfa-beta prořezávání.

Úvodní definice

Základy matematické teorie her položili v první pol. 20. století John von Neumann a Oskar Morgernstern. Teorie her je disciplína aplikované matematiky, která analyzuje široké spektrum konfliktních rozhodovacích situací, které mohou nastat kdekoliv, kde dochází ke střetu zájmů.
Herně-teoretické modely se pak snaží tyto konfliktní situace nejen analyzovat, ale sestavením matematického modelu daného konfliktu a pomocí výpočtů se snaží nalézt co nejlepší strategie pro konkrétní účastníky takových konfliktů. Teorie her se uplatňuje v mnoha oblastech lidské činnosti od ekonomie, přes politologii až například po sociologii a biologii.

Základní pojmy teorie her

•         hra - je každá konfliktní situace.

•         hráč - účastník hry, který svým chováním může ovlivnit její výsledek; hráč může být buď racionální (usiluje o optimální výsledek hry) nebo indiferentní (výsledek hry je mu lhostejný)

•        strategie - předpis, kterým je určena jedna alternativa chování hráče při hře

•        optimální strategie – hráčem zvolená alternativa, která je pro něj nejvýhodnější

•        prostor strategií – seznam všech možných alternativ, které jsou hráči dostupné

•        výplata hráče - kvantitativně vyjádřený výsledek hry, posuzovaný z hlediska uvažovaného hráče (kladná hodnota - užitek, záporná hodnota - prohra)

•         výplatní funkce hráče - předpis pro výplatu v závislosti na zvolené strategii

Typy her

Hry (a jejich modely) můžeme posuzovat z celé řady hledisek. Jsou to

•         počet hráčů – obvykle předpokládáme konečný počet hráčů; nejmenší možný počet je 2 (příkladem mohou být šachy, dáma, piškvorky, ale i bilaterální politická vyjednávání),

•         počet strategií – může být konečný i nekonečný; nás budou zajímat hry s konečným počtem strategií (šachy, dáma, piškvorky). U nekonečných strategií hraje roli i načasování jednotlivých „tahů“,

•         typ výhry – rozlišují se tzv. hry s konstantním součtem a hry s nekonstantním součtem; pro hry s konstantním součtem platí, že pro každou volbu strategií je součet výplatních funkcí (výher) všech hráčů konstantní
Speciálním případem her s konstantním součtem jsou hry s nulovým součtem, při kterých to, co jeden hráč vyhraje, musí druhý hráč (v případě her o dvou hráčích) prohrát – příkladem jsou šachy, piškvorky apod. U her s nenulovým součtem zisk jednoho hráče nemusí pro jiného hráče nutně znamenat ztrátu (vězňovo dilema i různá vyjednávání).

•         počet tahů – hry strategické předpokládají, že hráči provedou jeden tah (rozhodnutí) současně (např. kámen-nůžky-papír nebo vězňovo dilema), hry tahové jsou založeny na sekvenci tahů, při kterých se hráči střídají (šachy, piškvorky)

•         dostupná informace – hry s úplnou informací (např. šachy) a hry s neúplnou informací (např. poker); v hrách s úplnými informacemi má každý hráč k dispozici stejné informace týkající se hry jako všichni ostatní.

•         spolupráce – u kooperativních hrách mohou hráči vytvářet koalice případně se mezi sebou domlouvat, u nekooperativních hrách to možné není

Ne všechny kombinace jednotlivých hledisek mohou nastat: každá hra dvou hráčů s konstantním součtem je nekooperativní – pro takovou hru se někdy používá termín antagonistická hra.

Hra v normálním tvaru

Všichni hráči se rozhodují najednou (současně).

Hra v normálním tvaru je definována množinou

{Q,X­1,…,Xn,u1(x1,…,xn),…,un(x1,…,xn)}

kde Q = {1,…,n} jsou hráči, množiny X1,…,Xn jsou množiny strategií a ui(x1,…,xn) jsou výhry hráče i pro jednotlivé strategie. Hra v normálním tvaru je obvykle znázorněna pomocí matice. Hru pro dva hráče vidíme na Obr. 1. Zde hráč číslo 1 vybírá ze strategií s1,…,sk a hráč číslo 2 vybírá ze strategií t1,…,tl. Předpokládejme, že se jedná o hru s nulovým součtem, v takové hře

u1(si, tj) = -u2(si, tj)

a proto stačí zapisovat jen hodnotu užitkové funkce (výhry) pro jednoho hráče.

Obrázek  SEQ Obrázek \* ARABIC 1 - Hra pro dva hráče v normálním tvaru

Hra v explicitním (rozvinutém) tvaru

Explicitní tvar hry bývá používán k formalizaci her, ve kterých hraje roli pořadí tahů. Hráči se rozhodují postupně – nejprve se rozhodne a jedná (udělá tah) nějaký hráč, potom se rozhodne a jedná další hráč. Hry jsou reprezentovány jako stromy. Každý uzel zde reprezentuje místo, ve kterém některý z hráčů vybírá tah, každá hrana odpovídá možnému tahu.

Optimální strategie u antagonistických her

Cílem každého racionálního hráče je vyhrát, jinými slovy maximalizovat svoji výhru. Zabývejme se pouze strategiemi antagonistických her dvou hráčů, které jsou zapsány v normálním tvaru (viz Obr. 1). Uvedený zápis vyjadřuje hodnoty výher (výplat) hráče č. 1. Tento hráč volí mezi svými strategiemi (řádky i matice u(si,tj)) tak, aby jeho výhra byla maximální. Přitom ví, že jeho protihráč, hráč č. 2 bude své strategie volit tak, aby výhru hráče č. 1 minimalizoval. Hráč č. 1 tedy volí takovou strategii s*, pro který minimální hodnota jeho výhry (v rámci tohoto řádku) bude ze všech řádků maximální:

s*= maxi minj u(si,tj)

Hráč. č. 2 postupuje analogicky. Mezi svými strategiemi (sloupci j matice u(si,tj)) volí tu strategii t*, pro kterou maximální hodnota jeho prohry (v rámci tohoto sloupce) bude ze všech sloupců minimální.

t*= minj maxi u(si,tj)

Definice: Nechť

u(s*,t*) = maxi minj u(si,tj) = minj maxi u(si,tj)

Potom u(s*,t*) se nazývá sedlový bod matice a představuje tzv. cenu hry. Dvojce strategií (s*,t*) se nazývá rovnovážný bod.

Teorie her se snaží nalézt v každé hře rovnovážný bod, v němž hráči volí takové strategie, že žádný z nich nemá důvod svou strategii změnit za předpokladu, že nikdo z ostatních svou strategii nezmění. Pokud rovnovážný bod existuje, optimální strategie obou hráčů se nazývají ryzí strategie.

Minimax

Minimax je algoritmus, používaný pro hraní strategických her mezi dvěma a více hráči. Principem algoritmu je procházení stromu hry a minimalizace maximálních možných ztrát. Typickým úkolem je nalézt nejlepší tah v dané pozici.

Za předpokladu racionality protihráče volím takový tah, aby následný nejlepší tah protihráče byl z mého pohledu nejméně nebezpečný. Minimaxovou strategii mohu hledat na základě zápisu hry v rozvinutém tvaru. Tento zápis je tvořen stromem, kde každému uzlu přiřadíme hodnoty na základě hodnot výher (hodnot funkce u) v podstromu daného uzlu. Jednotlivé uzly stromu se dělí do MAX úrovní (uzly se sudou hloubkou) a MIN úrovní (uzly s lichou hloubkou). Na každé MAX úrovni vybírá první hráč tah, který maximalizuje hodnotu určitého kritéria, na každé MIN úrovni vybírá druhý hráč tah, který minimalizuje hodnotu tohoto kritéria. (kritériu hodnotí tahy z pohledu prvního hráče). Tímto kritériem je tzv. MINIMAX hodnota:

kde s jsou všichni následníci uzlu n.

Ohodnocování uzlů probíhá odspodu - od listů reprezentujících koncovou situaci hry směrem ke kořeni.

Aplikace minimaxového přístupu předpokládá, že známe celý strom řešení. V reálných hrách to může být nepřekonatelný problém. Hra tic-tac-toe má 26830 různých partií, strom řešení pro šachy pak může mít okolo 35100 uzlů (průměrný počet větvení 35, průměrná délka partie 50 tahů). Navíc, časová náročnost algoritmu O(bd), tedy exponenciální podle hloubky prohledávání (a paměťová náročnost je O(bd) – jde totiž o prohledávání do hloubky). Řešením je:

·         omezit hloubku prohledávání

·         pracovat pouze s odhady místo s přesnými hodnotami užitku pro jednotlivé uzly


 

 

Pseudokód
function minimax(node, depth, maximizingPlayer)
    if depth = 0 or node is a terminal node
        return the heuristic value of node
    if maximizingPlayer
        bestValue := -∞
        for each child of node
            val := minimax(child, depth - 1, FALSE)
            bestValue := max(bestValue, val);
        return bestValue
    else
        bestValue := +∞
        for each child of node
            val := minimax(child, depth - 1, TRUE)
            bestValue := min(bestValue, val);
        return bestValue
 
(* Inicializační volání pro hráč maximalizujícího tah *)
minimax(origin, depth, TRUE)

 

Alfa-beta prořezávání

Metody (algoritmy), které vedou k tomu, že se prohledává pouze část stromu, se nazývají metody prořezávání. Říkáme, že se neperspektivní větev stromu stavového prostoru odřízne a neprohledává se. Prořezávání není nijak vázané na minimaxovou metodu prohledávání, ale dá se na ní poměrně snadno ukázat. Jednou z nejjednodušších metod prořezávání je α-β prořezávání (alfa-beta prořezávání, Alpha-beta pruning).

Do minimaxové metody zavedeme dvě proměnné: α a β. Proměnná α představuje maximální dosažitelné hodnocení maximalizujícího hráče – tedy nejvyšší hodnotu. Proměnná β představuje maximální dosažitelné hodnocení minimalizujícího hráče – tedy nejnižší (nejzápornější) hodnotu. Slovo dosažitelné je zde velmi důležité. Stále platí předpoklad minimaxové metody, že se protihráč bude snažit vyhrát. Předpokládáme tedy, že bude vybírat tahy, které jsou pro něj nejvýhodnější a naopak pro nás jsou nejméně výhodné. Tahy, které protihráč pravděpodobně neprovede, tedy musíme považovat za nedosažitelné.

Hodnota α se počítá na maximalizující úrovni jako maximum z hodnocení potomků aktuálního stavu a hodnoty α z nadřazené úrovně. Na minimalizující úrovni se hodnota α nijak nemění. Analogicky, hodnota β se počítá jako minimum z hodnocení potomků a z hodnoty β předané z nadřazené úrovně. Hodnoty α a β tedy nejsou globální maxima/minima hodnocení, ale probublávají mezi jednotlivými částmi stromu. K odříznutí části stromu může dojít na kterékoliv z úrovní v okamžiku, kdy je splněna podmínka α ≥ β . Na maximalizující úrovni lze tuto podmínku interpretovat tak, že jsme právě dosáhli tahu (s hodnocením α), který je pro soupeře více nevýhodný (je větší jak β). Soupeř bude táhnout tak, aby se do aktuální větve stromu nedostal, a tedy nemá smysl ji dále prozkoumávat.

Pseudokód

function alphabeta(node, depth, α, β, maximizingPlayer)

      if depth = 0 or node is a terminal node

          return the heuristic value of node

      if maximizingPlayer

          for each child of node

              α := max(α, alphabeta(child, depth - 1, α, β, FALSE))

              if β ≤ α

                  break (* β cut-off *)

          return α

      else

          for each child of node

              β := min(β, alphabeta(child, depth - 1, α, β, TRUE))

              if β ≤ α

                  break (* α cut-off *)

          return β

 

(*Inicializační volání*)
alphabeta(origin, depth, -∞, +∞, TRUE)