LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Šachové myšlení (2) - minimax

Většina programátorských úloh má jednoduché, správné a velmi pomalé řešení typu projdi všechny možnosti. V šachách se jmenuje minimax.

15.3.2006 06:00 | Jan Němec | Články autora | přečteno 22662×

Minimax

V minulém dílu jsem ukázal program, který porovnává pozice po jediném zahraném tahu. Zkoušeli jsme z výchozího postavení postupně zahrát všechny přípustné tahy a vzniklé pozice ohodnocovali jednoduchou statickou ohodnocovací funkcí. Zahráli jsme tah, který vedl k nejlepší pozici.

Uvedený program nepočítá odpovědi soupeře na náš tah a to je jeho největší slabina. Sebere klidně dámou krytého pěšce, nebrání se jednotahovému matu a podobně. Naštěstí je velmi jednoduché program zlepšit. Místo statické ohodnocovací funkce po každém zahraném půltahu zavoláme kód, který vyzkouší všechny odpovědi soupeře na náš tah. Jednu po druhé zahraje, ohodnotí je statickou ohodnocovací funkcí a zahraje zpět a zapamatuje si hodnotu nejlepšího tahu, tentokrát z hlediska soupeře. Za cenu konkrétního našeho tahu z úvodní pozice je tak prohlášena cena nejlepší soupeřovy odpovědi. Algoritmus z prvního dílu se nazývá propočet do hloubky jedna, naše vylepšení pak analogicky propočet do hloubky dva.

Jistě není problém program dále upravovat, aby počítal do hloubky 3 nebo 4 nebo lépe do nějaké obecné hloubky n určené parametrem. Takto zobecněný algoritmus se jmenuje minimax, neboť když se za jednoho hráče snažíme v propočtu maximalizovat cenu pozice, za druhého ji tím minimalizujeme a o půltah dále zase naopak. Implementuje se obvykle pomocí jedné rekurzivní funkce minimax, která má jako parametry pozici a hloubku propočtu, návratovou hodnotou je cena pozice po propočtu do dané hloubky. Místo statické ohodnocovací funkce hodnotaPozice volá minimax sám sebe do hloubky o jedničku menší. Pouze při hloubce nula zavolá hodnotaPozice a v koncových pozicí vrací konstanty pro mat a remízu a v propočtu příslušné varianty nepokračuje.

int minimax(Pozice p, int hloubka) {
  Tahy t;
  int i, indexNejlepsiho;
  int cena;

  /* V případě koncové pozice nebo nulové hloubky propočet ukončíme. */

  if (jsemVMatu(p)) return -MAT;
  if (remiza(p)) return 0;
  /* Dávat mat nemůžu, protože pozice je po tahu soupeře. */

  if (hloubka <= 0) return hodnotaPozice(p);

  /* Cyklus přes tahy je podobný jako u předchozího algoritmu. */
  t = generujTahy(p);
  nejlepsi = -NEKONECNO;

  for (i = 0; i < tahy.pocet; i++) {
    zahrajTah(p, t[i]);
    cena = -minimax(p, hloubka - 1);
    zahrajTahZpet(p, t[i]);
    /* Nejlepší tah nás nezajímá, důležitá je jen jeho hodnota. */
    if (cena > nejlepsi) nejlepsi = cena;
  }

  /* Pokud je výsledná hodnota velmi velká nebo velmi malá, znamená, 
     že dávám nebo dostávám mat. V tom případě je třeba cenu upravit, 
     aby se např. z "bílý dává 3. půltahem mat" stalo "černý dostává 
     4. půltahem mat", neboť se návratem do volající funkce posunu 
     o jeden půltah. Toto je nezbytné, jinak by program nepreferoval 
     např. mat 1. tahem před matem 2. tahem. */

  if (nejlepsi > MNOHO) nejlepsi--;
  if (nejlepsi < -MNOHO) nejlepsi++;

  return nejlepsi;
}

/* Hlavní funkce se téměř nezměnila. Pouze přibyl parametr hloubka 
   a místo hodnotaPozice voláme minimax. */

V kořeni stromu propočtu je postup nepatrně jiný, především nás zajímá nejlepší tah samotný a nikoliv pouze jeho cena.

Tah nejlepsiTah(Pozice p, int hloubka) {
  Tahy t;
  int i, indexNejlepsiho;
  int cena, nejlepsi;

  t = generujTahy(p);
  nejlepsi = -NEKONECNO;

  for (i = 0; i < tahy.pocet; i++) {
    zahrajTah(p, t[i]);
    cena = -minimax(p, hloubka);
    zahrajTahZpet(p, t[i]);
    if (cena > nejlepsi) {
      nejlepsi = cena;
      indexNejlepsiho = i;
    }
  }
  return t[indexNejlepsiho];
}

Na šachovnici je v základním postavení jen 16 pěšců, každý z nich může táhnout nejvýše šestkrát, potom se promění v nějakou figuru. Když nepočítám krále, které není možné sebrat, kamenů je celkem 30, každý z nich může být sebrán nejvýše jednou. Pokud se během 50 tahů, tedy 100 půltahů, netáhne pěšcem ani nesebere žádný kámen, je partie dána za remízu. Díky tomu můžeme shora odhadnout délku partie na (16 * 6 + 30 + 1) * 100 = 12700 půltahů. Algoritmus minimax, s parametrem hloubky propočtu 12700, bude teoreticky hrát šachy naprosto dokonale. Alespoň v tom smyslu, že žádnou remízovou pozici neprohraje, každou vyhranou pozici nejen vyhraje, ale dokonce (vůči dokonalému soupeři) tím nejrychlejším způsobem. V prohrané pozici pak bude porážku alespoň maximálně oddalovat.

Z lidského pohledu má algoritmus určité nedostatky pouze v pozicích remízových. Například v pozici s pěšcem navíc, kde se soupeř může jen tak tak ubránit program klidně odevzdá úplně zadarmo třeba dva pěšce, pokud se tak dostane do pozice, kde sice horko těžko, ale přeci jen udrží remízu. Tento drobný problém lze snadno vyřešit kombinací s propočtem do malé hloubky, který bude jen vybírat mezi jednotlivými remízovými tahy z hlavního propočtu do hloubky 12700.

Po uvedení algoritmu je dobrým zvykem zamyslet se nad jeho časovou a paměťovou složitostí. Z hlediska paměti je všechno v pořádku, neboť na zásobníku rekurzivního propočtu je v jednom okamžiku vždy jen jedna varianta. Kdyby se programu opravdu podařilo najít variantu dlouhou 12700 půltahů a jedna instance funkce minimax zabrala 1 kB, vejdeme se i s volajícím kódem do 13 MB. To je pozoruhodné zjištění, na propočet stromu tak bohaté hry, jakou jsou šachy, nám stačí pár MB. Proč tedy není programování šachů dětskou hrou?

Pokračování příště

V příštím dílu se zaměříme na časovou složitost a ukážeme si, proč lze minimax použít pouze proti slabým soupeřům a jak je možné jej překvapivě jednoduše a účinně vylepšit.

Verze pro tisk

pridej.cz

 

DISKUZE

f-ce 24.3.2006 12:03 Birkof
  L Re: f-ce 24.3.2006 12:31 Jan Němec




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

11.2.2018 23:11 /Petr Ježek
Hledáte lehký a rychlý prolížeč PDF souborů? Pokud vás již omrzelo čekat na načítání stránek či jiné nešvary, zkuste xreader.
Přidat komentář

11.2.2018 20:35 /Redakce Linuxsoft.cz
Třetí ročník odborné IT konference na téma Cloud computing v praxi proběhne ve čtvrtek 1. března 2018 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 16 hod. odpoledne. Konference o trendech v oblasti cloud computingu nabídne i informace o konkrétních možnostech využívání cloudů a řešení vybraných otázek souvisejících s provozem IT infrastruktury.
Přidat komentář

15.1.2018 0:51 /František Kučera
První letošní pražský sraz se koná již tento čtvrtek 18. ledna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Vítáni jsou všichni příznivci svobodného softwaru a hardwaru, ESP32, DIY, CNC, SDR nebo dobrého piva. Prvních deset účastníků srazu obdrží samolepku There Is No Cloud… just other people's computers. od Free Software Foundation.
Přidat komentář

14.11.2017 16:56 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tradičně první čtvrtek před třetím pátkem v měsíci: 16. listopadu od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.11.2017 11:06 /Redakce Linuxsoft.cz
PR: 4. ročník odborné IT konference na téma Datová centra pro business proběhne již ve čtvrtek 23. listopadu 2017 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00. Konference o návrhu, budování, správě a efektivním využívání datových center nabídne odpovědi na aktuální a často řešené otázky, např Jaké jsou aktuální trendy v oblasti datových center a jak je využít pro vlastní prospěch? Jak zajistit pro firmu či jinou organizaci odpovídající služby datových center? Podle jakých kritérií vybrat dodavatele služeb? Jak volit součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně spravovat datové centrum? Jak eliminovat možná rizika? apod.
Přidat komentář

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze