<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Defluo</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Defluo"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Defluo"/>
	<updated>2026-05-03T13:02:57Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Te%C3%B3ria_grafov&amp;diff=7043</id>
		<title>Teória grafov</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Te%C3%B3ria_grafov&amp;diff=7043"/>
		<updated>2010-09-07T13:45:30Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;2&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
=Teória grafov=&lt;br /&gt;
&lt;br /&gt;
V matematike a počítačových vedách sa [http://en.wikipedia.org/wiki/Graph_theory teória grafov] zaoberá štúdiom [http://sk.wikipedia.org/wiki/Graf_(matematika) grafov], teda grafických matematických štruktúr používaných na modelovanie vzájomných vzťahov medzi objektami z určitej množiny. Teória grafov je súčasťou diskrétnej matematiky.&lt;br /&gt;
&lt;br /&gt;
==Základné pojmy a charakteristika grafov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr3-priklad_neorientovaneho_grafu.png‎ | thumb | 200px | '''Obr. 3 – Príklad neorientovaného grafu''' &amp;lt;br&amp;gt;&lt;br /&gt;
''a'' je '''slučka''', ''b'' a ''c'' sú '''rovnobežné hrany''', ''4'' je '''izolovaný vrchol''', ''d'' a ''e'' sú '''susedné (priľahlé) hrany'''; uzol ''1'' '''leží''' na hranách ''a'', ''b'', ''c'', hrana ''c'' '''spája''' uzly ''1'' a ''2''. ]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr4-priklad_orientovaneho_grafu.png‎ | thumb | 160px | '''Obr. 4 – Príklad orientovaného grafu''' &amp;lt;br&amp;gt;&lt;br /&gt;
''E'' je '''slučka''', ''a'' a ''b'' sú '''nesúhlasne rovnobežné hrany''', ''c'' a ''d'' sú '''súhlasne rovnobežné hrany'''. ''2'' je '''počiatočný''' a ''4'' '''koncový uzol''' hrany ''f''.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
V matematike sa pojem '''graf''' používa najčastejšie v zmysle grafického znázornenia určitej funkcie , napr. y=f(2x+3). Grafy, ktoré sú objektom štúdia teórie grafov sú však svojou povahou veľmi vzdialené od grafov funkcií. Sú to objekty tvorené určitou množinou bodov a čiar, ktoré tieto body spájajú na základe určitých pravidiel. Graf môžu tvoriť napr. mestá pospájané železnicou, rôzne miesta prepojené mostami ale aj elektrické siete alebo chemické zlúčeniny. &lt;br /&gt;
&lt;br /&gt;
K tomu, aby bol zadaný [http://en.wikipedia.org/wiki/Graph_(mathematics) graf] (označíme ho ''φ'') je treba, aby boli dané dve množiny: množina '''vrcholov''' ''V'' (predtým zmieňované body v grafe) a množina '''hrán''' ''H'' (zmienené čiary). Vo väčšine prípadov sú obe množiny konečné, avšak nie je to nutná podmienka existencie grafu.  Graf potom zapisujeme ako ''φ=VH'', prípadne ''φ=(V,H)''. &lt;br /&gt;
&lt;br /&gt;
Ku každej hrane musia patriť dva vrcholy, ktoré sú touto hranou spojené a nazývajú sa '''krajné vrcholy hrany'''. Hovoríme aj, že krajné vrcholy '''ležia''' na spoločnej hrane. Vrcholy sa nazývajú '''susednými''' ak existuje taká hrana, na ktorej oba vrcholy ležia. Môže však existovať aj vrchol, ktorý nepatrí k žiadnej hrane. V takomto prípade hovoríme o '''izolovanom vrchole'''. K tomu, aby z množín vrcholov a uzlov mohol vzniknúť graf je ďalej potrebné poznať pravidlo, na základe ktorého vieme určiť, ktoré dvojice vrcholov majú byť spojené hranou. Jednotlivé hrany môžu tiež určovať smer vzájomnej interakcie krajných vrcholov. Vtedy hovoríme o '''orientovanej hrane''' a označujeme ju šípkou. Graf, ktorý obsahuje len orientované hrany sa nazýva '''orientovaný graf'''. Ak sú v grafe orientované aj neorientované hrany, ide o '''zmiešaný graf'''. Krajné vrcholy pri orientovaných hranách sú potom nazvané '''počiatočný''' a '''koncový vrchol''' hrany. '''Slučku''' v grafe tvorí hrana, ktorej krajné vrcholy splývajú (sú tvorené jedným vrcholom). '''Priľahlé hrany''' sú také, ktoré majú aspoň jeden spoločný krajný vrchol. Dve navzájom rôzne hrany, ktoré majú rovnaké krajné vrcholy sa v neorientovanom grafe nazývajú '''rovnobežné'''. V orientovanom grafe potom takéto hrany rozlišujeme podľa orientácie na '''súhlasne rovnobežné''' a '''nesúhlasne rovnobežné'''. Neorientovaný graf je '''jednoduchý''' ak v ňom neexistujú žiadne rovnobežné hrany.&amp;lt;ref name=&amp;quot;necas_jiri&amp;quot;&amp;gt;Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Základné druhy grafových štruktúr==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr5-zakladne_druhy_grafovych_struktur.png‎ | thumb | 400px | right | '''Obr. 5 – Základné druhy grafových štruktúr''']]&lt;br /&gt;
Najvšeobecnejšiu grafovú štruktúru predstavuje '''pseudomigraf'''. Od tohto typu grafu sa potom postupnými obmedzeniami dajú získať všetky podskupiny. Dôležitú úlohu pri určovaní typu grafovej štruktúry hrá '''násobná hrana'''. Rovnobežné hrany sa nazývajú '''násobné''' ak sú všetky neorientované alebo ak sú všetky orientované a majú rovnakú orientáciu. Rôzne druhy grafov sú znázornené na obr. 5. Počet hrán, ktoré vychádzajú z jedného vrcholu sa označuje aj ako '''stupeň vrcholu'''.&lt;br /&gt;
&lt;br /&gt;
'''Graf''' neobsahuje orientované hrany, slučky ani násobné hrany. Takýto graf sa nazýva aj '''jednoduchý graf'''. '''Multigraf''' neobsahuje orientované hrany a slučky. '''Pseudograf''' neobsahuje orientované hrany.&lt;br /&gt;
&lt;br /&gt;
'''Digraf''' (z angl. digraph = directed graph, v prekl. orientovaný graf) neobsahuje neorientované hrany, slučky a násobné hrany (rôzne orientované rovnobežné hrany obsahovať môže). '''Multidigraf''' neobsahuje neorientované hrany a slučky. '''Pseudodigraf''' neobsahuje len neorientované hrany.&lt;br /&gt;
&lt;br /&gt;
'''Migraf''' (z angl. mixed graph, v prekl. zmiešaný graf) neobsahuje násobné hrany a slučky. '''Multimigraf''' neobsahuje slučky. '''Pseudomigraf''' môže obsahovať všetky druhy hrán.&amp;lt;ref name=&amp;quot;plesnik_jan&amp;quot;&amp;gt;Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Každý z týchto typov grafových štruktúr môže mať k prvkom svojej štruktúry priradenú určitú hodnotu (váhu), ktorá reprezentuje výhodnosť prechodu daným prvkom. Takýto graf potom nazývame '''ohodnotený''' alebo '''vážený graf'''. Rozoznávame '''hranovo ohodnotený graf''' a '''vrcholovo ohodnotený graf'''. Ohodnotené hrany môžu napr. reprezentovať vzdialenosti medzi miestami, ktoré predstavujú jednotlivé vrcholy. Ohodnotené môžu byť hrany aj vrcholy zároveň a to aj viacerými hodnotami, kde každá hodnota predstavuje inú veličinu (napr. vzdialenosť, čas, cenu, atď). Pomocou takto ohodnotených grafov sa dá reprezentovať a riešiť množstvo praktických problémov, z ktorých najvýznamnejšie sú rozpísané v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
==Typy problémov riešených pomocou teórie grafov==&lt;br /&gt;
&lt;br /&gt;
Štúdiom a hľadaním riešení problémov reprezentovaných rôznymi typmi grafov sa zaoberá [[#Teória grafov | teória grafov]]. História teórie grafov je hlavne oproti iným oblastiam matematiky pomerne krátka. Prvé zmienky o úlohách vyjadrených grafmi súviseli s rôznymi hlavolamami a za skutočný počiatok teórie grafov sa považuje až riešenie hlavolamu známeho pod názvom [http://en.wikipedia.org/wiki/Konigsberg_Bridge Problém Kaliningradských mostov] (vtedajší Königsberg, v preklade Kráľovec), ktoré publikoval významný matematik [http://en.wikipedia.org/wiki/Leonhard_Euler Leonhard Euler] v roku 1736. Prvú knihu o teórii grafov však napísal až v roku 1936 [http://en.wikipedia.org/wiki/D%C3%A9nes_K%C3%B6nig Dénes König]. Odvtedy sa toto odvetvie matematiky výrazne rozvíja a nachádza uplatnenie v rôznych oblastiach ľudskej činnosti.&lt;br /&gt;
&lt;br /&gt;
===Hľadanie subgrafov (podgrafov)===&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr6-graf_a_jeho_podgraf.png | thumb | 200px | '''Obr. 6 – Graf a jeho podgraf ''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr7-jedna_z_kostier_grafu.png | thumb | 110px | '''Obr. 7 – Jedna z kostier grafu''' &amp;lt;br&amp;gt; (hrubo vyznačená)]]&lt;br /&gt;
|}&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Podgraf Podgraf] tvorí v teórii grafov podmnožinu určitého grafu. '''Podgraf''' vznikne vylúčením niektorých vrcholov z množiny grafu a zároveň vylúčením hrán, ktoré spájali tieto odstránené vrcholy. V takom prípade sa jedná o '''indukovaný podgraf'''. Vylúčený môže byť navyše aj ľubovoľný počet hrán. Ak množina vrcholov podgrafu H je zhodná s množinou vrcholov grafu G, V(H)=V(G), potom hovoríme, že podgraf H je [http://sk.wikipedia.org/wiki/Faktor_grafu faktorom] grafu G. [http://sk.wikipedia.org/wiki/Kostra_grafu Kostrou] grafu nazývame taký faktor grafu, ktorý neobsahuje tzv. [http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf) kružnice]. '''Kružnicou''' je taký graf, ktorý je tvorený uzavretou postupnosťou prepojených vrcholov. Kružnica môže byť orientovaná alebo neorientovaná. Graf, ktorý ako podgraf obsahuje kružnicu je označovaný ako '''cyklický'''. V opačnom prípade sa jedná o [http://sk.wikipedia.org/wiki/Strom_(graf) acyklický graf (strom)].&lt;br /&gt;
&lt;br /&gt;
Jedným z najznámejších aloritmov na hľadanie podgrafov je napr. [http://en.wikipedia.org/wiki/Prim's_algorithm Primov algoritmus] na hľadanie minimálnej kostry grafu.&lt;br /&gt;
&lt;br /&gt;
===Farbenie grafov===&lt;br /&gt;
&lt;br /&gt;
Farbenie grafov je špeciálnym prípadom označovania prvkov grafov. Rozlišujú sa tri druhy farbenia grafov. Pri '''farbení vrcholov''' sa vrcholy značia takou farbou, aby žiadne dva vrcholy spojené spoločnou hranou nemali rovnakú farbu. Pri '''farbení hrán''' nesmú mať rovnakú farbu zase hrany, ktoré spájajú rovnaký vrchol. Poslednou možnosťou je '''farbenie plôch''', ktorých hranice sú v planárnom grafe určené hranami. [http://sk.wikipedia.org/wiki/Plan%C3%A1rny_graf Planárny (rovinný) graf] je taký, kde sa nepretínajú žiadne hrany. Oba problémy farbenia hrán a plôch môžu byť prevedené na farbenie vrcholov.&amp;lt;ref name=&amp;quot;graph_coloring&amp;quot;&amp;gt;Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problémy s farbením grafov sa vyskytli v 19. storočí pri vyfarbovaní štátov na mapách. Bolo treba určiť minimálny potrebný počet farieb, ktoré zabezpečia, že žiadne dva susediace štáty nebudú rovnakej farby. Populárnou aplikáciou farbenia grafov je napr. hra sudoku. &lt;br /&gt;
&lt;br /&gt;
===Hľadanie cesty===&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr8-kaliningradske_mosty.png | thumb | 160px | '''Obr. 8 – Kaliningradské mosty''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr9-kaliningradske_mosty_v_grafe.png‎ | thumb | 130px | '''Obr. 9 – Kaliningradské mosty v grafe''']]&lt;br /&gt;
|}&lt;br /&gt;
Úlohy s hľadaním určitej cesty v grafoch sú pravdepodobne najstaršími úlohami v teórii grafov vôbec a aj dodnes najviac problémov riešených pomocou grafov súvisí s hľadaním určitej optimálnej cesty. Ako príklad možno uviesť problém [http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg Kaliningradských mostov], ktorý vyriešil [http://en.wikipedia.org/wiki/Euler Euler]. &lt;br /&gt;
&lt;br /&gt;
Cez Kaliningrad tečie rieka Pregoľa (vtedajšia Pregel), ktorá vytvára dva ostrovy a tým rozdeľuje mesto na štyri časti. Jednotlivé časti boli pospájané siedmimi mostami ako je to znázornené na obr. 11. Úloha hlavolamu spočívala v navrhnutí cesty, ktorá by viedla cez všetky mosty, ale po každom moste sa smie prejsť len raz. Euler dokázal, že riešenie takúto cestu nájsť nie je možné. Hneď na začiatku si uvedomil, že trasa akou sa prechádza po danej časti mesta je irelevantná a záleží len na tom v akom poradí sa počas cesty bude prechádzať cez jednotlivé mosty. Štyri časti mesta teda znázornil len jednoduchými bodmi, ktoré potom poprepájal čiarami predstavujúcimi mosty ako je to ukázané na obr. 9. Tým sa aj zároveň ukazuje, že interpretácia problémov pomocou grafov nezávisí od mnohých vlastností skutočných objektov. V tomto prípade sa napr. neberie do úvahy vzdialenosť mostov, tvar prejdenej trasy, tvar rieky, ani tvar častí mesta.&lt;br /&gt;
&lt;br /&gt;
Euler potom poukázal na to, že aby bolo možné prejsť nejakým vrcholom (pevninou) bez toho, aby po jednej hrane (most) neprešlo viackrát je potrebné, aby daný vrchol obsahoval aspoň dve hrany. Jednu hranu treba na vstup do vrcholu a druhú na výstup. To znamená, že na to, aby sa dalo prejsť všetkými hranami spojenými s daným vrcholom, musí byť daný vrchol párneho stupňa (mať párny počet hrán). To však nemusí platiť pre vstupný a výstupný vrchol, pretože z týchto dvoch vrcholov sa nemusíme ďalej presúvať. Daný graf má štyri vrcholy, kde dva môžeme považovať za vstupné a výstupné.  Pre tieto platí, že môžu obsahovať aj nepárny počet hrán. No ďalšie dva vrcholy musia už byť párneho stupňa, pretože sa na nich vstúpi a musí sa z nich dať aj vystúpiť. Keďže všetky vrcholy v danej úlohe sú nepárneho stupňa (stupeň vrchola a je 5, ostatné majú stupeň 3), úloha je neriešiteľná. &lt;br /&gt;
&lt;br /&gt;
Postupnosť vrcholov a hrán, ktorými prechádzame v grafe sa nazýva '''sled'''. Počet hrán, ktorými v danom slede prejdeme označujeme ako '''dĺžka sledu'''. V teórii grafom sa často riešia problémy hľadania určitej cesty alebo ťahu. '''Cesta''' je sled, v ktorom sa vrcholmi v slede prechádza iba raz. Pri '''ťahu''' sa zase v slede neprechádza viackrát po hranách. Frekventovanými sú napríklad úlohy, pri ktorých treba nájsť kružnicu, ktorá prechádza všetkými vrcholmi grafu. Jedná sa o tzv. [http://en.wikipedia.org/wiki/Hamilton_path Hamiltonovskú cestu], ktorá je pomenovaná podľa [http://en.wikipedia.org/wiki/William_Rowan_Hamilton Williama Rovana Hamiltona], ktorý vynašiel tzv. [http://en.wikipedia.org/wiki/Icosian_game Icosianskú hru], dnes známu aj ako Hamiltonov hlavolam. Hamiltonovská cesta aplikovaná na hranovo ohodnotené grafy je známa ako [http://sk.wikipedia.org/wiki/Probl%C3%A9m_obchodn%C3%A9ho_cestuj%C3%BAceho problém obchodného cestujúceho]. V tomto probléme má obchodný cestujúci navštíviť ''n'' miest, ale precestovať pritom najkratšiu vzdialenosť. Podobným typom je tzv. [http://en.wikipedia.org/wiki/Euler_path Eulerovský ťah], kde je potrebné nájsť sled, pri ktorom sa prejde všetkými hranami práve raz. Toto je aj prípadom problému siedmych Kaliningradských mostov.&lt;br /&gt;
&lt;br /&gt;
Vyhľadávanie optimálneho sledu v grafoch súvisí s mnohými praktickými problémami od hľadania vhodnej cesty pre kropiace auto, určovanie trasy doručovania pošty až po určovanie trasy v GPS navigáciách alebo v robotike.&lt;br /&gt;
&lt;br /&gt;
===Sieť toku===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Flow_network Sieť toku] je orientovaný graf, v ktorom každá hrana má svoju '''kapacitu''' a do každej hrany prúdi '''tok'''. Množstvo toku danou hranou nesmie prekročiť jej kapacitu. Pre každý vrchol, okrem zdroja toku a odvodu toku, musí platiť, že množstvo “pritekajúceho“ toku do vrcholu je rovné množstvu “odtekajúceho“ toku z vrcholu.&amp;lt;ref name=&amp;quot;flow_network&amp;quot;&amp;gt;Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&amp;lt;/ref&amp;gt;&lt;br /&gt;
	Tento druh grafov sa využíva na modelovanie premávky v dopravnom systéme, tekutín v potrubí, prúdu v elektrických sieťach a iných praktických aplikáciách.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacie stromy===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr10-problem_obch_cest_vyjadr_rozh_stromom.png‎ | thumb | 350px | right | '''Obr. 10 – Problém obchodného cestujúceho vyjadrený rozhodovacím stromom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Decision_tree Rozhodovací strom] je druhom orientovaného grafu, ktorý neobsahuje žiadne kružnice. V počiatočnom vrchole takéhoto grafu nekončí žiadna hrana a v ostatných vrcholoch končí vždy práve jedna hrana. Každý vrchol, okrem posledných - '''listových vrcholo'''v, predstavuje určitú '''rozhodovaciu situáciu'''. Po rozhodnutí vo vrchole vedie postup cez hranu, ktorá zodpovedá danému rozhodnutiu v počiatočnom vrchole. Takto sa pokračuje až do koncového vrcholu, ktorý reprezentuje výsledný stav ovplyvnený rozhodnutiami v jednotlivých vrcholoch rozhodovacieho stromu. &lt;br /&gt;
&lt;br /&gt;
Obrázok 10 znázorňuje interpretáciu riešenia problému obchodného cestujúceho pomocou rozhodovacieho stromu. V každom vrchole stromu sa obchodný cestujúci rozhoduje, ktorým mestom sa môže ďalej vydať. Jednotlivé hrany sú ohodnotené vzdialenosťou, ktorú musí prejsť. V danom prípade má úloha dve riešenia, kde cesta obchodného cestujúceho bude mať dĺžku 32. &lt;br /&gt;
&lt;br /&gt;
Cieľom rozhodovacích stromov je rozdeliť alebo charakterizovať určité objekty do podkategórií podľa určitých vlastností. Prvý uzol by mal obsahovať najvšeobecnejšiu charakteristiku skúmaných objektov, v ďalších by sa postupne mali vlastnosti objektu postupne viac a viac upresňovať až pokiaľ sa nedôjde k poslednému vrcholu. Vtedy je už objekt daný na vstupe pomerne presne charakterizovaný (za predpokladu správnych podmienok v jednotlivých vrcholoch). Príkladom použitia rozhodovacích stromov môžu byť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]].&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=7042</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=7042"/>
		<updated>2010-09-07T13:44:18Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
=Úprava stránky Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma= &lt;br /&gt;
&lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. &amp;lt;ref name=&amp;quot;dama_hra&amp;quot;&amp;gt;Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&amp;lt;/ref&amp;gt;). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Spustiteľná verzia programu=&lt;br /&gt;
&lt;br /&gt;
Spustiteľná verzia programu hry dáma je dostupná [http://defluo333.co.cc/files/Dama.zip TU]. &lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.] http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.]http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=7041</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=7041"/>
		<updated>2010-09-07T13:42:06Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
=Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách=&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 (prebraný z &amp;lt;ref name=&amp;quot;wroblewski_piotr&amp;quot;&amp;gt;Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&amp;lt;/ref&amp;gt;) je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. '''Algoritmus vyfarbovania''' je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry).&amp;lt;ref name=&amp;quot;game_tree&amp;quot;&amp;gt;Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt;. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
Začína sa z nulovej (koreňovej) pozície a ako prvý je na ťahu hráč ''A'', ktorý podľa dohody ''maximalizuje'' (vyberá si také ťahy, ktoré budú mať za následok pozície s čo najvyšším ohodnotením). Vygeneruje sa prvý možný ťah – ''a''  hráča ''A'', následkom čoho vznikne pozícia označená číslom ''1''. Potom sa postupne podľa znázorneného číselného poradia generujú všetky možné ťahy hráča ''B''. Keďže pozície vytvorené následkom ťahov hráča ''B'' sú zároveň listovými vrcholmi, tak sa v minimaxovej funkcii ohodnotia. Po vygenerovaní všetkých ťahov hráča ''B'' (označených ''2'' až ''6'') sa funkcia naspäť vráti k vrcholu č.''1'' a ohodnotí ho najmenšou (pretože hráč ''B'' minimalizuje) hodnotou z hodnôt pozícií patriacich pod vrchol ''1''. Pridelí sa mu teda hodnota ''-1''. Rovnako sa postupuje aj pre ťahy ''b'' a ''c''. Keď už sú ohodnotené všetky vrcholy v druhej úrovni stromu (vrcholy č. ''1'',''7'',''13''), funkcia sa rekurzívne vráti ku koreňovému vrcholu a ohodnotí ho najvyššou (pretože hráč ''A'' maximalizuje) hodnotou z vrcholov o jednu úroveň nižších. Zistili sme teda, že z koreňovej pozície (vrchol ''0'') bude najlepšie urobiť ťah ''c'' , ktorý pri najlepšom ťahu hráča ''B'' vráti hodnotu ''1'', ktorá je výhodná pre hráča ''A''. Ak by hráč ''A'' urobil na začiatku ťah ''b'', bol by to pre neho najhorší ťah, pretože výsledná pozícia po dvoch polťahoch by mohla mať hodnotu až ''-2'', čo je veľmi výhodné pre hráča ''B''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png‎ | thumb | 400px | right | '''Obr. 14 – Princíp alfa-beta orezávania''']]&lt;br /&gt;
Ide o techniku, ktorej účelom je urýchliť prehľadávanie [[#Herné stromy | stromu]] v metóde [[#Algoritmus minimax | minimax]]. Dosahuje sa to zmenšením počtu vetiev, ktoré musí algoritmus prejsť. Výhodou použitia tejto techniky je, že nemení výslednú hodnotu (koreňovú) hodnotu nájdenú pomocou minimaxovej metódy. Použitie minimaxu s [http://en.wikipedia.org/wiki/Alpha-beta_pruning alfa-beta orezávaním] teda produkuje rovnaké výsledky ako samotný algoritmus [[#Algoritmus minimax | minimax]]. Názov alfa-beta orézavanie je odvodený od dvoch premenných, ktoré sa v tomto algoritme používajú. Premenná ''alfa'' predstavuje minimálne isté skóre maximalizujúceho hráča a ''beta'' maximálne isté skóre minimalizujúceho hráča. Inak povedané alfa je maximálna dolná hranica možných ťahov maximalizujúceho hráča a beta minimálna horná hranica možných ťahov minimalizujúceho hráča. Tieto dve premenné udávajú interval hodnôt prehľadávaných pozícií. Princíp algoritmu je zobrazený na obrázku 14.&lt;br /&gt;
&lt;br /&gt;
Prvý je na ťahu maximalizujúci hráč. Po ňom ide minimalizujúci hráč a urobí ťah, ktorý zároveň vedie ku koncovej pozícii hry. Tu sa zmenené pozície hry ohodnotia (podľa poradia pri jednotlivých políčkach). Minimalizujúci hráč potom vyberie ťah, ktorý bude mať za následok pozíciu s čo najmenšou hodnotou. To je hodnota ''2'', ktorá sa presunie do ohodnotenia pozície o vrstvu vyššie. Maximalizujúci hráč potom urobí druhý svoj možný ťah a následne ťahá minimalizujúci hráč. Znova sa ohodnotí koncová pozícia (políčko č.''5''), ktorá má hodnotu ''-2''. Je jasné, že minimalizujúci hráč si vyberie pozíciu buď s touto hodnotou (''-2'') alebo ešte nižšou. Pre maximalizujúceho hráča je však podstatné, aby hodnota bola čo najvyššia a po prvom ťahu by pozícia mala hodnotu ''2'', čo je lepšie ako ''-2'' (prípadne ešte menej), takže ďalej už ťahy minimalizujúceho hráča skúmať netreba, pretože pre maximalizujúceho hráča je jasné, že jeho druhý ťah je nevýhodný. Rovnaká situácia nastane aj pri treťom možnom ťahu maximalizujúceho hráča, kedy znova minimalizujúci hráč môže urobiť ťah, ktorý bude mať za následok pozíciu s hodnotou menšou ako ''2''. Preto ani tu netreba uvažovať všetky ťahy minimalizujúceho hráča.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=7040</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=7040"/>
		<updated>2010-09-07T13:39:14Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. &amp;lt;ref name=&amp;quot;dama_hra&amp;quot;&amp;gt;Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&amp;lt;/ref&amp;gt;). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Spustiteľná verzia programu=&lt;br /&gt;
&lt;br /&gt;
Spustiteľná verzia programu hry dáma je dostupná [http://defluo333.co.cc/files/Dama.zip TU]. &lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.] http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.]http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=7039</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=7039"/>
		<updated>2010-09-07T13:33:28Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= =&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 (prebraný z &amp;lt;ref name=&amp;quot;wroblewski_piotr&amp;quot;&amp;gt;Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&amp;lt;/ref&amp;gt;) je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. '''Algoritmus vyfarbovania''' je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry).&amp;lt;ref name=&amp;quot;game_tree&amp;quot;&amp;gt;Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt;. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
Začína sa z nulovej (koreňovej) pozície a ako prvý je na ťahu hráč ''A'', ktorý podľa dohody ''maximalizuje'' (vyberá si také ťahy, ktoré budú mať za následok pozície s čo najvyšším ohodnotením). Vygeneruje sa prvý možný ťah – ''a''  hráča ''A'', následkom čoho vznikne pozícia označená číslom ''1''. Potom sa postupne podľa znázorneného číselného poradia generujú všetky možné ťahy hráča ''B''. Keďže pozície vytvorené následkom ťahov hráča ''B'' sú zároveň listovými vrcholmi, tak sa v minimaxovej funkcii ohodnotia. Po vygenerovaní všetkých ťahov hráča ''B'' (označených ''2'' až ''6'') sa funkcia naspäť vráti k vrcholu č.''1'' a ohodnotí ho najmenšou (pretože hráč ''B'' minimalizuje) hodnotou z hodnôt pozícií patriacich pod vrchol ''1''. Pridelí sa mu teda hodnota ''-1''. Rovnako sa postupuje aj pre ťahy ''b'' a ''c''. Keď už sú ohodnotené všetky vrcholy v druhej úrovni stromu (vrcholy č. ''1'',''7'',''13''), funkcia sa rekurzívne vráti ku koreňovému vrcholu a ohodnotí ho najvyššou (pretože hráč ''A'' maximalizuje) hodnotou z vrcholov o jednu úroveň nižších. Zistili sme teda, že z koreňovej pozície (vrchol ''0'') bude najlepšie urobiť ťah ''c'' , ktorý pri najlepšom ťahu hráča ''B'' vráti hodnotu ''1'', ktorá je výhodná pre hráča ''A''. Ak by hráč ''A'' urobil na začiatku ťah ''b'', bol by to pre neho najhorší ťah, pretože výsledná pozícia po dvoch polťahoch by mohla mať hodnotu až ''-2'', čo je veľmi výhodné pre hráča ''B''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png‎ | thumb | 400px | right | '''Obr. 14 – Princíp alfa-beta orezávania''']]&lt;br /&gt;
Ide o techniku, ktorej účelom je urýchliť prehľadávanie [[#Herné stromy | stromu]] v metóde [[#Algoritmus minimax | minimax]]. Dosahuje sa to zmenšením počtu vetiev, ktoré musí algoritmus prejsť. Výhodou použitia tejto techniky je, že nemení výslednú hodnotu (koreňovú) hodnotu nájdenú pomocou minimaxovej metódy. Použitie minimaxu s [http://en.wikipedia.org/wiki/Alpha-beta_pruning alfa-beta orezávaním] teda produkuje rovnaké výsledky ako samotný algoritmus [[#Algoritmus minimax | minimax]]. Názov alfa-beta orézavanie je odvodený od dvoch premenných, ktoré sa v tomto algoritme používajú. Premenná ''alfa'' predstavuje minimálne isté skóre maximalizujúceho hráča a ''beta'' maximálne isté skóre minimalizujúceho hráča. Inak povedané alfa je maximálna dolná hranica možných ťahov maximalizujúceho hráča a beta minimálna horná hranica možných ťahov minimalizujúceho hráča. Tieto dve premenné udávajú interval hodnôt prehľadávaných pozícií. Princíp algoritmu je zobrazený na obrázku 14.&lt;br /&gt;
&lt;br /&gt;
Prvý je na ťahu maximalizujúci hráč. Po ňom ide minimalizujúci hráč a urobí ťah, ktorý zároveň vedie ku koncovej pozícii hry. Tu sa zmenené pozície hry ohodnotia (podľa poradia pri jednotlivých políčkach). Minimalizujúci hráč potom vyberie ťah, ktorý bude mať za následok pozíciu s čo najmenšou hodnotou. To je hodnota ''2'', ktorá sa presunie do ohodnotenia pozície o vrstvu vyššie. Maximalizujúci hráč potom urobí druhý svoj možný ťah a následne ťahá minimalizujúci hráč. Znova sa ohodnotí koncová pozícia (políčko č.''5''), ktorá má hodnotu ''-2''. Je jasné, že minimalizujúci hráč si vyberie pozíciu buď s touto hodnotou (''-2'') alebo ešte nižšou. Pre maximalizujúceho hráča je však podstatné, aby hodnota bola čo najvyššia a po prvom ťahu by pozícia mala hodnotu ''2'', čo je lepšie ako ''-2'' (prípadne ešte menej), takže ďalej už ťahy minimalizujúceho hráča skúmať netreba, pretože pre maximalizujúceho hráča je jasné, že jeho druhý ťah je nevýhodný. Rovnaká situácia nastane aj pri treťom možnom ťahu maximalizujúceho hráča, kedy znova minimalizujúci hráč môže urobiť ťah, ktorý bude mať za následok pozíciu s hodnotou menšou ako ''2''. Preto ani tu netreba uvažovať všetky ťahy minimalizujúceho hráča.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Te%C3%B3ria_grafov&amp;diff=7038</id>
		<title>Teória grafov</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Te%C3%B3ria_grafov&amp;diff=7038"/>
		<updated>2010-09-07T13:27:02Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;2&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Teória grafov=&lt;br /&gt;
&lt;br /&gt;
V matematike a počítačových vedách sa [http://en.wikipedia.org/wiki/Graph_theory teória grafov] zaoberá štúdiom [http://sk.wikipedia.org/wiki/Graf_(matematika) grafov], teda grafických matematických štruktúr používaných na modelovanie vzájomných vzťahov medzi objektami z určitej množiny. Teória grafov je súčasťou diskrétnej matematiky.&lt;br /&gt;
&lt;br /&gt;
==Základné pojmy a charakteristika grafov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr3-priklad_neorientovaneho_grafu.png‎ | thumb | 200px | '''Obr. 3 – Príklad neorientovaného grafu''' &amp;lt;br&amp;gt;&lt;br /&gt;
''a'' je '''slučka''', ''b'' a ''c'' sú '''rovnobežné hrany''', ''4'' je '''izolovaný vrchol''', ''d'' a ''e'' sú '''susedné (priľahlé) hrany'''; uzol ''1'' '''leží''' na hranách ''a'', ''b'', ''c'', hrana ''c'' '''spája''' uzly ''1'' a ''2''. ]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr4-priklad_orientovaneho_grafu.png‎ | thumb | 160px | '''Obr. 4 – Príklad orientovaného grafu''' &amp;lt;br&amp;gt;&lt;br /&gt;
''E'' je '''slučka''', ''a'' a ''b'' sú '''nesúhlasne rovnobežné hrany''', ''c'' a ''d'' sú '''súhlasne rovnobežné hrany'''. ''2'' je '''počiatočný''' a ''4'' '''koncový uzol''' hrany ''f''.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
V matematike sa pojem '''graf''' používa najčastejšie v zmysle grafického znázornenia určitej funkcie , napr. y=f(2x+3). Grafy, ktoré sú objektom štúdia teórie grafov sú však svojou povahou veľmi vzdialené od grafov funkcií. Sú to objekty tvorené určitou množinou bodov a čiar, ktoré tieto body spájajú na základe určitých pravidiel. Graf môžu tvoriť napr. mestá pospájané železnicou, rôzne miesta prepojené mostami ale aj elektrické siete alebo chemické zlúčeniny. &lt;br /&gt;
&lt;br /&gt;
K tomu, aby bol zadaný [http://en.wikipedia.org/wiki/Graph_(mathematics) graf] (označíme ho ''φ'') je treba, aby boli dané dve množiny: množina '''vrcholov''' ''V'' (predtým zmieňované body v grafe) a množina '''hrán''' ''H'' (zmienené čiary). Vo väčšine prípadov sú obe množiny konečné, avšak nie je to nutná podmienka existencie grafu.  Graf potom zapisujeme ako ''φ=VH'', prípadne ''φ=(V,H)''. &lt;br /&gt;
&lt;br /&gt;
Ku každej hrane musia patriť dva vrcholy, ktoré sú touto hranou spojené a nazývajú sa '''krajné vrcholy hrany'''. Hovoríme aj, že krajné vrcholy '''ležia''' na spoločnej hrane. Vrcholy sa nazývajú '''susednými''' ak existuje taká hrana, na ktorej oba vrcholy ležia. Môže však existovať aj vrchol, ktorý nepatrí k žiadnej hrane. V takomto prípade hovoríme o '''izolovanom vrchole'''. K tomu, aby z množín vrcholov a uzlov mohol vzniknúť graf je ďalej potrebné poznať pravidlo, na základe ktorého vieme určiť, ktoré dvojice vrcholov majú byť spojené hranou. Jednotlivé hrany môžu tiež určovať smer vzájomnej interakcie krajných vrcholov. Vtedy hovoríme o '''orientovanej hrane''' a označujeme ju šípkou. Graf, ktorý obsahuje len orientované hrany sa nazýva '''orientovaný graf'''. Ak sú v grafe orientované aj neorientované hrany, ide o '''zmiešaný graf'''. Krajné vrcholy pri orientovaných hranách sú potom nazvané '''počiatočný''' a '''koncový vrchol''' hrany. '''Slučku''' v grafe tvorí hrana, ktorej krajné vrcholy splývajú (sú tvorené jedným vrcholom). '''Priľahlé hrany''' sú také, ktoré majú aspoň jeden spoločný krajný vrchol. Dve navzájom rôzne hrany, ktoré majú rovnaké krajné vrcholy sa v neorientovanom grafe nazývajú '''rovnobežné'''. V orientovanom grafe potom takéto hrany rozlišujeme podľa orientácie na '''súhlasne rovnobežné''' a '''nesúhlasne rovnobežné'''. Neorientovaný graf je '''jednoduchý''' ak v ňom neexistujú žiadne rovnobežné hrany.&amp;lt;ref name=&amp;quot;necas_jiri&amp;quot;&amp;gt;Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Základné druhy grafových štruktúr==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr5-zakladne_druhy_grafovych_struktur.png‎ | thumb | 400px | right | '''Obr. 5 – Základné druhy grafových štruktúr''']]&lt;br /&gt;
Najvšeobecnejšiu grafovú štruktúru predstavuje '''pseudomigraf'''. Od tohto typu grafu sa potom postupnými obmedzeniami dajú získať všetky podskupiny. Dôležitú úlohu pri určovaní typu grafovej štruktúry hrá '''násobná hrana'''. Rovnobežné hrany sa nazývajú '''násobné''' ak sú všetky neorientované alebo ak sú všetky orientované a majú rovnakú orientáciu. Rôzne druhy grafov sú znázornené na obr. 5. Počet hrán, ktoré vychádzajú z jedného vrcholu sa označuje aj ako '''stupeň vrcholu'''.&lt;br /&gt;
&lt;br /&gt;
'''Graf''' neobsahuje orientované hrany, slučky ani násobné hrany. Takýto graf sa nazýva aj '''jednoduchý graf'''. '''Multigraf''' neobsahuje orientované hrany a slučky. '''Pseudograf''' neobsahuje orientované hrany.&lt;br /&gt;
&lt;br /&gt;
'''Digraf''' (z angl. digraph = directed graph, v prekl. orientovaný graf) neobsahuje neorientované hrany, slučky a násobné hrany (rôzne orientované rovnobežné hrany obsahovať môže). '''Multidigraf''' neobsahuje neorientované hrany a slučky. '''Pseudodigraf''' neobsahuje len neorientované hrany.&lt;br /&gt;
&lt;br /&gt;
'''Migraf''' (z angl. mixed graph, v prekl. zmiešaný graf) neobsahuje násobné hrany a slučky. '''Multimigraf''' neobsahuje slučky. '''Pseudomigraf''' môže obsahovať všetky druhy hrán.&amp;lt;ref name=&amp;quot;plesnik_jan&amp;quot;&amp;gt;Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Každý z týchto typov grafových štruktúr môže mať k prvkom svojej štruktúry priradenú určitú hodnotu (váhu), ktorá reprezentuje výhodnosť prechodu daným prvkom. Takýto graf potom nazývame '''ohodnotený''' alebo '''vážený graf'''. Rozoznávame '''hranovo ohodnotený graf''' a '''vrcholovo ohodnotený graf'''. Ohodnotené hrany môžu napr. reprezentovať vzdialenosti medzi miestami, ktoré predstavujú jednotlivé vrcholy. Ohodnotené môžu byť hrany aj vrcholy zároveň a to aj viacerými hodnotami, kde každá hodnota predstavuje inú veličinu (napr. vzdialenosť, čas, cenu, atď). Pomocou takto ohodnotených grafov sa dá reprezentovať a riešiť množstvo praktických problémov, z ktorých najvýznamnejšie sú rozpísané v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
==Typy problémov riešených pomocou teórie grafov==&lt;br /&gt;
&lt;br /&gt;
Štúdiom a hľadaním riešení problémov reprezentovaných rôznymi typmi grafov sa zaoberá [[#Teória grafov | teória grafov]]. História teórie grafov je hlavne oproti iným oblastiam matematiky pomerne krátka. Prvé zmienky o úlohách vyjadrených grafmi súviseli s rôznymi hlavolamami a za skutočný počiatok teórie grafov sa považuje až riešenie hlavolamu známeho pod názvom [http://en.wikipedia.org/wiki/Konigsberg_Bridge Problém Kaliningradských mostov] (vtedajší Königsberg, v preklade Kráľovec), ktoré publikoval významný matematik [http://en.wikipedia.org/wiki/Leonhard_Euler Leonhard Euler] v roku 1736. Prvú knihu o teórii grafov však napísal až v roku 1936 [http://en.wikipedia.org/wiki/D%C3%A9nes_K%C3%B6nig Dénes König]. Odvtedy sa toto odvetvie matematiky výrazne rozvíja a nachádza uplatnenie v rôznych oblastiach ľudskej činnosti.&lt;br /&gt;
&lt;br /&gt;
===Hľadanie subgrafov (podgrafov)===&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr6-graf_a_jeho_podgraf.png | thumb | 200px | '''Obr. 6 – Graf a jeho podgraf ''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr7-jedna_z_kostier_grafu.png | thumb | 110px | '''Obr. 7 – Jedna z kostier grafu''' &amp;lt;br&amp;gt; (hrubo vyznačená)]]&lt;br /&gt;
|}&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Podgraf Podgraf] tvorí v teórii grafov podmnožinu určitého grafu. '''Podgraf''' vznikne vylúčením niektorých vrcholov z množiny grafu a zároveň vylúčením hrán, ktoré spájali tieto odstránené vrcholy. V takom prípade sa jedná o '''indukovaný podgraf'''. Vylúčený môže byť navyše aj ľubovoľný počet hrán. Ak množina vrcholov podgrafu H je zhodná s množinou vrcholov grafu G, V(H)=V(G), potom hovoríme, že podgraf H je [http://sk.wikipedia.org/wiki/Faktor_grafu faktorom] grafu G. [http://sk.wikipedia.org/wiki/Kostra_grafu Kostrou] grafu nazývame taký faktor grafu, ktorý neobsahuje tzv. [http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf) kružnice]. '''Kružnicou''' je taký graf, ktorý je tvorený uzavretou postupnosťou prepojených vrcholov. Kružnica môže byť orientovaná alebo neorientovaná. Graf, ktorý ako podgraf obsahuje kružnicu je označovaný ako '''cyklický'''. V opačnom prípade sa jedná o [http://sk.wikipedia.org/wiki/Strom_(graf) acyklický graf (strom)].&lt;br /&gt;
&lt;br /&gt;
Jedným z najznámejších aloritmov na hľadanie podgrafov je napr. [http://en.wikipedia.org/wiki/Prim's_algorithm Primov algoritmus] na hľadanie minimálnej kostry grafu.&lt;br /&gt;
&lt;br /&gt;
===Farbenie grafov===&lt;br /&gt;
&lt;br /&gt;
Farbenie grafov je špeciálnym prípadom označovania prvkov grafov. Rozlišujú sa tri druhy farbenia grafov. Pri '''farbení vrcholov''' sa vrcholy značia takou farbou, aby žiadne dva vrcholy spojené spoločnou hranou nemali rovnakú farbu. Pri '''farbení hrán''' nesmú mať rovnakú farbu zase hrany, ktoré spájajú rovnaký vrchol. Poslednou možnosťou je '''farbenie plôch''', ktorých hranice sú v planárnom grafe určené hranami. [http://sk.wikipedia.org/wiki/Plan%C3%A1rny_graf Planárny (rovinný) graf] je taký, kde sa nepretínajú žiadne hrany. Oba problémy farbenia hrán a plôch môžu byť prevedené na farbenie vrcholov.&amp;lt;ref name=&amp;quot;graph_coloring&amp;quot;&amp;gt;Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problémy s farbením grafov sa vyskytli v 19. storočí pri vyfarbovaní štátov na mapách. Bolo treba určiť minimálny potrebný počet farieb, ktoré zabezpečia, že žiadne dva susediace štáty nebudú rovnakej farby. Populárnou aplikáciou farbenia grafov je napr. hra sudoku. &lt;br /&gt;
&lt;br /&gt;
===Hľadanie cesty===&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr8-kaliningradske_mosty.png | thumb | 160px | '''Obr. 8 – Kaliningradské mosty''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr9-kaliningradske_mosty_v_grafe.png‎ | thumb | 130px | '''Obr. 9 – Kaliningradské mosty v grafe''']]&lt;br /&gt;
|}&lt;br /&gt;
Úlohy s hľadaním určitej cesty v grafoch sú pravdepodobne najstaršími úlohami v teórii grafov vôbec a aj dodnes najviac problémov riešených pomocou grafov súvisí s hľadaním určitej optimálnej cesty. Ako príklad možno uviesť problém [http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg Kaliningradských mostov], ktorý vyriešil [http://en.wikipedia.org/wiki/Euler Euler]. &lt;br /&gt;
&lt;br /&gt;
Cez Kaliningrad tečie rieka Pregoľa (vtedajšia Pregel), ktorá vytvára dva ostrovy a tým rozdeľuje mesto na štyri časti. Jednotlivé časti boli pospájané siedmimi mostami ako je to znázornené na obr. 11. Úloha hlavolamu spočívala v navrhnutí cesty, ktorá by viedla cez všetky mosty, ale po každom moste sa smie prejsť len raz. Euler dokázal, že riešenie takúto cestu nájsť nie je možné. Hneď na začiatku si uvedomil, že trasa akou sa prechádza po danej časti mesta je irelevantná a záleží len na tom v akom poradí sa počas cesty bude prechádzať cez jednotlivé mosty. Štyri časti mesta teda znázornil len jednoduchými bodmi, ktoré potom poprepájal čiarami predstavujúcimi mosty ako je to ukázané na obr. 9. Tým sa aj zároveň ukazuje, že interpretácia problémov pomocou grafov nezávisí od mnohých vlastností skutočných objektov. V tomto prípade sa napr. neberie do úvahy vzdialenosť mostov, tvar prejdenej trasy, tvar rieky, ani tvar častí mesta.&lt;br /&gt;
&lt;br /&gt;
Euler potom poukázal na to, že aby bolo možné prejsť nejakým vrcholom (pevninou) bez toho, aby po jednej hrane (most) neprešlo viackrát je potrebné, aby daný vrchol obsahoval aspoň dve hrany. Jednu hranu treba na vstup do vrcholu a druhú na výstup. To znamená, že na to, aby sa dalo prejsť všetkými hranami spojenými s daným vrcholom, musí byť daný vrchol párneho stupňa (mať párny počet hrán). To však nemusí platiť pre vstupný a výstupný vrchol, pretože z týchto dvoch vrcholov sa nemusíme ďalej presúvať. Daný graf má štyri vrcholy, kde dva môžeme považovať za vstupné a výstupné.  Pre tieto platí, že môžu obsahovať aj nepárny počet hrán. No ďalšie dva vrcholy musia už byť párneho stupňa, pretože sa na nich vstúpi a musí sa z nich dať aj vystúpiť. Keďže všetky vrcholy v danej úlohe sú nepárneho stupňa (stupeň vrchola a je 5, ostatné majú stupeň 3), úloha je neriešiteľná. &lt;br /&gt;
&lt;br /&gt;
Postupnosť vrcholov a hrán, ktorými prechádzame v grafe sa nazýva '''sled'''. Počet hrán, ktorými v danom slede prejdeme označujeme ako '''dĺžka sledu'''. V teórii grafom sa často riešia problémy hľadania určitej cesty alebo ťahu. '''Cesta''' je sled, v ktorom sa vrcholmi v slede prechádza iba raz. Pri '''ťahu''' sa zase v slede neprechádza viackrát po hranách. Frekventovanými sú napríklad úlohy, pri ktorých treba nájsť kružnicu, ktorá prechádza všetkými vrcholmi grafu. Jedná sa o tzv. [http://en.wikipedia.org/wiki/Hamilton_path Hamiltonovskú cestu], ktorá je pomenovaná podľa [http://en.wikipedia.org/wiki/William_Rowan_Hamilton Williama Rovana Hamiltona], ktorý vynašiel tzv. [http://en.wikipedia.org/wiki/Icosian_game Icosianskú hru], dnes známu aj ako Hamiltonov hlavolam. Hamiltonovská cesta aplikovaná na hranovo ohodnotené grafy je známa ako [http://sk.wikipedia.org/wiki/Probl%C3%A9m_obchodn%C3%A9ho_cestuj%C3%BAceho problém obchodného cestujúceho]. V tomto probléme má obchodný cestujúci navštíviť ''n'' miest, ale precestovať pritom najkratšiu vzdialenosť. Podobným typom je tzv. [http://en.wikipedia.org/wiki/Euler_path Eulerovský ťah], kde je potrebné nájsť sled, pri ktorom sa prejde všetkými hranami práve raz. Toto je aj prípadom problému siedmych Kaliningradských mostov.&lt;br /&gt;
&lt;br /&gt;
Vyhľadávanie optimálneho sledu v grafoch súvisí s mnohými praktickými problémami od hľadania vhodnej cesty pre kropiace auto, určovanie trasy doručovania pošty až po určovanie trasy v GPS navigáciách alebo v robotike.&lt;br /&gt;
&lt;br /&gt;
===Sieť toku===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Flow_network Sieť toku] je orientovaný graf, v ktorom každá hrana má svoju '''kapacitu''' a do každej hrany prúdi '''tok'''. Množstvo toku danou hranou nesmie prekročiť jej kapacitu. Pre každý vrchol, okrem zdroja toku a odvodu toku, musí platiť, že množstvo “pritekajúceho“ toku do vrcholu je rovné množstvu “odtekajúceho“ toku z vrcholu.&amp;lt;ref name=&amp;quot;flow_network&amp;quot;&amp;gt;Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&amp;lt;/ref&amp;gt;&lt;br /&gt;
	Tento druh grafov sa využíva na modelovanie premávky v dopravnom systéme, tekutín v potrubí, prúdu v elektrických sieťach a iných praktických aplikáciách.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacie stromy===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr10-problem_obch_cest_vyjadr_rozh_stromom.png‎ | thumb | 350px | right | '''Obr. 10 – Problém obchodného cestujúceho vyjadrený rozhodovacím stromom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Decision_tree Rozhodovací strom] je druhom orientovaného grafu, ktorý neobsahuje žiadne kružnice. V počiatočnom vrchole takéhoto grafu nekončí žiadna hrana a v ostatných vrcholoch končí vždy práve jedna hrana. Každý vrchol, okrem posledných - '''listových vrcholo'''v, predstavuje určitú '''rozhodovaciu situáciu'''. Po rozhodnutí vo vrchole vedie postup cez hranu, ktorá zodpovedá danému rozhodnutiu v počiatočnom vrchole. Takto sa pokračuje až do koncového vrcholu, ktorý reprezentuje výsledný stav ovplyvnený rozhodnutiami v jednotlivých vrcholoch rozhodovacieho stromu. &lt;br /&gt;
&lt;br /&gt;
Obrázok 10 znázorňuje interpretáciu riešenia problému obchodného cestujúceho pomocou rozhodovacieho stromu. V každom vrchole stromu sa obchodný cestujúci rozhoduje, ktorým mestom sa môže ďalej vydať. Jednotlivé hrany sú ohodnotené vzdialenosťou, ktorú musí prejsť. V danom prípade má úloha dve riešenia, kde cesta obchodného cestujúceho bude mať dĺžku 32. &lt;br /&gt;
&lt;br /&gt;
Cieľom rozhodovacích stromov je rozdeliť alebo charakterizovať určité objekty do podkategórií podľa určitých vlastností. Prvý uzol by mal obsahovať najvšeobecnejšiu charakteristiku skúmaných objektov, v ďalších by sa postupne mali vlastnosti objektu postupne viac a viac upresňovať až pokiaľ sa nedôjde k poslednému vrcholu. Vtedy je už objekt daný na vstupe pomerne presne charakterizovaný (za predpokladu správnych podmienok v jednotlivých vrcholoch). Príkladom použitia rozhodovacích stromov môžu byť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]].&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=7037</id>
		<title>Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=7037"/>
		<updated>2010-09-07T13:16:52Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;1&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Ľubomír Milko&lt;br /&gt;
|Ing. Juraj Ďuďák&lt;br /&gt;
|2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Táto práca obsahuje charakteristiku a stručnú históriu teórie hier a teórie grafov a popisuje rôzne druhy reprezentácie problémov pomocou týchto teórií. Časť práce sa zaoberá použitím herných stromov a metódy minimax na analýzu a riešenie hier. Cieľom práce je potom programová implementácia metódy minimax s alfa-beta orezávaním pri tvorbe umelej inteligencie pre hru dáma naprogramovanú v jazyku C++.&lt;br /&gt;
|This work contains the characteristics and short history of  game theory and graph theory and describes various forms of representation of problems using these theories. Part of this work deals with using game trees and minimax method for analysing and solving games. The aim of this work is a program implementation of minimax method with alpha-beta pruning in artificial intelligence for the game draughts programmed in C++ language.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
Problémy vyžadujúce správne rozhodovanie s ohľadom na následky zvoleného rozhodnutia nás sprevádzajú v takmer všetkých oblastiach ľudskej činnosti od hrania rôznych spoločenských hier až po pokročilé riadenie cestnej siete, správne ekonomické rozhodnutia alebo stratégiu vojenských konfliktov. Postupné snahy o matematickú interpretáciu a riešenie týchto problémy voľby správneho rozhodnutia vyústili v samostatné odvetvie aplikovanej matematiky s názvom teória hier. V tejto teórii sa rozhodovacie problémy znázorňujú ako množina stratégií, ktoré možno prijať a množina následkov, ktoré vzniknú v dôsledku zvolenej stratégie. Následky sú často číselnou interpretáciou daného stavu. Na praktickú interpretáciu tohto súboru množín sa využíva teória grafov. Tieto dve teórie možno použiť na vyriešenie mnohých praktických rozhodovacích problémov. Zaujímavým praktickým a názorným  príkladom aplikácie môže byť aj hľadanie optimálneho ťahu v doskových hrách akou je napríklad dáma. Súčasťou tejto práce je teda aj praktické využitie poznatkov z teórie hier a teórie grafov v tomto type hier. Cieľom tejto práce potom je:  &lt;br /&gt;
*charakteristika teórie hier a teórie grafov&lt;br /&gt;
*popis interpretácie základných rozhodovacích problémov pomocou týchto teórií&lt;br /&gt;
*praktické použitie popísaných teoretických princípov v programe – hra dáma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Zoznam použitých skratiek a pojmov'''&lt;br /&gt;
&lt;br /&gt;
;GUI: (z angl. Graphical User Interface) grafické užívateľské rozhranie&lt;br /&gt;
;AI: (z angl. Artificial Intelligence) umelá inteligencia&lt;br /&gt;
;RAND: (z angl. Research ANd Development) americká nezisková výskumná korporácia, ktorá bola založená pre americkú armádu, no neskôr sa jej pole pôsobnosti rozšírilo aj do iných oblastí.&lt;br /&gt;
;Hra: V teórii hier je hra strategická interakcia medzi jednotlivcami.&lt;br /&gt;
;Hráč: Hráčom sa označuje každý aktívny účastník hry.&lt;br /&gt;
;Pozícia: Pozícia je označenie pre aktuálny stav hry. Môže to byť napr. rozloženie figúrok na šachovnici.&lt;br /&gt;
;Ťah: Ťah je zvolená a uskutočnená stratégia hráča v danej pozícii hry.&lt;br /&gt;
;Riešenie hry: Riešením hry je nájdenie takej postupnosti ťahov (stratégie), ktorá vedie k viťaznej pozícii.&lt;br /&gt;
;Graf: V teórii grafov je grafom objekt tvorený množinou bodov poprepájaných čiarami podľa daných pravidiel. Body sú označované ako vrcholy a čiary ako hrany grafu.&lt;br /&gt;
;Strom: Herný strom je typ grafu, ktorý sa využíva na znázornenie priebehu hry.	&lt;br /&gt;
;Vrchol (uzol): Vrchol herného stromu reprezentuje pozíciu hry.&lt;br /&gt;
;Hrana: Hrana herného stromu symbolizuje ťah niektorého z hráčov z určitej pozície.&lt;br /&gt;
;Minimax: Metóda minimax sa využíva na prehľadávanie herných stromov s cieľom nájdenia optimálneho ťahu z danej pozície.&lt;br /&gt;
;Alfa-beta orezávanie: Technika na zmenšenie počtu prehľadávaných vrcholov v metóde minimax, čím sa proces prehľadávania urýchli.&lt;br /&gt;
;TRUE: Označenie true symbolizuje logickú hodnotu pravda. Symbolom logickej pravdivosti je aj číslo 1.	&lt;br /&gt;
;FALSE: Označenie false symbolizuje logickú hodnotu nepravda. Symbolom logickej nepravdivosti  aj číslo 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teória hier=&lt;br /&gt;
==Základné pojmy a charakteristika teórie hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier Teória hier] je odvetvím aplikovanej matematiky, ktorá sa snaží matematicky zachytiť správanie v strategických situáciách, kde úspech jednotlivca pri vykonaní určitej voľby závisí od volieb ostatných.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;&amp;gt;Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Súbor situácií, v ktorých sa každý účastník môže nachádzať je v teórii hier nazývaný [http://en.wikipedia.org/wiki/Game#Definitions hra]. '''Hra''' je akousi strategickou interakciou medzi jednotlivcami. Každý účastník (prvok, ktorý sa aktívne zúčastňuje hry) je označený ako '''hráč'''. Každý hráč má v daných momentoch možnosť voľby akcie, ktorá ďalej ovplyvní priebeh hry. Každá z možných akcií, ktoré hráč môže vykonať sa označuje ako '''ťah'''. Súbor ťahov, ktoré hráč použije v hre je označovaný ako [http://en.wikipedia.org/wiki/Strategy stratégia].&lt;br /&gt;
&lt;br /&gt;
Teória hier skúma predpokladané a skutočné správanie sa hráčov v hrách, rovnako ako aj optimálne stratégie. Zdanlivo odlišné typy interakcií medzi hráčmi a hrou sa môžu prejavovať podobnými štruktúrami pohnútok, takže všetky môžu byť reprezentované ako príklady jednej konkrétnej hry. V počiatkoch bola teória hier rozvíjaná na analyzovanie súťaží (situácií), kde každému hráčovi sa darilo lepšie na úkor ostatných.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt; Jedná sa o tzv. [[#Hry s nulovým a nenulovým súčtom | hry s nulovým súčtom]]. Išlo napr. o analýzu rôznych vojenských konfliktov, prípadne spoločenských hier. Neskôr sa teória hier rozšírila na analyzovanie širokého spektra  interakcií, ktoré sú klasifikované podľa niekoľkých kritérií. Dnes pojem teória hier zahŕňa množstvo teórií, ktoré možno aplikovať v rôznych rozhodovacích problémoch, kde hráčmi môžu byť ľudia, počítače, zvieratá, rastliny, atď.&lt;br /&gt;
&lt;br /&gt;
Tradičné aplikácie teórie hier sa snažia v hrách nájsť stav rovnováhy. To znamená nájsť súbor stratégií, kde je nepravdepodobné, že jednotlivé prvky budú meniť svoje správanie. Na riešenie týchto problémov bolo vyvinutých veľa konceptov, z ktorých najznámejšia je [http://en.wikipedia.org/wiki/Nash_equilibrium Nashova rovnováha].	&lt;br /&gt;
&lt;br /&gt;
===Nashova rovnováha===&lt;br /&gt;
&lt;br /&gt;
Je to koncept riešenia hier zahŕňajúcich dvoch alebo viac hráčov, kde každý hráč pozná stratégie rovnováhy (teda najlepšie stratégie, aké môžu zvoliť ostatní, aby získali čo najviac) ostatných hráčov a žiadny hráč nemá čo získať zmenou iba svojej vlastnej stratégie. Ak každý hráč zvolil stratégiu a žiadny hráč nemôže profitovať zmenou svojej stratégie, pokiaľ ostatní hráči ponechajú svoje stratégie nezmenené, potom daný súbor strategických rozhodnutí a odpovedajúcich odmien stanovuje Nashov stav rovnováhy. Inými slovami, byť v Nashovom stave rovnováhy znamená, že každý hráč odpovie negatívne na otázku : “Ak s určitosťou poznám stratégie ostatných hráčov, môžem profitovať zmenou mojej stratégie ?“ .&amp;lt;ref name=&amp;quot;nash_equilibrium&amp;quot;&amp;gt;Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&amp;lt;/ref&amp;gt; Jedným z najznámejších typov takejto hry je napr. [http://sk.wikipedia.org/wiki/V%C3%A4z%C5%88ova_dilema väzňova dilema] spopularizovaná matematikom [http://en.wikipedia.org/wiki/Albert_W._Tucker Albertom W. Tuckerom]. &lt;br /&gt;
&lt;br /&gt;
===Väzňova dilema===&lt;br /&gt;
&lt;br /&gt;
Opis problému je nasledovný:&lt;br /&gt;
Dvaja väzni vykradli banku a boli neskôr chytení políciou. Vo väzení ich zavrú do samostatných ciel. Väzni nemajú možnosť spolu komunikovať. Polícia nemá dosť dôkazov aby uväznila oboch. Obaja dostanú od polície ponuku spolupracovať (zradiť komplica), výmenou za nízky trest pre seba. Možné výsledky sú takéto: &lt;br /&gt;
*Ak budú obaja navzájom spolupracovať, budú ich držať najviac rok vo vyšetrovacej väzbe. &lt;br /&gt;
*Ak jeden z väzňov zradí komplica, pustia ho ihneď na slobodu, ale komplic dostane 10 rokov väzenia. &lt;br /&gt;
*Ak sa priznajú/zradia obaja, rozdelia si 10 ročný trest, čiže každý dostane 5 rokov. &lt;br /&gt;
Z hľadiska skupinového správania sa je najvýhodnejšie riešenie ak obaja spolupracujú, pretože vtedy je celkový čas ktorý obaja strávia vo väzení najmenší. Z hľadiska sebeckého správania sa každého z nich je najjednoduchšie priznať sa, pretože tak môže dostať v horšom prípade 5 rokov, oproti možnostiam 1 alebo 10 rokov ak sa neprizná.&amp;lt;ref name=&amp;quot;vaznova_dilema&amp;quot;&amp;gt;Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Stručný vývoj teórie hier==&lt;br /&gt;
&lt;br /&gt;
Prvá známa zmienka o [[#Teória hier | teórii hier]] sa vyskytla v liste z roku 1713 napísanom [http://en.wikipedia.org/wiki/James_Waldegrave,_1st_Earl_Waldegrave Jamesom Waldegraveom]. V tomto liste Waldegrave navrhol tzv. zmiešanú minimax stratégiu ako riešenie kartovej hry pre dvoch hráčov nazývanej “le Her”. Neskôr roku 1838 využil hernú teoretickú analýzu [http://en.wikipedia.org/wiki/Augustin_Cournot Antoine Augustin Cournot] vo svojej knihe Výskumy matematických princípov teórie bohatstva. V tejto svojej práci Cournot pojednáva o duopoloch a prezentuje riešenie, ktoré je obmedzenou verziou [[#Nashova rovnováha | Nashovej rovnováhy]].&lt;br /&gt;
&lt;br /&gt;
Hoci bola Cournotova analýza viac všeobecná ako Waldegraveova, teória hier stále neexistovala ako samostatná oblasť vedy, až pokiaľ [http://en.wikipedia.org/wiki/John_von_Neumann John von Neumann], ktorý je považovaný za zakladateľa teórie hier, nepublikoval sériu prác na túto tému v roku 1928. Neskôr, v roku 1944, Von Neumann spolu s [http://en.wikipedia.org/wiki/Oskar_Morgenstern Oskarom Morgensternom] vydal knihu ''Teória hier a ekonomické správanie''. Táto kniha obsahuje metódy hľadania riešení hier dvoch hráčov [[#Hry s nulovým a nenulovým súčtom | s nulovým súčtom]]. Počas tohto obdobia bola teória hier primárne zameraná na teóriu [[#Kooperatívne a nekooperatívne hry | kooperatívnych hier]], ktorá analyzovala optimálne stratégie pre skupiny jednotlivcov za predpokladu, že môžu medzi sebou presadiť dohodu o vhodnej spoločnej stratégii.&lt;br /&gt;
&lt;br /&gt;
V roku 1950 sa objavila prvá zmienka o väzňovej dileme a organizácia [http://en.wikipedia.org/wiki/RAND RAND]  (Research ANd Development)  podnikla experiment na základe tejto hry. V tomto čase aj [http://en.wikipedia.org/wiki/John_Forbes_Nash,_Jr. John Nash] vyvinul kritérium pre vzájomnú koexistenciu stratégie hráčov, známe ako [[#Nashova rovnováha | Nashova rovnováha]]. Toto kritérium možno aplikovať na širšie spektrum hier, než kritérium, ktoré navrhli Neumann a Morgenstern. Toto kritérium je dostatočne univerzálne a umožňuje analýzu kooperatívnych aj nekooperatívnych hier. &lt;br /&gt;
&lt;br /&gt;
Teória hier zaznamenala náhly vzostup v 50-tych rokoch, kedy boli vymyslené nové herné koncepty ako napríklad: jadrá, [[#Rozšírená forma | rozšírená forma]] hier, fiktívne hry, atď. V tomto období sa aj objavili prvé aplikácie teórie hier vo filozofii a politike.&lt;br /&gt;
&lt;br /&gt;
V roku 1956 [http://en.wikipedia.org/wiki/Reinhard_Selten Reinhard Selten] uviedol svoj koncept riešenia tzv. [http://en.wikipedia.org/wiki/Perfect_equilibrium perfektnej rovnováhy] v určitej podmnožine hry, ktorá vylepšila [[#Nashova rovnováha | Nashovu rovnováhu]]. &lt;br /&gt;
&lt;br /&gt;
V 70-tych rokoch bola teória hier výrazne aplikovaná v biológii, hlavne ako dôsledok práce [http://en.wikipedia.org/wiki/John_Maynard_Smith Johna Maynarda Smitha] a jeho evolučne stabilnej stratégie. Navyše boli uvedené a analyzované ďalšie koncepty rozširujúce teóriu hier.&lt;br /&gt;
&lt;br /&gt;
V roku 2005, herní teoretik [http://en.wikipedia.org/wiki/Thomas_Schelling Thomas Schelling] získal Nobelovu cenu za prácu na dynamických modeloch, ktoré boli prvotnými ukážkami [http://en.wikipedia.org/wiki/Evolutionary_game_theory evolučnej hernej teórie]. &lt;br /&gt;
&lt;br /&gt;
V roku 2007 boli [http://en.wikipedia.org/wiki/Roger_Myerson Roger Myerson], spolu s [http://en.wikipedia.org/wiki/Leonid_Hurwicz Leonidom Hurwiczom] a [http://en.wikipedia.org/wiki/Eric_Maskin Ericom Maskinom] ocenení Nobelovou cenou za ekonomiku za položenie základov [http://en.wikipedia.org/wiki/Mechanism_design_theory teórie dizajnu mechanizmov hier].&lt;br /&gt;
&lt;br /&gt;
==Oblasti využitia teórie hier==&lt;br /&gt;
&lt;br /&gt;
[[#Teória hier | Teória hier]] bola využívaná hlavne na štúdium správania ľudí a zvierat. Primárne bola rozvíjaná v ekonomike na pochopenie rôznych druhov ekonomického správania, zahŕňajúcich správanie firiem, trhu a zákazníkov. Postupne sa využitie teórie hier v spoločenských vedách zväčšovalo a poznatky z teórie hier sa začali aplikovať aj na politické, sociologické a psychologické javy. &lt;br /&gt;
&lt;br /&gt;
Hernú teoretickú analýzu spočiatku využíval [http://en.wikipedia.org/wiki/Ronald_Fisher Ronald Fisher] na štúdium správania zvierat v 30-tych rokoch (hoci ešte predtým urobil k tejto téme niekoľko neformálnych vyjadrení [http://sk.wikipedia.org/wiki/Charles_Darwin#Orchidee.2C_Vari.C3.A1cia.2C_P.C3.B4vod_.C4.8Dloveka_a_.C4.8Cervy Charles Darwin]). Neskôr boli analytické metódy, ktoré využíval aj Fisher pomenované teória hier. Výsledky rozvoja tejto oblasti v ekonomike boli neskôr rozsiahlo aplikované v biológii Johnom M. Smithom v jeho knihe [http://en.wikipedia.org/wiki/Evolution_and_the_Theory_of_Games Evolúcia a teória hier]. &lt;br /&gt;
&lt;br /&gt;
Poznatky z teórie hier sa využívajú aj na predpovedanie a vyloženie etického a normatívneho správania. Vo filozofii sa teória hier aplikovala na pochopenie dobrého alebo správneho správania. Počiatky využitia teórie hier na tomto poli môžu byť datované až do čias Platóna. &lt;br /&gt;
&lt;br /&gt;
Prvotné aplikácie teórie hier v politických vedách je možno nájsť v práci [http://en.wikipedia.org/wiki/Anthony_Downs Anthonyho Downsa]. Významnou je napr. jeho kniha Ekonomická teória demokracie (1957). &lt;br /&gt;
&lt;br /&gt;
V ekonomike je teória hier využívaná na analýzu veľkého množstva ekonomických javov ako napr. trh, aukcie, výpredaje, duopoly, oligopoly, sociálna sieť a volebné systémy. Tento výskum sa zvyčajne zameriava na určitý súbor stratégií známych ako equilibrium (rovnováha) v hrách. V [[#Kooperatívne a nekooperatívne hry | nekooperatívnych hrách]] je najznámejším z týchto konceptov spomínaná [[#Nashova rovnováha | Nashova rovnováha]].&lt;br /&gt;
&lt;br /&gt;
V posledných rokoch zohráva teória hier významnú úlohu aj v počítačových vedách a logike. Hry sú napr. využívané na modelovanie interaktívnych výpočtov. &lt;br /&gt;
&lt;br /&gt;
Využitie teórie hier však možno nájsť aj v telekomunikáciách, doprave, psychológii, vojenských vedách, hazarde a mnohých iných oblastiach.&lt;br /&gt;
&lt;br /&gt;
==Spôsoby reprezentácie rozhodovacích problémov==&lt;br /&gt;
&lt;br /&gt;
Hry skúmané v teórii hier sú dobre definovateľnými matematickými objektmi. [[#Základné pojmy a charakteristika teórie hier | Hra]] pozostáva zo súboru hráčov, súboru ťahov (alebo stratégií), ktoré môžu hráči vykonať a daného ohodnotenia, pre každú kombináciu stratégií. Pre [[#Kooperatívne a nekooperatívne hry | nekooperatívne hry]] , kde hráči navzájom nemôžu spolupracovať sa využíva [http://en.wikipedia.org/wiki/Extensive-form_game rozšírená] alebo [http://en.wikipedia.org/wiki/Normal_form_game normálna] forma reprezentácie hry. [[#Kooperatívne a nekooperatívne hry | Kooperatívne hry]] sú často reprezentované [http://en.wikipedia.org/wiki/Characteristic_function charakteristickou funkciou]. &lt;br /&gt;
&lt;br /&gt;
===Rozšírená forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr1-rozsirena_forma.png | thumb | 200px | right | '''Obr. 1 – Rozšírená forma hry''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Extensive-form_game Rozšírená forma] môže byť použitá na opis hier s určitým dôležitým poradím vykonávania jednotlivých ťahov (stratégií). Takéto hry sú často reprezentované ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]]. Každý vrchol (uzol) tu predstavuje rozhodovací bod hráča. Hráč je označený číslom pri každom vrchole. Čiary smerujúce z každého vrcholu reprezentujú možnú akciu (ťah) príslušného hráča. Odmeny (hodnotenie) hráčov sú reprezentované na konci posledných spodných čiar. &lt;br /&gt;
&lt;br /&gt;
V hre znázornenej na obrázku 1 sú dvaja hráči. ''Hráč 1'' začína a má možnosti ''F'' alebo ''U''. ''Hráč 2'' vidí ťah ''Hráča 1'' a vyberá si medzi ťahmi ''A'' a ''R''. Ak uvažujeme, že ''Hráč 1'' vyberie ''U'' a ''Hráč 2'' zvolí možnosť ''A'', potom ''Hráč 1'' získa hodnotenie ''8'' a ''Hráč 2'' získa hodnotenie ''2''.&lt;br /&gt;
&lt;br /&gt;
Rozšírenou formou sa dajú zachytiť aj hry so [[#Simultánne a ťahové (sekvenčné) hry | simultánnym pohybom]] a [[#Hry s úplnými a neúplnými informáciami | hry s neúplnou informáciou]]. V takomto prípade buď bodkovaná čiara spája uzly na znázornenie, že sa jedná o rovnaký súbor informácií (teda, že hráči nevedia, v ktorom bode sa nachádzajú) alebo je okolo takýchto uzlov nakreslená uzavretá čiara.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Normálna forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab1-normalna_forma.png | thumb | 300px | right | '''Tab. 1 – Normálna forma – väzňova dilema''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Normal_form_game Normálna (alebo strategická)] forma  hry je reprezentovaná maticou, ktorá zobrazuje hráčov, stratégie a odmeny. Pre každú kombináciu ťahov (stratégií) priraďuje zodpovedajúce ohodnotenie (odmenu) každému z hráčov. V tabuľke 1 je znázornená tzv. [[#Väzňova dilema | väzňova dilema]]. ''Väzeň 1'' vyberá svoju stratégiu jednania z riadkov a ''väzeň 2'' zo stĺpcov. Každý z väzňov má na výber dve stratégie, reprezentované dvomi riadkami a dvomi stĺpcami. Vo vnútri buniek sú zapísané počty rokov (odmena) , ktoré budú musieť stráviť vo väzení pri zvolených stratégiách . Nevýhodné odmeny sú zvyčajne pre upresnenie zapísané zápornou hodnotou. Prvé číslo znázorňuje odmena ''väzňa 1'', druhé číslo je odmena ''väzňa 2''. &lt;br /&gt;
&lt;br /&gt;
Za predpokladu, že ''väzeň 1'' zvolí možnosť spolupracovať a ''väzeň 2'' bude tiež spolupracovať získajú obaja ohodnotenie ''-1''. Ak je hra reprezentovaná touto formou predpokladá sa, že hráči vykonávajú svoje ťahy (stratégie) súčasne alebo prinajmenšom nepoznajú ťah súpera. V opačnom prípade sa hry znázorňujú [[#Rozšírená forma | rozšírenou formou]].&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Forma charakteristickej funkcie===&lt;br /&gt;
&lt;br /&gt;
Využíva sa pri [[#Kooperatívne a nekooperatívne hry | kooperatívnych hrách]], kde nie sú určené žiadne individuálne odmeny pre hráčov. Namiesto toho [http://en.wikipedia.org/wiki/Characteristic_function charakteristická funkcia] definuje ohodnotenie každého spojenectva. Štandardným predpokladom je že prázdna koalícia získa ohodnotenie 0. &lt;br /&gt;
&lt;br /&gt;
Pôvod tejto formy pochádza z knihy [http://en.wikipedia.org/wiki/Von_Neumann von Neumanna] a [http://en.wikipedia.org/wiki/Oskar_Morgenstern Morgensterna], ktorí pri štúdiu koaličných hier vyjadrených normálnou formou usúdili, že ak sa vytvorí koalícia ''K'', hrá proti inej koalícii ''N'' ''(N\K)'' rovnako ako keby sa hrala hra dvoch hráčov. Existujú rôzne modely odvodenia koaličných odmien z [[#Normálna forma | normálnej formy hry]], ale nie všetky hry v charakteristickej forme  môžu byť odvodené z hier určených normálnou formou. &lt;br /&gt;
&lt;br /&gt;
Formálne je hra určená formou charakteristickej funkcie daná dvojicou ''(N,ϑ)'', kde ''N'' označuje súbor hráčov a ''ϑ:2^N→R'' je charakteristická funkcia.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Forma rozdeľujúcej funkcie===&lt;br /&gt;
&lt;br /&gt;
Rozšírenie [[#Forma charakteristickej funkcie | formy charakteristickej funkcie]], kde odmena koalície nezávisí iba na jej členoch, ale tiež na spôsobe akým sú rozdelení ostatní hráči.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typy hier==&lt;br /&gt;
===Kooperatívne a nekooperatívne hry===&lt;br /&gt;
&lt;br /&gt;
Hra je [http://en.wikipedia.org/wiki/Cooperative_game kooperatívna] ak hráči majú možnosť vytvoriť medzi sebou určité zväzky - '''koalície'''. V takomto druhu hier sa od hráčov vyžaduje dodržanie týchto ich záväzkov. V [http://en.wikipedia.org/wiki/Non_cooperative_game nekooperatívnych hrách] sa takéto záväzky nedodržiavajú. Často je tiež v kooperatívnych hrách usudzované, že hráči môžu navzájom ''komunikovať'' (teda, že vedia navzájom o svojich stratégiách vo vytvorenom zväzku). Pri nekooperatívnych hrách je na druhú stranu väčšinou možné modelovať situácie do najmenších detailov a vyvodzovať presné dôsledky. Kooperatívne hry sa sústreďujú na hru ako celok. Určitým spojením medzi kooperatívnymi a nekooperatívnymi hrami sú tzv. '''hybridné hry''', ktoré obsahujú elementy z oboch typov.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Symetrické a asymetrické hry===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab2-symetricka_hra.png | thumb | 300px | right | '''Tab. 2 – Symetrická hra''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Symmetric_games Symetrické hry] sú také, kde odmeny (ohodnotenia) za zvolenie určitej stratégie závisia iba od ostatných stratégií, ktoré zvolia ostatní hráči a nie od toho, kto volí danú stratégiu. Inak povedané, ak môžeme zameniť hráčov a odmeny budú stále rovnaké, potom hra je symetrická. Väčšina bežne študovaných hier 2x2 je symetrická. Príkladom je napr. [[#Väzňova dilema | väzňova dilema]]. Tabuľka 2 je ukážka symetrickej hry v [[#Normálna forma | normálnej forme]].&lt;br /&gt;
&lt;br /&gt;
Väčšina asymetrických hier sú hry, kde hráči nemajú na výber rovnaké stratégie. Je tiež ale možné, že hra, ktorá má pre oboch hráčov stratégie identické, nie je symetrická. Takéto hry sa líšia v ohodnotení stratégií v závislosti od toho, aký hráč danú stratégiu vykonal.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hry s nulovým a nenulovým súčtom===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab3-hra_s_nulovym_suctom.png | thumb | 300px | right | '''Tab. 3 – Hra s nulovým súčtom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Zero_sum_game Hry s nulovým súčtom] sú špeciálnym typom hier s konštantným súčtom, v ktorých voľby hráčov nemôžu ani zvýšiť a ani znížiť zdroje, ktoré sú k dispozícii. V hrách s nulovým súčtom je celkové ohodnotenie všetkých hráčov vždy rovné nule (hráč môže profitovať iba na adekvátny  úkor ostatných). Príkladom takýchto hier sú aj doskové spoločenské hry ako šach, dáma alebo napr. poker. Tabuľka 3 znázorňuje hru dvoch hráčov s nulovým súčtom.&lt;br /&gt;
&lt;br /&gt;
Mnoho hier však sú hry s nenulovým súčtom (vrátane [[#Väzňova dilema | väzňovej dilemy]]). Zisk jedného hráča tu nemusí nutne znamenať stratu hráča druhého. &lt;br /&gt;
&lt;br /&gt;
Hry s konštantným súčtom zodpovedajú javom ako krádeže a hazardné hry, ale nie základným ekonomickým princípom, kde je možné potenciálne nadobudnúť zisk z obchodu.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Simultánne a ťahové (sekvenčné) hry===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Simultaneous_game Simultánne hry] sú také, pri ktorých hráči vykonávajú svoje stratégie (ťahy) súčasne alebo ak neťahajú súčasne, tak hráči, ktorí sú na ťahu neskôr nevedia o predošlých akciách svojich súperov. &lt;br /&gt;
&lt;br /&gt;
V [http://en.wikipedia.org/wiki/Sequential_game sekvenčných hrách] majú tzv. neskorší hráči určité poznatky o predošlých akciách ostatných. Tieto poznatky však môžu byť len veľmi obmedzené. Môžu byť napr. informovaní len o tom, že nejaký hráč nevykonal určitú stratégiu, no nevedia, ktorú z možných stratégií vykonal. Na reprezentáciu simultánnych hier sa často volí [[#Normálna forma | normálna forma]] a na reprezentáciu sekvenčných [[#Rozšírená forma | rozšírená forma]].&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hry s úplnými a neúplnými informáciami===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr2-hra_s_neuplnymi_informaciami.png | thumb | 300px | right | '''Obr. 2 – Hra s neúplnými informáciami''' &amp;lt;br&amp;gt;&lt;br /&gt;
bodkovaná čiara predstavuje neznalosť hráča 2 o akcii hráča 1]]&lt;br /&gt;
Hry s [http://en.wikipedia.org/wiki/Perfect_information úplnými informáciami] sú dôležitou podmnožinou [[#Simultánne a ťahové (sekvenčné) hry | sekvenčných hier]]. Pri hrách s úplnými informáciami všetci hráči vedia o všetkých predošlých ťahoch ostatných hráčov. To znamená, že takýmto druhom hier nemôžu byť simultánne hry, pri ktorých už z princípu ostatní hráči nevedia o všetkých predošlých akciách svojich spoluhráčov.Väčšina hier analyzovaných v hernej teórii sú však hry s neúplnou informáciou. Hry s úplnou informáciou predstavujú aj rôzne doskové spoločenské hry ako napr. šach, Go, dáma a iné. &lt;br /&gt;
&lt;br /&gt;
Hry s úplnými informáciami bývajú často zamieňané s hrami s [http://en.wikipedia.org/wiki/Complete_information kompletnými informáciami], čo sú hry, pri ktorých každý hráč pozná stratégie a ohodnotenia ostatných hráčov, nemusí však vedieť o tom aké akcie vykonali, teda, ktoré stratégie zvolili. Obrázok 2 ukazuje znázornenie hry s neúplnými informáciami v [[#Rozšírená forma | rozšírenej forme]].&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Nekonečne dlhé hry===&lt;br /&gt;
&lt;br /&gt;
Hry analyzované ekonómami a reálnymi hráčmi sú obecne ukončené po určitom konečnom počte krokov. V matematike a teórii množín však sú objektom štúdia aj hry, ktoré trvajú nekonečný počet ťahov s víťazom (alebo daným ohodnotením) známym až po ukončení všetkých ťahov.&lt;br /&gt;
&lt;br /&gt;
Záujem sa v takomto prípade hier nesústreďuje ani tak na najoptimálnejší spôsob hry ako zisťovanie, či pre určitého hráča existuje alebo neexistuje tzv. '''výherná stratégia'''. Existencia takýchto stratégií má významné dôsledky v deskriptívnej teórii množín.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Metahry===&lt;br /&gt;
&lt;br /&gt;
Sú to hry, ktorých hra znamená rozvoj pravidiel, cieľa alebo predmetu inej hry. Metahry sa snažia o maximalizovanie praktickej hodnoty vyvinutého súboru pravidiel. Teória [http://en.wikipedia.org/wiki/Metagame metahier] je spojená s dizajnom [http://en.wikipedia.org/wiki/Mechanism_design mechanizmov hier].&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=7036</id>
		<title>Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=7036"/>
		<updated>2010-09-07T12:51:36Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;1&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Ľubomír Milko&lt;br /&gt;
|Ing. Juraj Ďuďák&lt;br /&gt;
|2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Táto práca obsahuje charakteristiku a stručnú históriu teórie hier a teórie grafov a popisuje rôzne druhy reprezentácie problémov pomocou týchto teórií. Časť práce sa zaoberá použitím herných stromov a metódy minimax na analýzu a riešenie hier. Cieľom práce je potom programová implementácia metódy minimax s alfa-beta orezávaním pri tvorbe umelej inteligencie pre hru dáma naprogramovanú v jazyku C++.&lt;br /&gt;
|This work contains the characteristics and short history of  game theory and graph theory and describes various forms of representation of problems using these theories. Part of this work deals with using game trees and minimax method for analysing and solving games. The aim of this work is a program implementation of minimax method with alpha-beta pruning in artificial intelligence for the game draughts programmed in C++ language.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
Problémy vyžadujúce správne rozhodovanie s ohľadom na následky zvoleného rozhodnutia nás sprevádzajú v takmer všetkých oblastiach ľudskej činnosti od hrania rôznych spoločenských hier až po pokročilé riadenie cestnej siete, správne ekonomické rozhodnutia alebo stratégiu vojenských konfliktov. Postupné snahy o matematickú interpretáciu a riešenie týchto problémy voľby správneho rozhodnutia vyústili v samostatné odvetvie aplikovanej matematiky s názvom teória hier. V tejto teórii sa rozhodovacie problémy znázorňujú ako množina stratégií, ktoré možno prijať a množina následkov, ktoré vzniknú v dôsledku zvolenej stratégie. Následky sú často číselnou interpretáciou daného stavu. Na praktickú interpretáciu tohto súboru množín sa využíva teória grafov. Tieto dve teórie možno použiť na vyriešenie mnohých praktických rozhodovacích problémov. Zaujímavým praktickým a názorným  príkladom aplikácie môže byť aj hľadanie optimálneho ťahu v doskových hrách akou je napríklad dáma. Súčasťou tejto práce je teda aj praktické využitie poznatkov z teórie hier a teórie grafov v tomto type hier. Cieľom tejto práce potom je:  &lt;br /&gt;
*charakteristika teórie hier a teórie grafov&lt;br /&gt;
*popis interpretácie základných rozhodovacích problémov pomocou týchto teórií&lt;br /&gt;
*praktické použitie popísaných teoretických princípov v programe – hra dáma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Zoznam použitých skratiek a pojmov'''&lt;br /&gt;
&lt;br /&gt;
;GUI: (z angl. Graphical User Interface) grafické užívateľské rozhranie&lt;br /&gt;
;AI: (z angl. Artificial Intelligence) umelá inteligencia&lt;br /&gt;
;RAND: (z angl. Research ANd Development) americká nezisková výskumná korporácia, ktorá bola založená pre americkú armádu, no neskôr sa jej pole pôsobnosti rozšírilo aj do iných oblastí.&lt;br /&gt;
;Hra: V teórii hier je hra strategická interakcia medzi jednotlivcami.&lt;br /&gt;
;Hráč: Hráčom sa označuje každý aktívny účastník hry.&lt;br /&gt;
;Pozícia: Pozícia je označenie pre aktuálny stav hry. Môže to byť napr. rozloženie figúrok na šachovnici.&lt;br /&gt;
;Ťah: Ťah je zvolená a uskutočnená stratégia hráča v danej pozícii hry.&lt;br /&gt;
;Riešenie hry: Riešením hry je nájdenie takej postupnosti ťahov (stratégie), ktorá vedie k viťaznej pozícii.&lt;br /&gt;
;Graf: V teórii grafov je grafom objekt tvorený množinou bodov poprepájaných čiarami podľa daných pravidiel. Body sú označované ako vrcholy a čiary ako hrany grafu.&lt;br /&gt;
;Strom: Herný strom je typ grafu, ktorý sa využíva na znázornenie priebehu hry.	&lt;br /&gt;
;Vrchol (uzol): Vrchol herného stromu reprezentuje pozíciu hry.&lt;br /&gt;
;Hrana: Hrana herného stromu symbolizuje ťah niektorého z hráčov z určitej pozície.&lt;br /&gt;
;Minimax: Metóda minimax sa využíva na prehľadávanie herných stromov s cieľom nájdenia optimálneho ťahu z danej pozície.&lt;br /&gt;
;Alfa-beta orezávanie: Technika na zmenšenie počtu prehľadávaných vrcholov v metóde minimax, čím sa proces prehľadávania urýchli.&lt;br /&gt;
;TRUE: Označenie true symbolizuje logickú hodnotu pravda. Symbolom logickej pravdivosti je aj číslo 1.	&lt;br /&gt;
;FALSE: Označenie false symbolizuje logickú hodnotu nepravda. Symbolom logickej nepravdivosti  aj číslo 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teória hier=&lt;br /&gt;
==Základné pojmy a charakteristika teórie hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier Teória hier] je odvetvím aplikovanej matematiky, ktorá sa snaží matematicky zachytiť správanie v strategických situáciách, kde úspech jednotlivca pri vykonaní určitej voľby závisí od volieb ostatných.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;&amp;gt;Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Súbor situácií, v ktorých sa každý účastník môže nachádzať je v teórii hier nazývaný [http://en.wikipedia.org/wiki/Game#Definitions hra]. '''Hra''' je akousi strategickou interakciou medzi jednotlivcami. Každý účastník (prvok, ktorý sa aktívne zúčastňuje hry) je označený ako '''hráč'''. Každý hráč má v daných momentoch možnosť voľby akcie, ktorá ďalej ovplyvní priebeh hry. Každá z možných akcií, ktoré hráč môže vykonať sa označuje ako '''ťah'''. Súbor ťahov, ktoré hráč použije v hre je označovaný ako [http://en.wikipedia.org/wiki/Strategy stratégia].&lt;br /&gt;
&lt;br /&gt;
Teória hier skúma predpokladané a skutočné správanie sa hráčov v hrách, rovnako ako aj optimálne stratégie. Zdanlivo odlišné typy interakcií medzi hráčmi a hrou sa môžu prejavovať podobnými štruktúrami pohnútok, takže všetky môžu byť reprezentované ako príklady jednej konkrétnej hry. V počiatkoch bola teória hier rozvíjaná na analyzovanie súťaží (situácií), kde každému hráčovi sa darilo lepšie na úkor ostatných.&amp;lt;ref name=&amp;quot;game_theory&amp;quot;/&amp;gt; Jedná sa o tzv. [[#Hry s nulovým a nenulovým súčtom | hry s nulovým súčtom]]. Išlo napr. o analýzu rôznych vojenských konfliktov, prípadne spoločenských hier. Neskôr sa teória hier rozšírila na analyzovanie širokého spektra  interakcií, ktoré sú klasifikované podľa niekoľkých kritérií. Dnes pojem teória hier zahŕňa množstvo teórií, ktoré možno aplikovať v rôznych rozhodovacích problémoch, kde hráčmi môžu byť ľudia, počítače, zvieratá, rastliny, atď.&lt;br /&gt;
&lt;br /&gt;
Tradičné aplikácie teórie hier sa snažia v hrách nájsť stav rovnováhy. To znamená nájsť súbor stratégií, kde je nepravdepodobné, že jednotlivé prvky budú meniť svoje správanie. Na riešenie týchto problémov bolo vyvinutých veľa konceptov, z ktorých najznámejšia je [http://en.wikipedia.org/wiki/Nash_equilibrium Nashova rovnováha].	&lt;br /&gt;
&lt;br /&gt;
===Nashova rovnováha===&lt;br /&gt;
&lt;br /&gt;
Je to koncept riešenia hier zahŕňajúcich dvoch alebo viac hráčov, kde každý hráč pozná stratégie rovnováhy (teda najlepšie stratégie, aké môžu zvoliť ostatní, aby získali čo najviac) ostatných hráčov a žiadny hráč nemá čo získať zmenou iba svojej vlastnej stratégie. Ak každý hráč zvolil stratégiu a žiadny hráč nemôže profitovať zmenou svojej stratégie, pokiaľ ostatní hráči ponechajú svoje stratégie nezmenené, potom daný súbor strategických rozhodnutí a odpovedajúcich odmien stanovuje Nashov stav rovnováhy. Inými slovami, byť v Nashovom stave rovnováhy znamená, že každý hráč odpovie negatívne na otázku : “Ak s určitosťou poznám stratégie ostatných hráčov, môžem profitovať zmenou mojej stratégie ?“ .&amp;lt;ref name=&amp;quot;nash_equilibrium&amp;quot;&amp;gt;Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&amp;lt;/ref&amp;gt; Jedným z najznámejších typov takejto hry je napr. [http://sk.wikipedia.org/wiki/V%C3%A4z%C5%88ova_dilema väzňova dilema] spopularizovaná matematikom [http://en.wikipedia.org/wiki/Albert_W._Tucker Albertom W. Tuckerom]. &lt;br /&gt;
&lt;br /&gt;
===Väzňova dilema===&lt;br /&gt;
&lt;br /&gt;
Opis problému je nasledovný:&lt;br /&gt;
Dvaja väzni vykradli banku a boli neskôr chytení políciou. Vo väzení ich zavrú do samostatných ciel. Väzni nemajú možnosť spolu komunikovať. Polícia nemá dosť dôkazov aby uväznila oboch. Obaja dostanú od polície ponuku spolupracovať (zradiť komplica), výmenou za nízky trest pre seba. Možné výsledky sú takéto: &lt;br /&gt;
*Ak budú obaja navzájom spolupracovať, budú ich držať najviac rok vo vyšetrovacej väzbe. &lt;br /&gt;
*Ak jeden z väzňov zradí komplica, pustia ho ihneď na slobodu, ale komplic dostane 10 rokov väzenia. &lt;br /&gt;
*Ak sa priznajú/zradia obaja, rozdelia si 10 ročný trest, čiže každý dostane 5 rokov. &lt;br /&gt;
Z hľadiska skupinového správania sa je najvýhodnejšie riešenie ak obaja spolupracujú, pretože vtedy je celkový čas ktorý obaja strávia vo väzení najmenší. Z hľadiska sebeckého správania sa každého z nich je najjednoduchšie priznať sa, pretože tak môže dostať v horšom prípade 5 rokov, oproti možnostiam 1 alebo 10 rokov ak sa neprizná.&amp;lt;ref name=&amp;quot;vaznova_dilema&amp;quot;&amp;gt;Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Stručný vývoj teórie hier==&lt;br /&gt;
&lt;br /&gt;
Prvá známa zmienka o [[#Teória hier | teórii hier]] sa vyskytla v liste z roku 1713 napísanom [http://en.wikipedia.org/wiki/James_Waldegrave,_1st_Earl_Waldegrave Jamesom Waldegraveom]. V tomto liste Waldegrave navrhol tzv. zmiešanú minimax stratégiu ako riešenie kartovej hry pre dvoch hráčov nazývanej “le Her”. Neskôr roku 1838 využil hernú teoretickú analýzu [http://en.wikipedia.org/wiki/Augustin_Cournot Antoine Augustin Cournot] vo svojej knihe Výskumy matematických princípov teórie bohatstva. V tejto svojej práci Cournot pojednáva o duopoloch a prezentuje riešenie, ktoré je obmedzenou verziou [[#Nashova rovnováha | Nashovej rovnováhy]].&lt;br /&gt;
&lt;br /&gt;
Hoci bola Cournotova analýza viac všeobecná ako Waldegraveova, teória hier stále neexistovala ako samostatná oblasť vedy, až pokiaľ [http://en.wikipedia.org/wiki/John_von_Neumann John von Neumann], ktorý je považovaný za zakladateľa teórie hier, nepublikoval sériu prác na túto tému v roku 1928. Neskôr, v roku 1944, Von Neumann spolu s [http://en.wikipedia.org/wiki/Oskar_Morgenstern Oskarom Morgensternom] vydal knihu ''Teória hier a ekonomické správanie''. Táto kniha obsahuje metódy hľadania riešení hier dvoch hráčov [[#Hry s nulovým a nenulovým súčtom | s nulovým súčtom]]. Počas tohto obdobia bola teória hier primárne zameraná na teóriu [[#Kooperatívne a nekooperatívne hry | kooperatívnych hier]], ktorá analyzovala optimálne stratégie pre skupiny jednotlivcov za predpokladu, že môžu medzi sebou presadiť dohodu o vhodnej spoločnej stratégii.&lt;br /&gt;
&lt;br /&gt;
V roku 1950 sa objavila prvá zmienka o väzňovej dileme a organizácia [http://en.wikipedia.org/wiki/RAND RAND]  (Research ANd Development)  podnikla experiment na základe tejto hry. V tomto čase aj [http://en.wikipedia.org/wiki/John_Forbes_Nash,_Jr. John Nash] vyvinul kritérium pre vzájomnú koexistenciu stratégie hráčov, známe ako [[#Nashova rovnováha | Nashova rovnováha]]. Toto kritérium možno aplikovať na širšie spektrum hier, než kritérium, ktoré navrhli Neumann a Morgenstern. Toto kritérium je dostatočne univerzálne a umožňuje analýzu kooperatívnych aj nekooperatívnych hier. &lt;br /&gt;
&lt;br /&gt;
Teória hier zaznamenala náhly vzostup v 50-tych rokoch, kedy boli vymyslené nové herné koncepty ako napríklad: jadrá, [[#Rozšírená forma | rozšírená forma]] hier, fiktívne hry, atď. V tomto období sa aj objavili prvé aplikácie teórie hier vo filozofii a politike.&lt;br /&gt;
&lt;br /&gt;
V roku 1956 [http://en.wikipedia.org/wiki/Reinhard_Selten Reinhard Selten] uviedol svoj koncept riešenia tzv. [http://en.wikipedia.org/wiki/Perfect_equilibrium perfektnej rovnováhy] v určitej podmnožine hry, ktorá vylepšila [[#Nashova rovnováha | Nashovu rovnováhu]]. &lt;br /&gt;
&lt;br /&gt;
V 70-tych rokoch bola teória hier výrazne aplikovaná v biológii, hlavne ako dôsledok práce [http://en.wikipedia.org/wiki/John_Maynard_Smith Johna Maynarda Smitha] a jeho evolučne stabilnej stratégie. Navyše boli uvedené a analyzované ďalšie koncepty rozširujúce teóriu hier.&lt;br /&gt;
&lt;br /&gt;
V roku 2005, herní teoretik [http://en.wikipedia.org/wiki/Thomas_Schelling Thomas Schelling] získal Nobelovu cenu za prácu na dynamických modeloch, ktoré boli prvotnými ukážkami [http://en.wikipedia.org/wiki/Evolutionary_game_theory evolučnej hernej teórie]. &lt;br /&gt;
&lt;br /&gt;
V roku 2007 boli [http://en.wikipedia.org/wiki/Roger_Myerson Roger Myerson], spolu s [http://en.wikipedia.org/wiki/Leonid_Hurwicz Leonidom Hurwiczom] a [http://en.wikipedia.org/wiki/Eric_Maskin Ericom Maskinom] ocenení Nobelovou cenou za ekonomiku za položenie základov [http://en.wikipedia.org/wiki/Mechanism_design_theory teórie dizajnu mechanizmov hier].&lt;br /&gt;
&lt;br /&gt;
==Oblasti využitia teórie hier==&lt;br /&gt;
&lt;br /&gt;
[[#Teória hier | Teória hier]] bola využívaná hlavne na štúdium správania ľudí a zvierat. Primárne bola rozvíjaná v ekonomike na pochopenie rôznych druhov ekonomického správania, zahŕňajúcich správanie firiem, trhu a zákazníkov. Postupne sa využitie teórie hier v spoločenských vedách zväčšovalo a poznatky z teórie hier sa začali aplikovať aj na politické, sociologické a psychologické javy. &lt;br /&gt;
&lt;br /&gt;
Hernú teoretickú analýzu spočiatku využíval [http://en.wikipedia.org/wiki/Ronald_Fisher Ronald Fisher] na štúdium správania zvierat v 30-tych rokoch (hoci ešte predtým urobil k tejto téme niekoľko neformálnych vyjadrení [http://sk.wikipedia.org/wiki/Charles_Darwin#Orchidee.2C_Vari.C3.A1cia.2C_P.C3.B4vod_.C4.8Dloveka_a_.C4.8Cervy Charles Darwin]). Neskôr boli analytické metódy, ktoré využíval aj Fisher pomenované teória hier. Výsledky rozvoja tejto oblasti v ekonomike boli neskôr rozsiahlo aplikované v biológii Johnom M. Smithom v jeho knihe [http://en.wikipedia.org/wiki/Evolution_and_the_Theory_of_Games Evolúcia a teória hier]. &lt;br /&gt;
&lt;br /&gt;
Poznatky z teórie hier sa využívajú aj na predpovedanie a vyloženie etického a normatívneho správania. Vo filozofii sa teória hier aplikovala na pochopenie dobrého alebo správneho správania. Počiatky využitia teórie hier na tomto poli môžu byť datované až do čias Platóna. &lt;br /&gt;
&lt;br /&gt;
Prvotné aplikácie teórie hier v politických vedách je možno nájsť v práci [http://en.wikipedia.org/wiki/Anthony_Downs Anthonyho Downsa]. Významnou je napr. jeho kniha Ekonomická teória demokracie (1957). &lt;br /&gt;
&lt;br /&gt;
V ekonomike je teória hier využívaná na analýzu veľkého množstva ekonomických javov ako napr. trh, aukcie, výpredaje, duopoly, oligopoly, sociálna sieť a volebné systémy. Tento výskum sa zvyčajne zameriava na určitý súbor stratégií známych ako equilibrium (rovnováha) v hrách. V [[#Kooperatívne a nekooperatívne hry | nekooperatívnych hrách]] je najznámejším z týchto konceptov spomínaná [[#Nashova rovnováha | Nashova rovnováha]].&lt;br /&gt;
&lt;br /&gt;
V posledných rokoch zohráva teória hier významnú úlohu aj v počítačových vedách a logike. Hry sú napr. využívané na modelovanie interaktívnych výpočtov. &lt;br /&gt;
&lt;br /&gt;
Využitie teórie hier však možno nájsť aj v telekomunikáciách, doprave, psychológii, vojenských vedách, hazarde a mnohých iných oblastiach.&lt;br /&gt;
&lt;br /&gt;
==Spôsoby reprezentácie rozhodovacích problémov==&lt;br /&gt;
&lt;br /&gt;
Hry skúmané v teórii hier sú dobre definovateľnými matematickými objektmi. [[#Základné pojmy a charakteristika teórie hier | Hra]] pozostáva zo súboru hráčov, súboru ťahov (alebo stratégií), ktoré môžu hráči vykonať a daného ohodnotenia, pre každú kombináciu stratégií. Pre [[#Kooperatívne a nekooperatívne hry | nekooperatívne hry]] , kde hráči navzájom nemôžu spolupracovať sa využíva [http://en.wikipedia.org/wiki/Extensive-form_game rozšírená] alebo [http://en.wikipedia.org/wiki/Normal_form_game normálna] forma reprezentácie hry. [[#Kooperatívne a nekooperatívne hry | Kooperatívne hry]] sú často reprezentované [http://en.wikipedia.org/wiki/Characteristic_function charakteristickou funkciou]. &lt;br /&gt;
&lt;br /&gt;
===Rozšírená forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr1-rozsirena_forma.png | thumb | 200px | right | '''Obr. 1 – Rozšírená forma hry''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Extensive-form_game Rozšírená forma] môže byť použitá na opis hier s určitým dôležitým poradím vykonávania jednotlivých ťahov (stratégií). Takéto hry sú často reprezentované ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]]. Každý vrchol (uzol) tu predstavuje rozhodovací bod hráča. Hráč je označený číslom pri každom vrchole. Čiary smerujúce z každého vrcholu reprezentujú možnú akciu (ťah) príslušného hráča. Odmeny (hodnotenie) hráčov sú reprezentované na konci posledných spodných čiar. &lt;br /&gt;
&lt;br /&gt;
V hre znázornenej na obrázku 1 sú dvaja hráči. ''Hráč 1'' začína a má možnosti ''F'' alebo ''U''. ''Hráč 2'' vidí ťah ''Hráča 1'' a vyberá si medzi ťahmi ''A'' a ''R''. Ak uvažujeme, že ''Hráč 1'' vyberie ''U'' a ''Hráč 2'' zvolí možnosť ''A'', potom ''Hráč 1'' získa hodnotenie ''8'' a ''Hráč 2'' získa hodnotenie ''2''.&lt;br /&gt;
&lt;br /&gt;
Rozšírenou formou sa dajú zachytiť aj hry so [[#Simultánne a ťahové (sekvenčné) hry | simultánnym pohybom]] a [[#Hry s úplnými a neúplnými informáciami | hry s neúplnou informáciou]]. V takomto prípade buď bodkovaná čiara spája uzly na znázornenie, že sa jedná o rovnaký súbor informácií (teda, že hráči nevedia, v ktorom bode sa nachádzajú) alebo je okolo takýchto uzlov nakreslená uzavretá čiara [1].&lt;br /&gt;
&lt;br /&gt;
===Normálna forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab1-normalna_forma.png | thumb | 300px | right | '''Tab. 1 – Normálna forma – väzňova dilema''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Normal_form_game Normálna (alebo strategická)] forma  hry je reprezentovaná maticou, ktorá zobrazuje hráčov, stratégie a odmeny. Pre každú kombináciu ťahov (stratégií) priraďuje zodpovedajúce ohodnotenie (odmenu) každému z hráčov. V tabuľke 1 je znázornená tzv. [[#Väzňova dilema | väzňova dilema]]. ''Väzeň 1'' vyberá svoju stratégiu jednania z riadkov a ''väzeň 2'' zo stĺpcov. Každý z väzňov má na výber dve stratégie, reprezentované dvomi riadkami a dvomi stĺpcami. Vo vnútri buniek sú zapísané počty rokov (odmena) , ktoré budú musieť stráviť vo väzení pri zvolených stratégiách . Nevýhodné odmeny sú zvyčajne pre upresnenie zapísané zápornou hodnotou. Prvé číslo znázorňuje odmena ''väzňa 1'', druhé číslo je odmena ''väzňa 2''. &lt;br /&gt;
&lt;br /&gt;
Za predpokladu, že ''väzeň 1'' zvolí možnosť spolupracovať a ''väzeň 2'' bude tiež spolupracovať získajú obaja ohodnotenie ''-1''. Ak je hra reprezentovaná touto formou predpokladá sa, že hráči vykonávajú svoje ťahy (stratégie) súčasne alebo prinajmenšom nepoznajú ťah súpera. V opačnom prípade sa hry znázorňujú [[#Rozšírená forma | rozšírenou formou]].&lt;br /&gt;
&lt;br /&gt;
===Forma charakteristickej funkcie===&lt;br /&gt;
&lt;br /&gt;
Využíva sa pri [[#Kooperatívne a nekooperatívne hry | kooperatívnych hrách]], kde nie sú určené žiadne individuálne odmeny pre hráčov. Namiesto toho [http://en.wikipedia.org/wiki/Characteristic_function charakteristická funkcia] definuje ohodnotenie každého spojenectva. Štandardným predpokladom je že prázdna koalícia získa ohodnotenie 0. &lt;br /&gt;
&lt;br /&gt;
Pôvod tejto formy pochádza z knihy [http://en.wikipedia.org/wiki/Von_Neumann von Neumanna] a [http://en.wikipedia.org/wiki/Oskar_Morgenstern Morgensterna], ktorí pri štúdiu koaličných hier vyjadrených normálnou formou usúdili, že ak sa vytvorí koalícia ''K'', hrá proti inej koalícii ''N'' ''(N\K)'' rovnako ako keby sa hrala hra dvoch hráčov. Existujú rôzne modely odvodenia koaličných odmien z [[#Normálna forma | normálnej formy hry]], ale nie všetky hry v charakteristickej forme  môžu byť odvodené z hier určených normálnou formou. &lt;br /&gt;
&lt;br /&gt;
Formálne je hra určená formou charakteristickej funkcie daná dvojicou ''(N,ϑ)'', kde ''N'' označuje súbor hráčov a ''ϑ:2^N→R'' je charakteristická funkcia [1]. &lt;br /&gt;
&lt;br /&gt;
===Forma rozdeľujúcej funkcie===&lt;br /&gt;
&lt;br /&gt;
Rozšírenie [[#Forma charakteristickej funkcie | formy charakteristickej funkcie]], kde odmena koalície nezávisí iba na jej členoch, ale tiež na spôsobe akým sú rozdelení ostatní hráči [1].&lt;br /&gt;
&lt;br /&gt;
==Typy hier==&lt;br /&gt;
===Kooperatívne a nekooperatívne hry===&lt;br /&gt;
&lt;br /&gt;
Hra je [http://en.wikipedia.org/wiki/Cooperative_game kooperatívna] ak hráči majú možnosť vytvoriť medzi sebou určité zväzky - '''koalície'''. V takomto druhu hier sa od hráčov vyžaduje dodržanie týchto ich záväzkov. V [http://en.wikipedia.org/wiki/Non_cooperative_game nekooperatívnych hrách] sa takéto záväzky nedodržiavajú. Často je tiež v kooperatívnych hrách usudzované, že hráči môžu navzájom ''komunikovať'' (teda, že vedia navzájom o svojich stratégiách vo vytvorenom zväzku). Pri nekooperatívnych hrách je na druhú stranu väčšinou možné modelovať situácie do najmenších detailov a vyvodzovať presné dôsledky. Kooperatívne hry sa sústreďujú na hru ako celok. Určitým spojením medzi kooperatívnymi a nekooperatívnymi hrami sú tzv. '''hybridné hry''', ktoré obsahujú elementy z oboch typov [1].&lt;br /&gt;
&lt;br /&gt;
===Symetrické a asymetrické hry===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab2-symetricka_hra.png | thumb | 300px | right | '''Tab. 2 – Symetrická hra''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Symmetric_games Symetrické hry] sú také, kde odmeny (ohodnotenia) za zvolenie určitej stratégie závisia iba od ostatných stratégií, ktoré zvolia ostatní hráči a nie od toho, kto volí danú stratégiu. Inak povedané, ak môžeme zameniť hráčov a odmeny budú stále rovnaké, potom hra je symetrická. Väčšina bežne študovaných hier 2x2 je symetrická. Príkladom je napr. [[#Väzňova dilema | väzňova dilema]]. Tabuľka 2 je ukážka symetrickej hry v [[#Normálna forma | normálnej forme]].&lt;br /&gt;
&lt;br /&gt;
Väčšina asymetrických hier sú hry, kde hráči nemajú na výber rovnaké stratégie. Je tiež ale možné, že hra, ktorá má pre oboch hráčov stratégie identické, nie je symetrická. Takéto hry sa líšia v ohodnotení stratégií v závislosti od toho, aký hráč danú stratégiu vykonal [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s nulovým a nenulovým súčtom===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab3-hra_s_nulovym_suctom.png | thumb | 300px | right | '''Tab. 3 – Hra s nulovým súčtom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Zero_sum_game Hry s nulovým súčtom] sú špeciálnym typom hier s konštantným súčtom, v ktorých voľby hráčov nemôžu ani zvýšiť a ani znížiť zdroje, ktoré sú k dispozícii. V hrách s nulovým súčtom je celkové ohodnotenie všetkých hráčov vždy rovné nule (hráč môže profitovať iba na adekvátny  úkor ostatných). Príkladom takýchto hier sú aj doskové spoločenské hry ako šach, dáma alebo napr. poker. Tabuľka 3 znázorňuje hru dvoch hráčov s nulovým súčtom.&lt;br /&gt;
&lt;br /&gt;
Mnoho hier však sú hry s nenulovým súčtom (vrátane [[#Väzňova dilema | väzňovej dilemy]]). Zisk jedného hráča tu nemusí nutne znamenať stratu hráča druhého. &lt;br /&gt;
&lt;br /&gt;
Hry s konštantným súčtom zodpovedajú javom ako krádeže a hazardné hry, ale nie základným ekonomickým princípom, kde je možné potenciálne nadobudnúť zisk z obchodu [1].&lt;br /&gt;
&lt;br /&gt;
===Simultánne a ťahové (sekvenčné) hry===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Simultaneous_game Simultánne hry] sú také, pri ktorých hráči vykonávajú svoje stratégie (ťahy) súčasne alebo ak neťahajú súčasne, tak hráči, ktorí sú na ťahu neskôr nevedia o predošlých akciách svojich súperov. &lt;br /&gt;
&lt;br /&gt;
V [http://en.wikipedia.org/wiki/Sequential_game sekvenčných hrách] majú tzv. neskorší hráči určité poznatky o predošlých akciách ostatných. Tieto poznatky však môžu byť len veľmi obmedzené. Môžu byť napr. informovaní len o tom, že nejaký hráč nevykonal určitú stratégiu, no nevedia, ktorú z možných stratégií vykonal. Na reprezentáciu simultánnych hier sa často volí [[#Normálna forma | normálna forma]] a na reprezentáciu sekvenčných [[#Rozšírená forma | rozšírená forma]] [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s úplnými a neúplnými informáciami===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr2-hra_s_neuplnymi_informaciami.png | thumb | 300px | right | '''Obr. 2 – Hra s neúplnými informáciami''' &amp;lt;br&amp;gt;&lt;br /&gt;
bodkovaná čiara predstavuje neznalosť hráča 2 o akcii hráča 1]]&lt;br /&gt;
Hry s [http://en.wikipedia.org/wiki/Perfect_information úplnými informáciami] sú dôležitou podmnožinou [[#Simultánne a ťahové (sekvenčné) hry | sekvenčných hier]]. Pri hrách s úplnými informáciami všetci hráči vedia o všetkých predošlých ťahoch ostatných hráčov. To znamená, že takýmto druhom hier nemôžu byť simultánne hry, pri ktorých už z princípu ostatní hráči nevedia o všetkých predošlých akciách svojich spoluhráčov.Väčšina hier analyzovaných v hernej teórii sú však hry s neúplnou informáciou. Hry s úplnou informáciou predstavujú aj rôzne doskové spoločenské hry ako napr. šach, Go, dáma a iné. &lt;br /&gt;
&lt;br /&gt;
Hry s úplnými informáciami bývajú často zamieňané s hrami s [http://en.wikipedia.org/wiki/Complete_information kompletnými informáciami], čo sú hry, pri ktorých každý hráč pozná stratégie a ohodnotenia ostatných hráčov, nemusí však vedieť o tom aké akcie vykonali, teda, ktoré stratégie zvolili. Obrázok 2 ukazuje znázornenie hry s neúplnými informáciami v [[#Rozšírená forma | rozšírenej forme]].&lt;br /&gt;
&lt;br /&gt;
===Nekonečne dlhé hry===&lt;br /&gt;
&lt;br /&gt;
Hry analyzované ekonómami a reálnymi hráčmi sú obecne ukončené po určitom konečnom počte krokov. V matematike a teórii množín však sú objektom štúdia aj hry, ktoré trvajú nekonečný počet ťahov s víťazom (alebo daným ohodnotením) známym až po ukončení všetkých ťahov.&lt;br /&gt;
&lt;br /&gt;
Záujem sa v takomto prípade hier nesústreďuje ani tak na najoptimálnejší spôsob hry ako zisťovanie, či pre určitého hráča existuje alebo neexistuje tzv. '''výherná stratégia'''. Existencia takýchto stratégií má významné dôsledky v deskriptívnej teórii množín [1].&lt;br /&gt;
&lt;br /&gt;
===Metahry===&lt;br /&gt;
&lt;br /&gt;
Sú to hry, ktorých hra znamená rozvoj pravidiel, cieľa alebo predmetu inej hry. Metahry sa snažia o maximalizovanie praktickej hodnoty vyvinutého súboru pravidiel. Teória [http://en.wikipedia.org/wiki/Metagame metahier] je spojená s dizajnom [http://en.wikipedia.org/wiki/Mechanism_design mechanizmov hier] [1].&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6963</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6963"/>
		<updated>2010-09-06T17:24:06Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Spustiteľná verzia programu=&lt;br /&gt;
&lt;br /&gt;
Spustiteľná verzia programu hry dáma je dostupná [http://defluo333.co.cc/files/Dama.zip TU]. &lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.] http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.]http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6962</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6962"/>
		<updated>2010-09-06T17:21:07Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Spustiteľná verzia programu=&lt;br /&gt;
&lt;br /&gt;
Spustiteľnú verziu programu môžete stiahnuť na adrese http://defluo333.co.cc/files/Dama.zip&lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.] http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.]http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6961</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6961"/>
		<updated>2010-09-06T16:47:47Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.] http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.]http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6960</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6960"/>
		<updated>2010-09-06T16:44:58Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
&lt;br /&gt;
Cieľom práce bolo objasniť základy teórie hier a teórie grafov a tieto poznatky potom aplikovať do programu v praktickej časti. V teoretickej časti sú popísané spôsoby reprezentácie rozhodovacích problémov a samostatná časť je venovaná ich riešeniu a to hlavne hľadanie optimálnej stratégie v hrách reprezentovaných hernými stromami.&lt;br /&gt;
&lt;br /&gt;
Praktická časť je venovaná tvorbe aplikácie, ktorá by využívala umelú inteligenciu v doskovej hre dáma. Celá umelá inteligencia je založená na algoritme minimax, rozšírenom o metódu alfa-beta orezávania. &lt;br /&gt;
&lt;br /&gt;
Pomerne netradične je v mojej implementácii poňatý generátor ťahov, ktorý priamo generuje jednotlivé pozície. Tento postup sa ukázal ako vhodný a napomohol k zjednodušeniu a sprehľadneniu výsledného programu.&lt;br /&gt;
&lt;br /&gt;
Výsledná programová implementácia je pomerne úspešná a pre neprofesionálneho hráča je hra dostatočne obtiažna.&lt;br /&gt;
&lt;br /&gt;
Program je možné ďalej v budúcnosti doplniť o pokročilejšie metódy zrýchľujúce minimax algoritmus a spresniť ohodnocovanie pozícií. Taktiež sa ponúka možnosť výsledný kód prepísať do multiplatformovej podoby, prípadne vytvoriť online verziu programu s využitím rôznych webových technológií.&lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
&lt;br /&gt;
#Game theory. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Game_theory.&lt;br /&gt;
#Nash equilibrium. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Nash_equilibrium.&lt;br /&gt;
#Kadlic, Michal. Iterovaná väzňova dilema. [Online] 2008. [Dátum: 2. 1 2009.] http://www2.fiit.stuba.sk/~kapustik/ZS/Clanky0405/kadlic/ipd.html.&lt;br /&gt;
#RAND. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/RAND.&lt;br /&gt;
#Nečas, Jiří. Grafy a jejich použití. Praha : SNTL, 1978.&lt;br /&gt;
#Plesník, Ján. Grafové algoritmy. Bratislava : VEDA, 1983.&lt;br /&gt;
#Graph coloring. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_coloring.&lt;br /&gt;
#Flow network. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Network_flow.&lt;br /&gt;
#Wróblewski, Piotr. Algoritmy, datové struktury a programovací techniky. Brno : Computer Press, 2004.&lt;br /&gt;
#Game tree. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game_tree.&lt;br /&gt;
#Dáma (hra). Wikipedia. [Online] 2010. [Dátum: 7. 4 2010.] http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra).&lt;br /&gt;
#Berghen, Frank Vanden. C++ XML Parser. Kranf Site. [Online] [Dátum: 5. 2 2010.] http://www.applied-mathematics.net/tools/xmlParser.html.&lt;br /&gt;
#Teória hier. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier.&lt;br /&gt;
#Zachar, Peter. Teória hier : história matematiky. [Online] 2008. [Dátum: 2. 1 2009.]http://fedu.ku.sk/~tkacik/predmety/download/hm/prace/zachar.pdf.&lt;br /&gt;
#Extensive-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Extensive_form_game.&lt;br /&gt;
#Normal-form game. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Normal_form_game.&lt;br /&gt;
#Graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_theory.&lt;br /&gt;
#Glossary of graph theory. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Glossary_of_graph_theory.&lt;br /&gt;
#Graph (mathematics). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Graph_(mathematics).&lt;br /&gt;
#Podgraf. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Podgraf.&lt;br /&gt;
#Kružnica (graf). Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://sk.wikipedia.org/wiki/Kru%C5%BEnica_(graf).&lt;br /&gt;
#Decision tree. Wikipedia. [Online] 2008. [Dátum: 11. 25 2008.] http://en.wikipedia.org/wiki/Decision_tree.&lt;br /&gt;
#Seven Bridges of Königsberg. Wikipedia. [Online] 2008. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg.&lt;br /&gt;
#Game complexity. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Game-tree_complexity.&lt;br /&gt;
#Dobeš, Dušan. Minimax a Alphabeta: cesta do srdce šachových programů. Computerworld. [Online] 1999. [Dátum: 2. 1 2009.] &lt;br /&gt;
http://archiv.computerworld.cz/cwarchiv.nsf/clanky/1DDC3C7432078B37C12569B00054536A?OpenDocument.&lt;br /&gt;
#Minimax. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Minimax.&lt;br /&gt;
#Alpha-beta pruning. Wikipedia. [Online] 2008. [Dátum: 25. 11 2008.] http://en.wikipedia.org/wiki/Alpha-beta_pruning.&lt;br /&gt;
#Bodén, Mikael. Alpha-beta pruning example. emunix.emich.edu. [Online] 2006. [Dátum: 25. 11 2008.] http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld018.htm.&lt;br /&gt;
#Draughts. Wikipedia. [Online] 2009. [Dátum: 2. 1 2009.] http://en.wikipedia.org/wiki/Draughts.&lt;br /&gt;
#Nešetřil, Jaroslav. Teorie grafů. Praha : SNTL, 1979. s. 316. 04-017-79.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v jazyce C. Brno : CP Books, 2005.&lt;br /&gt;
#Kadlec, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Brno : Computer Press, 2004.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6959</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6959"/>
		<updated>2010-09-06T16:31:12Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr22-okno_aplikacie.jpg | thumb | 400px | right | '''Obr. 22 – Okno aplikácie''']]&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
Presun jednotlivých figúrok na šachovnici je realizovaný myšou. Po umiestnení kurzora nad obrázok figúrky a následným stlačením ľavého tlačidla myši užívateľ „uchopí“ požadovanú figúrku. Pohybom myši pri stlačenom ľavom tlačidle sa potom dá figúrka „ťahaním“ premiesťnovať na šachovnici. Program sám zabezpečuje, že figúrkou nie je možné ťahať na biele polia šachovnice. Pri ilegálnom ťahu sa figúrka vráti na pôvodnú polohu a v spodnej časti okna sa vypíše hlásenie o chybe v hráčovom ťahu. Po správnom ťahu užívateľa je ihneď vykonaný ťah počítača a opäť je na ťahu užívateľ. Pri možnosti viacnásobného skákania sa otvorí dialógové okno s otázkou, či chce užívateľ ďalej skákať.&lt;br /&gt;
&lt;br /&gt;
V pravej časti okna programu je možné tlačidlom spustiť novú hru, prípadne uložiť alebo načítať zo súboru rozloženie figúrok na šachovnici. Pritom sa zobrazí dialógové okno na výber *.xml súboru s uloženou alebo práve ukladanou pozíciou. Ďalej program umožňuje vrátiť ťah o jeden krok späť. Keďže v aplikácii nie je zabudovaná funkcia prehrávania jednotlivých ťahov, je možné posunúť sa z každej pozície naspäť iba o jeden ťah. &lt;br /&gt;
&lt;br /&gt;
Posledným ovládacím prvkom je posuvník na nastavenie obtiažnosti. Hodnota nastavenej obtiažnosti priamo zodpovedá hĺbke prehľadávania ťahov v [[#Implementácia algoritmu minimax | metóde minimax]]. To znamená, že čím väčšia je nastavená hĺbka prehľadávania, tým je lepšia úroveň [[#Umelá inteligencia | umelej inteligencie]].&lt;br /&gt;
&lt;br /&gt;
Po ukončení hry sa otvorí dialógové okno so správou o výhre, prehre alebo remíze a začne sa nová hra.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr22-okno_aplikacie.jpg&amp;diff=6958</id>
		<title>Súbor:Atgathvrp-obr22-okno aplikacie.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr22-okno_aplikacie.jpg&amp;diff=6958"/>
		<updated>2010-09-06T16:25:39Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6957</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6957"/>
		<updated>2010-09-06T16:23:16Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
Na to, aby bolo možné zistiť, aký ťah je najvhodnejšie urobiť z aktuálnej danej pozície, ktorá je analyzovaná [[#Implementácia algoritmu minimax | minimax metódou]], som sa rozhodol upraviť samotnú minimax funkciu tak, aby si vedela zapamäť index najlepšieho ťahu z počiatočnej pozície, teda z koreňového vrcholu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Na zistenie, či sa jedná o ťahy z počiatočnej pozície je využitý parameter &amp;lt;tt&amp;gt;bool PrvaUroven&amp;lt;/tt&amp;gt;, ktorý musí mať pri prvotnom zavolaní funkcie hodnotu ''TRUE''. Hodnota tohto parametra pri ďalších rekurzívnych volaniach funkcie &amp;lt;tt&amp;gt;AlfaBeta(...)&amp;lt;/tt&amp;gt; je ''FALSE''. Takto funkcia vie, že má určovať index najlepšieho ťahu, iba v prvej úrovni [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]]. Výsledný pseudokód alfa-beta funkcie je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, Hrac, Hlbka, Alfa, Beta, PrvaUroven) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
&lt;br /&gt;
   if(Hlbka&amp;lt;=0 || KoncovaPozicia(Sachovnica)==TRUE)&lt;br /&gt;
      if(Hrac) &lt;br /&gt;
         //ludsky hrac minimalizuje, preto sa jeho ohodnotenie&lt;br /&gt;
         //musi prevratit, aby hodnota pozicie bola staticka&lt;br /&gt;
         return -OhodnotPoziciu(Pom_Sach); &lt;br /&gt;
      else&lt;br /&gt;
         return OhodnotPoziciu(Pom_Sach);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Sachovnica);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Sachovnica, IndexTahu);   &lt;br /&gt;
      Hodnota=-minimax(Pozicia,otoc(Hrac),Hlbka-1,-Beta,-Alfa,FALSE);&lt;br /&gt;
      VratTah(Sachovnica, IndexTahu);&lt;br /&gt;
	    	&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
      {&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
         //ak sa vykonavaju jednotlive tahy z pociatocnej pozicie, &lt;br /&gt;
         //tak sa ulozi index najlepsieho tahu&lt;br /&gt;
         if(PrvaUroven==TRUE)&lt;br /&gt;
            IndexNajTahu=i;	&lt;br /&gt;
      }&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=Beta)  &lt;br /&gt;
         break;  &lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;Alfa)&lt;br /&gt;
         Alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, parameter &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; nadobúda hodnoty ''TRUE'' alebo ''FALSE'', kde ''TRUE'' znamená, že je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]] na ťahu ľudský hráč a ''FALSE'' symbolizuje ťahanie počítačového protivníka. Prvotné zavolanie tejto funkcie preto pre výpočet ťahu [[#Umelá inteligencia | umelej inteligencie]] musí mať tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Sachovnica, FALSE, Hlbka, -∞, ∞, TRUE) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ľudský hráč (biely) minimalizuje a tým pádom je vo výhode, ak majú pozície záporné ohodnotenie. Pre [[#Implementácia algoritmu minimax | statickú hodnotu]] však treba túto hodnotu obrátiť, aby výhodná pozícia bola mala hodnotu kladnú.&lt;br /&gt;
&lt;br /&gt;
Z takejto funkcie už vieme index ťahu, ktorý je z danej pozície najlepšie vykonať. Keďže mnou implementovaný generátor ťahov vie aj priamo vykonávať ťahy podľa  zadaného indexu, je už realizácia samotného optimálneho ťahu jednoduchá. Celé vykonanie  najlepšieho ťahu má na starosti metóda &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda zavolá alfa-beta funkciu so správnymi parametrami a potom pomocou [[#Generátor ťahov | generátora ťahov]] vykoná ťah s indexom &amp;lt;tt&amp;gt;IndexNajTahu&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Úroveň [[#Umelá inteligencia | umelej inteligencie]] je pomerne dobrá aj vzhľadom na amatérsky spôsob [[#Ohodnocovanie pozícií | ohodnocovania jednotlivých pozícií]]. Na úspešnosť ťahov samotného algoritmu má samozrejme vplyv aj nastavená hĺbka prehľadávania v [[#Implementácia algoritmu minimax | algoritme minimax]]. Už pri hĺbke 5 je hra pre bežného hráča pomerne obtiažna. Pričom je možné nastaviť maximálne hĺbku prehľadávania 10. Väčšia úroveň prehľadávania sa negatívne podpíše na celkovej rýchlosti programu.&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
&lt;br /&gt;
O zobrazenie a ovládanie priebehu hry užívateľom programu sa stará viacero rôznych funkcií, ktoré však už nie sú natoľko podstatné pre samotné jadro programu. Tieto funkcie sú taktiež veľmi výrazne späté s použitým vývojovým prostredím. Pretože som však chcel výraznejšie oddeliť jadro programu a samotné grafické rozhranie, rozhodol som sa pre vytvorenie štruktúry, ktorá by slúžila ako prepojenie medzi týmito dvoma funkčnými celkami.&lt;br /&gt;
&lt;br /&gt;
Týmto spojovacím článkom je trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;, ktorá obsahuje dve hlavné metódy realizujúce spojenie s jadrom programu. Metóda &amp;lt;tt&amp;gt;RefreshGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; obnoví rozloženie figúrok na šachovnici v grafickom rozhraní podľa matice šachovnice v triede &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Ďalšia metóda &amp;lt;tt&amp;gt;RefreshSachovnicePodlaGUI(TBoard Sachovnica)&amp;lt;/tt&amp;gt; naopak zapíše do matice šachovnice hodnoty z grafického rozhrania. Zvyšné metódy triedy &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt; sa starajú o výpis potrebných správ a okien s hláseniami.&lt;br /&gt;
&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
&lt;br /&gt;
Celé užívateľské prostredie programu je vytvorené priamo v prostredí editoru C++ Builder a je tvorené jedným oknom, ktoré obsahuje všetky nutné ovládacie prvky. Keďže mojim cieľom bola hlavne praktická implementácia teoretických postupov, je program tvorený iba najzákladnejšími funkčnými celkami nutnými k realizácii. &lt;br /&gt;
&lt;br /&gt;
Najdôležitejšou súčasťou grafického užívateľského prostredia je samotná šachovnica s figúrkami. Obrázky šachovnice a jednotlivých figúrok sú načítavané z *.bmp súborov. Napravo od šachovnice sú tlačidlá na spustenie novej hry, načítanie a uloženie pozície a na vrátenie ťahu o jeden krok späť. Pod šachovnicou sa nachádza priestor pre zobrazenie správ o nelegálnom ťahu užívateľa.&lt;br /&gt;
&lt;br /&gt;
===Ovládanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6956</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6956"/>
		<updated>2010-09-06T16:02:51Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou negamax. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | metódy alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje pseudokód na ďalšej strane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia);&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //hodnoty alfa a beta sa musia “prevratit” pre druheho hraca&lt;br /&gt;
      Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
      //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
      //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;=beta)  &lt;br /&gt;
         break; //vyskocenie z for cyklu&lt;br /&gt;
      if(NajlepsiaHodnota&amp;gt;alfa)&lt;br /&gt;
         alfa=NajlepsiaHodnota; &lt;br /&gt;
   } &lt;br /&gt;
   return NajlepsiaHodnota; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcia algoritmu minimax s alfa-beta orezávaním je v programe implementovaná metódou &amp;lt;tt&amp;gt;int AlfaBeta(TBoard Sachovnica,bool Hrac,unsigned int Hlbka,int Alfa,int Beta,bool PrvaUroven)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Táto metóda vracia hodnotu optimálneho ťahu. Parameter &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; udáva aktuálnu pozíciu. &amp;lt;tt&amp;gt;Hrac&amp;lt;/tt&amp;gt; je parameter striedavo nadobúdajúci hodnotu ''TRUE'' alebo ''FALSE'' (pravda/nepravda) v jednotlivých rekurzívnych volaniach a symbolizuje hráča, ktorý je v hernom strome aktuálne na ťahu. Táto informácia je dôležitá pri zisťovaní [[#Implementácia algoritmu minimax | statickej hodnoty pozície]]. Ďalším parametrom je hĺbka prehľadávania &amp;lt;tt&amp;gt;- Hlbka&amp;lt;/tt&amp;gt;, ktorá určuje počet úrovní výsledného herného stromu. Nasledujú parametre &amp;lt;tt&amp;gt;Alfa&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Beta&amp;lt;/tt&amp;gt;, ktoré určujú hranice prehľadávaných hodnôt v strome. Posledný parameter &amp;lt;tt&amp;gt;PrvaUroven&amp;lt;/tt&amp;gt; je pomocnou premennou pre samotný výber optimálneho ťahu, ktorý je popísaný v nasledujúcej kapitole.&lt;br /&gt;
&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6955</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6955"/>
		<updated>2010-09-06T15:50:43Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté, pri tvorbe a prehľadávaní [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] v mojej implementácii je využitý [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]]. Tento však sám o sebe nehovorí nič o optimálnom ťahu, ktorý by sa mal vykonať. Výstupom tohto algoritmu je iba číselná hodnota najlepšej pozície pre daného hráča, ktorú je možné dosiahnuť z aktuálnej (koreňovej) pozície, a to za predpokladu, že obaja hráči vykonajú vždy najoptimálnejší ťah. Ak by algoritmus minimax mohol vytvoriť a preskúmať celý herný strom až do všetkých možných koncov hry (listové vrcholy) a jeho výstupom by bola nula, potom by to znamenalo, že pri neomylnosti oboch hráčov nie je možné hru ukončiť inak ako remízou.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska voľby vhodného ťahu z danej pozície je však výstup samotného minimax algoritmu pomerne nepoužiteľný. Preto bolo aj v mojej implementácii potrebné vhodne tento algoritmus upraviť tak, aby bolo možné rozhnodnúť, ktorý ťah je najlepšie vykonať z danej pozície. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení sa o výber vhodného ťahu starajú metódy &amp;lt;tt&amp;gt;int AlfaBeta(...)&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;UrobNajlepsiTah(TBoard Sachovnica,unsigned int HlbkaPrehladavania)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. V ďalšom popise sa budem najskôr venovať samotnej programovej implementácii metódy minimax. Spôsob výberu optimálneho ťahu za pomoci tejto metódy bude opísaný až v [[#Výber najlepšieho ťahu | kapitole 4.9.3]].&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva pozostáva z dvoch fáz. Prvou fázou je generovanie jednotlivých vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]], ktoré reprezentujú pozície konkrétnej hry. To sa deje pomocou [[#Generátor ťahov | generátora ťahov]] až pokiaľ sa nenarazí na listový vrchol. Listové vrcholy sú tvorené zväčša vrcholmi, ktoré sa nachádzajú v zadanej hĺbke herného stromu, no môžu ich tvoriť aj koncové pozície hry. Všetky listové vrcholy sú potom ohodnotené [[#Ohodnocovanie pozícií | ohodnocovacou funkciou]]. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom “hore“ z listových vrcholov a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku koreňovému vrcholu a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmu]] pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať pseudokódom podobným jazyku C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
jednourovnovyminimax(Pozicia) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //zisti sa pocet moznych tahov z danej pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);     &lt;br /&gt;
   //postupne sa vykonavaju mozne tahy&lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //kazdy tah sa ohodnoti&lt;br /&gt;
      Hodnota=OhodnotPoziciu(Pozicia); &lt;br /&gt;
      //pozicia sa po vykonani a ohodnoteni tahu vrati do //pociatocneho stavu&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v //danej urovni&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z daného kódu je zrejmé, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Tiež je vidieť, že funkcia je upravená iba pre maximalizujúceho hráča, pretože sa hľadá, čo najvyššia hodnota pozície. &lt;br /&gt;
&lt;br /&gt;
Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúcí pseudokód.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
{                &lt;br /&gt;
   NajlepsiaHodnota=-∞;&lt;br /&gt;
   //ak sa dospeje do vopred danej hlbky alebo je aktualna pozicia //koncova, tak sa pozicia ohodnoti&lt;br /&gt;
   if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==TRUE)&lt;br /&gt;
      return OhodnotPoziciu(Pozicia); //staticka hodnota pozicie&lt;br /&gt;
   pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
   for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
   {&lt;br /&gt;
      UrobTah(Pozicia, IndexTahu);   &lt;br /&gt;
      //tu funkcia zavola samu seba a znova generuje nove &lt;br /&gt;
      //pozicie pre aktualnu poziciu&lt;br /&gt;
      Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);&lt;br /&gt;
      VratTah(Pozicia, IndexTahu);&lt;br /&gt;
      if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
         NajlepsiaHodnota=Hodnota;&lt;br /&gt;
   } 	&lt;br /&gt;
   return NajlepsiaHodnota;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Túto metódu ilustruje nasledujúci príklad:&lt;br /&gt;
&lt;br /&gt;
A = {-1,4,-8,2} , max(A) = 4 , min(A) = -8  ==&amp;gt; min(A) == -max(-A)&lt;br /&gt;
&lt;br /&gt;
Ďalej je dôležité, aby funkcia &amp;lt;tt&amp;gt;OhodnotPoziciu(Pozicia)&amp;lt;/tt&amp;gt; vracala tzv. '''statickú hodnotu pozície'''. Je to taká hodnota, ktorá je kladná, ak je aktuálny hráč vo výhode a záporná ak je v nevýhode. A to bez ohľadu na to, ktorý z hráčov maximalizuje alebo minimalizuje. Celá táto úprava minimaxového algoritmu je známa pod názvom '''negamax'''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=6947</id>
		<title>Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=6947"/>
		<updated>2010-09-05T17:21:07Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;1&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Ľubomír Milko&lt;br /&gt;
|Ing. Juraj Ďuďák&lt;br /&gt;
|2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Táto práca obsahuje charakteristiku a stručnú históriu teórie hier a teórie grafov a popisuje rôzne druhy reprezentácie problémov pomocou týchto teórií. Časť práce sa zaoberá použitím herných stromov a metódy minimax na analýzu a riešenie hier. Cieľom práce je potom programová implementácia metódy minimax s alfa-beta orezávaním pri tvorbe umelej inteligencie pre hru dáma naprogramovanú v jazyku C++.&lt;br /&gt;
|This work contains the characteristics and short history of  game theory and graph theory and describes various forms of representation of problems using these theories. Part of this work deals with using game trees and minimax method for analysing and solving games. The aim of this work is a program implementation of minimax method with alpha-beta pruning in artificial intelligence for the game draughts programmed in C++ language.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
Problémy vyžadujúce správne rozhodovanie s ohľadom na následky zvoleného rozhodnutia nás sprevádzajú v takmer všetkých oblastiach ľudskej činnosti od hrania rôznych spoločenských hier až po pokročilé riadenie cestnej siete, správne ekonomické rozhodnutia alebo stratégiu vojenských konfliktov. Postupné snahy o matematickú interpretáciu a riešenie týchto problémy voľby správneho rozhodnutia vyústili v samostatné odvetvie aplikovanej matematiky s názvom teória hier. V tejto teórii sa rozhodovacie problémy znázorňujú ako množina stratégií, ktoré možno prijať a množina následkov, ktoré vzniknú v dôsledku zvolenej stratégie. Následky sú často číselnou interpretáciou daného stavu. Na praktickú interpretáciu tohto súboru množín sa využíva teória grafov. Tieto dve teórie možno použiť na vyriešenie mnohých praktických rozhodovacích problémov. Zaujímavým praktickým a názorným  príkladom aplikácie môže byť aj hľadanie optimálneho ťahu v doskových hrách akou je napríklad dáma. Súčasťou tejto práce je teda aj praktické využitie poznatkov z teórie hier a teórie grafov v tomto type hier. Cieľom tejto práce potom je:  &lt;br /&gt;
*charakteristika teórie hier a teórie grafov&lt;br /&gt;
*popis interpretácie základných rozhodovacích problémov pomocou týchto teórií&lt;br /&gt;
*praktické použitie popísaných teoretických princípov v programe – hra dáma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Zoznam použitých skratiek a pojmov'''&lt;br /&gt;
&lt;br /&gt;
;GUI: (z angl. Graphical User Interface) grafické užívateľské rozhranie&lt;br /&gt;
;AI: (z angl. Artificial Intelligence) umelá inteligencia&lt;br /&gt;
;RAND: (z angl. Research ANd Development) americká nezisková výskumná korporácia, ktorá bola založená pre americkú armádu, no neskôr sa jej pole pôsobnosti rozšírilo aj do iných oblastí.&lt;br /&gt;
;Hra: V teórii hier je hra strategická interakcia medzi jednotlivcami.&lt;br /&gt;
;Hráč: Hráčom sa označuje každý aktívny účastník hry.&lt;br /&gt;
;Pozícia: Pozícia je označenie pre aktuálny stav hry. Môže to byť napr. rozloženie figúrok na šachovnici.&lt;br /&gt;
;Ťah: Ťah je zvolená a uskutočnená stratégia hráča v danej pozícii hry.&lt;br /&gt;
;Riešenie hry: Riešením hry je nájdenie takej postupnosti ťahov (stratégie), ktorá vedie k viťaznej pozícii.&lt;br /&gt;
;Graf: V teórii grafov je grafom objekt tvorený množinou bodov poprepájaných čiarami podľa daných pravidiel. Body sú označované ako vrcholy a čiary ako hrany grafu.&lt;br /&gt;
;Strom: Herný strom je typ grafu, ktorý sa využíva na znázornenie priebehu hry.	&lt;br /&gt;
;Vrchol (uzol): Vrchol herného stromu reprezentuje pozíciu hry.&lt;br /&gt;
;Hrana: Hrana herného stromu symbolizuje ťah niektorého z hráčov z určitej pozície.&lt;br /&gt;
;Minimax: Metóda minimax sa využíva na prehľadávanie herných stromov s cieľom nájdenia optimálneho ťahu z danej pozície.&lt;br /&gt;
;Alfa-beta orezávanie: Technika na zmenšenie počtu prehľadávaných vrcholov v metóde minimax, čím sa proces prehľadávania urýchli.&lt;br /&gt;
;TRUE: Označenie true symbolizuje logickú hodnotu pravda. Symbolom logickej pravdivosti je aj číslo 1.	&lt;br /&gt;
;FALSE: Označenie false symbolizuje logickú hodnotu nepravda. Symbolom logickej nepravdivosti  aj číslo 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teória hier=&lt;br /&gt;
==Základné pojmy a charakteristika teórie hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier Teória hier] je odvetvím aplikovanej matematiky, ktorá sa snaží matematicky zachytiť správanie v strategických situáciách, kde úspech jednotlivca pri vykonaní určitej voľby závisí od volieb ostatných [1].&lt;br /&gt;
&lt;br /&gt;
Súbor situácií, v ktorých sa každý účastník môže nachádzať je v teórii hier nazývaný [http://en.wikipedia.org/wiki/Game#Definitions hra]. '''Hra''' je akousi strategickou interakciou medzi jednotlivcami. Každý účastník (prvok, ktorý sa aktívne zúčastňuje hry) je označený ako '''hráč'''. Každý hráč má v daných momentoch možnosť voľby akcie, ktorá ďalej ovplyvní priebeh hry. Každá z možných akcií, ktoré hráč môže vykonať sa označuje ako '''ťah'''. Súbor ťahov, ktoré hráč použije v hre je označovaný ako [http://en.wikipedia.org/wiki/Strategy stratégia].&lt;br /&gt;
&lt;br /&gt;
Teória hier skúma predpokladané a skutočné správanie sa hráčov v hrách, rovnako ako aj optimálne stratégie. Zdanlivo odlišné typy interakcií medzi hráčmi a hrou sa môžu prejavovať podobnými štruktúrami pohnútok, takže všetky môžu byť reprezentované ako príklady jednej konkrétnej hry. V počiatkoch bola teória hier rozvíjaná na analyzovanie súťaží (situácií), kde každému hráčovi sa darilo lepšie na úkor ostatných [1]. Jedná sa o tzv. [[#Hry s nulovým a nenulovým súčtom | hry s nulovým súčtom]]. Išlo napr. o analýzu rôznych vojenských konfliktov, prípadne spoločenských hier. Neskôr sa teória hier rozšírila na analyzovanie širokého spektra  interakcií, ktoré sú klasifikované podľa niekoľkých kritérií. Dnes pojem teória hier zahŕňa množstvo teórií, ktoré možno aplikovať v rôznych rozhodovacích problémoch, kde hráčmi môžu byť ľudia, počítače, zvieratá, rastliny, atď.&lt;br /&gt;
&lt;br /&gt;
Tradičné aplikácie teórie hier sa snažia v hrách nájsť stav rovnováhy. To znamená nájsť súbor stratégií, kde je nepravdepodobné, že jednotlivé prvky budú meniť svoje správanie. Na riešenie týchto problémov bolo vyvinutých veľa konceptov, z ktorých najznámejšia je [http://en.wikipedia.org/wiki/Nash_equilibrium Nashova rovnováha] [1].	&lt;br /&gt;
&lt;br /&gt;
===Nashova rovnováha===&lt;br /&gt;
&lt;br /&gt;
Je to koncept riešenia hier zahŕňajúcich dvoch alebo viac hráčov, kde každý hráč pozná stratégie rovnováhy (teda najlepšie stratégie, aké môžu zvoliť ostatní, aby získali čo najviac) ostatných hráčov a žiadny hráč nemá čo získať zmenou iba svojej vlastnej stratégie. Ak každý hráč zvolil stratégiu a žiadny hráč nemôže profitovať zmenou svojej stratégie, pokiaľ ostatní hráči ponechajú svoje stratégie nezmenené, potom daný súbor strategických rozhodnutí a odpovedajúcich odmien stanovuje Nashov stav rovnováhy. Inými slovami, byť v Nashovom stave rovnováhy znamená, že každý hráč odpovie negatívne na otázku : “Ak s určitosťou poznám stratégie ostatných hráčov, môžem profitovať zmenou mojej stratégie ?“ [1]. Jedným z najznámejších typov takejto hry je napr. [http://sk.wikipedia.org/wiki/V%C3%A4z%C5%88ova_dilema väzňova dilema] spopularizovaná matematikom [http://en.wikipedia.org/wiki/Albert_W._Tucker Albertom W. Tuckerom]. &lt;br /&gt;
&lt;br /&gt;
===Väzňova dilema===&lt;br /&gt;
&lt;br /&gt;
Opis problému je nasledovný:&lt;br /&gt;
Dvaja väzni vykradli banku a boli neskôr chytení políciou. Vo väzení ich zavrú do samostatných ciel. Väzni nemajú možnosť spolu komunikovať. Polícia nemá dosť dôkazov aby uväznila oboch. Obaja dostanú od polície ponuku spolupracovať (zradiť komplica), výmenou za nízky trest pre seba. Možné výsledky sú takéto: &lt;br /&gt;
*Ak budú obaja navzájom spolupracovať, budú ich držať najviac rok vo vyšetrovacej väzbe. &lt;br /&gt;
*Ak jeden z väzňov zradí komplica, pustia ho ihneď na slobodu, ale komplic dostane 10 rokov väzenia. &lt;br /&gt;
*Ak sa priznajú/zradia obaja, rozdelia si 10 ročný trest, čiže každý dostane 5 rokov. &lt;br /&gt;
Z hľadiska skupinového správania sa je najvýhodnejšie riešenie ak obaja spolupracujú, pretože vtedy je celkový čas ktorý obaja strávia vo väzení najmenší. Z hľadiska sebeckého správania sa každého z nich je najjednoduchšie priznať sa, pretože tak môže dostať v horšom prípade 5 rokov, oproti možnostiam 1 alebo 10 rokov ak sa neprizná [11].&lt;br /&gt;
&lt;br /&gt;
==Stručný vývoj teórie hier==&lt;br /&gt;
&lt;br /&gt;
Prvá známa zmienka o [[#Teória hier | teórii hier]] sa vyskytla v liste z roku 1713 napísanom [http://en.wikipedia.org/wiki/James_Waldegrave,_1st_Earl_Waldegrave Jamesom Waldegraveom]. V tomto liste Waldegrave navrhol tzv. zmiešanú minimax stratégiu ako riešenie kartovej hry pre dvoch hráčov nazývanej “le Her”. Neskôr roku 1838 využil hernú teoretickú analýzu [http://en.wikipedia.org/wiki/Augustin_Cournot Antoine Augustin Cournot] vo svojej knihe Výskumy matematických princípov teórie bohatstva. V tejto svojej práci Cournot pojednáva o duopoloch a prezentuje riešenie, ktoré je obmedzenou verziou [[#Nashova rovnováha | Nashovej rovnováhy]].&lt;br /&gt;
&lt;br /&gt;
Hoci bola Cournotova analýza viac všeobecná ako Waldegraveova, teória hier stále neexistovala ako samostatná oblasť vedy, až pokiaľ [http://en.wikipedia.org/wiki/John_von_Neumann John von Neumann], ktorý je považovaný za zakladateľa teórie hier, nepublikoval sériu prác na túto tému v roku 1928. Neskôr, v roku 1944, Von Neumann spolu s [http://en.wikipedia.org/wiki/Oskar_Morgenstern Oskarom Morgensternom] vydal knihu ''Teória hier a ekonomické správanie''. Táto kniha obsahuje metódy hľadania riešení hier dvoch hráčov [[#Hry s nulovým a nenulovým súčtom | s nulovým súčtom]]. Počas tohto obdobia bola teória hier primárne zameraná na teóriu [[#Kooperatívne a nekooperatívne hry | kooperatívnych hier]], ktorá analyzovala optimálne stratégie pre skupiny jednotlivcov za predpokladu, že môžu medzi sebou presadiť dohodu o vhodnej spoločnej stratégii.&lt;br /&gt;
&lt;br /&gt;
V roku 1950 sa objavila prvá zmienka o väzňovej dileme a organizácia [http://en.wikipedia.org/wiki/RAND RAND]  (Research ANd Development)  podnikla experiment na základe tejto hry. V tomto čase aj [http://en.wikipedia.org/wiki/John_Forbes_Nash,_Jr. John Nash] vyvinul kritérium pre vzájomnú koexistenciu stratégie hráčov, známe ako [[#Nashova rovnováha | Nashova rovnováha]]. Toto kritérium možno aplikovať na širšie spektrum hier, než kritérium, ktoré navrhli Neumann a Morgenstern. Toto kritérium je dostatočne univerzálne a umožňuje analýzu kooperatívnych aj nekooperatívnych hier. &lt;br /&gt;
&lt;br /&gt;
Teória hier zaznamenala náhly vzostup v 50-tych rokoch, kedy boli vymyslené nové herné koncepty ako napríklad: jadrá, [[#Rozšírená forma | rozšírená forma]] hier, fiktívne hry, atď. V tomto období sa aj objavili prvé aplikácie teórie hier vo filozofii a politike.&lt;br /&gt;
&lt;br /&gt;
V roku 1956 [http://en.wikipedia.org/wiki/Reinhard_Selten Reinhard Selten] uviedol svoj koncept riešenia tzv. [http://en.wikipedia.org/wiki/Perfect_equilibrium perfektnej rovnováhy] v určitej podmnožine hry, ktorá vylepšila [[#Nashova rovnováha | Nashovu rovnováhu]]. &lt;br /&gt;
&lt;br /&gt;
V 70-tych rokoch bola teória hier výrazne aplikovaná v biológii, hlavne ako dôsledok práce [http://en.wikipedia.org/wiki/John_Maynard_Smith Johna Maynarda Smitha] a jeho evolučne stabilnej stratégie. Navyše boli uvedené a analyzované ďalšie koncepty rozširujúce teóriu hier.&lt;br /&gt;
&lt;br /&gt;
V roku 2005, herní teoretik [http://en.wikipedia.org/wiki/Thomas_Schelling Thomas Schelling] získal Nobelovu cenu za prácu na dynamických modeloch, ktoré boli prvotnými ukážkami [http://en.wikipedia.org/wiki/Evolutionary_game_theory evolučnej hernej teórie]. &lt;br /&gt;
&lt;br /&gt;
V roku 2007 boli [http://en.wikipedia.org/wiki/Roger_Myerson Roger Myerson], spolu s [http://en.wikipedia.org/wiki/Leonid_Hurwicz Leonidom Hurwiczom] a [http://en.wikipedia.org/wiki/Eric_Maskin Ericom Maskinom] ocenení Nobelovou cenou za ekonomiku za položenie základov [http://en.wikipedia.org/wiki/Mechanism_design_theory teórie dizajnu mechanizmov hier].&lt;br /&gt;
&lt;br /&gt;
==Oblasti využitia teórie hier==&lt;br /&gt;
&lt;br /&gt;
[[#Teória hier | Teória hier]] bola využívaná hlavne na štúdium správania ľudí a zvierat. Primárne bola rozvíjaná v ekonomike na pochopenie rôznych druhov ekonomického správania, zahŕňajúcich správanie firiem, trhu a zákazníkov. Postupne sa využitie teórie hier v spoločenských vedách zväčšovalo a poznatky z teórie hier sa začali aplikovať aj na politické, sociologické a psychologické javy. &lt;br /&gt;
&lt;br /&gt;
Hernú teoretickú analýzu spočiatku využíval [http://en.wikipedia.org/wiki/Ronald_Fisher Ronald Fisher] na štúdium správania zvierat v 30-tych rokoch (hoci ešte predtým urobil k tejto téme niekoľko neformálnych vyjadrení [http://sk.wikipedia.org/wiki/Charles_Darwin#Orchidee.2C_Vari.C3.A1cia.2C_P.C3.B4vod_.C4.8Dloveka_a_.C4.8Cervy Charles Darwin]). Neskôr boli analytické metódy, ktoré využíval aj Fisher pomenované teória hier. Výsledky rozvoja tejto oblasti v ekonomike boli neskôr rozsiahlo aplikované v biológii Johnom M. Smithom v jeho knihe [http://en.wikipedia.org/wiki/Evolution_and_the_Theory_of_Games Evolúcia a teória hier]. &lt;br /&gt;
&lt;br /&gt;
Poznatky z teórie hier sa využívajú aj na predpovedanie a vyloženie etického a normatívneho správania. Vo filozofii sa teória hier aplikovala na pochopenie dobrého alebo správneho správania. Počiatky využitia teórie hier na tomto poli môžu byť datované až do čias Platóna. &lt;br /&gt;
&lt;br /&gt;
Prvotné aplikácie teórie hier v politických vedách je možno nájsť v práci [http://en.wikipedia.org/wiki/Anthony_Downs Anthonyho Downsa]. Významnou je napr. jeho kniha Ekonomická teória demokracie (1957). &lt;br /&gt;
&lt;br /&gt;
V ekonomike je teória hier využívaná na analýzu veľkého množstva ekonomických javov ako napr. trh, aukcie, výpredaje, duopoly, oligopoly, sociálna sieť a volebné systémy. Tento výskum sa zvyčajne zameriava na určitý súbor stratégií známych ako equilibrium (rovnováha) v hrách. V [[#Kooperatívne a nekooperatívne hry | nekooperatívnych hrách]] je najznámejším z týchto konceptov spomínaná [[#Nashova rovnováha | Nashova rovnováha]].&lt;br /&gt;
&lt;br /&gt;
V posledných rokoch zohráva teória hier významnú úlohu aj v počítačových vedách a logike. Hry sú napr. využívané na modelovanie interaktívnych výpočtov. &lt;br /&gt;
&lt;br /&gt;
Využitie teórie hier však možno nájsť aj v telekomunikáciách, doprave, psychológii, vojenských vedách, hazarde a mnohých iných oblastiach.&lt;br /&gt;
&lt;br /&gt;
==Spôsoby reprezentácie rozhodovacích problémov==&lt;br /&gt;
&lt;br /&gt;
Hry skúmané v teórii hier sú dobre definovateľnými matematickými objektmi. [[#Základné pojmy a charakteristika teórie hier | Hra]] pozostáva zo súboru hráčov, súboru ťahov (alebo stratégií), ktoré môžu hráči vykonať a daného ohodnotenia, pre každú kombináciu stratégií. Pre [[#Kooperatívne a nekooperatívne hry | nekooperatívne hry]] , kde hráči navzájom nemôžu spolupracovať sa využíva [http://en.wikipedia.org/wiki/Extensive-form_game rozšírená] alebo [http://en.wikipedia.org/wiki/Normal_form_game normálna] forma reprezentácie hry. [[#Kooperatívne a nekooperatívne hry | Kooperatívne hry]] sú často reprezentované [http://en.wikipedia.org/wiki/Characteristic_function charakteristickou funkciou]. &lt;br /&gt;
&lt;br /&gt;
===Rozšírená forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr1-rozsirena_forma.png | thumb | 200px | right | '''Obr. 1 – Rozšírená forma hry''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Extensive-form_game Rozšírená forma] môže byť použitá na opis hier s určitým dôležitým poradím vykonávania jednotlivých ťahov (stratégií). Takéto hry sú často reprezentované ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]]. Každý vrchol (uzol) tu predstavuje rozhodovací bod hráča. Hráč je označený číslom pri každom vrchole. Čiary smerujúce z každého vrcholu reprezentujú možnú akciu (ťah) príslušného hráča. Odmeny (hodnotenie) hráčov sú reprezentované na konci posledných spodných čiar. &lt;br /&gt;
&lt;br /&gt;
V hre znázornenej na obrázku 1 sú dvaja hráči. ''Hráč 1'' začína a má možnosti ''F'' alebo ''U''. ''Hráč 2'' vidí ťah ''Hráča 1'' a vyberá si medzi ťahmi ''A'' a ''R''. Ak uvažujeme, že ''Hráč 1'' vyberie ''U'' a ''Hráč 2'' zvolí možnosť ''A'', potom ''Hráč 1'' získa hodnotenie ''8'' a ''Hráč 2'' získa hodnotenie ''2''.&lt;br /&gt;
&lt;br /&gt;
Rozšírenou formou sa dajú zachytiť aj hry so [[#Simultánne a ťahové (sekvenčné) hry | simultánnym pohybom]] a [[#Hry s úplnými a neúplnými informáciami | hry s neúplnou informáciou]]. V takomto prípade buď bodkovaná čiara spája uzly na znázornenie, že sa jedná o rovnaký súbor informácií (teda, že hráči nevedia, v ktorom bode sa nachádzajú) alebo je okolo takýchto uzlov nakreslená uzavretá čiara [1].&lt;br /&gt;
&lt;br /&gt;
===Normálna forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab1-normalna_forma.png | thumb | 300px | right | '''Tab. 1 – Normálna forma – väzňova dilema''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Normal_form_game Normálna (alebo strategická)] forma  hry je reprezentovaná maticou, ktorá zobrazuje hráčov, stratégie a odmeny. Pre každú kombináciu ťahov (stratégií) priraďuje zodpovedajúce ohodnotenie (odmenu) každému z hráčov. V tabuľke 1 je znázornená tzv. [[#Väzňova dilema | väzňova dilema]]. ''Väzeň 1'' vyberá svoju stratégiu jednania z riadkov a ''väzeň 2'' zo stĺpcov. Každý z väzňov má na výber dve stratégie, reprezentované dvomi riadkami a dvomi stĺpcami. Vo vnútri buniek sú zapísané počty rokov (odmena) , ktoré budú musieť stráviť vo väzení pri zvolených stratégiách . Nevýhodné odmeny sú zvyčajne pre upresnenie zapísané zápornou hodnotou. Prvé číslo znázorňuje odmena ''väzňa 1'', druhé číslo je odmena ''väzňa 2''. &lt;br /&gt;
&lt;br /&gt;
Za predpokladu, že ''väzeň 1'' zvolí možnosť spolupracovať a ''väzeň 2'' bude tiež spolupracovať získajú obaja ohodnotenie ''-1''. Ak je hra reprezentovaná touto formou predpokladá sa, že hráči vykonávajú svoje ťahy (stratégie) súčasne alebo prinajmenšom nepoznajú ťah súpera. V opačnom prípade sa hry znázorňujú [[#Rozšírená forma | rozšírenou formou]].&lt;br /&gt;
&lt;br /&gt;
===Forma charakteristickej funkcie===&lt;br /&gt;
&lt;br /&gt;
Využíva sa pri [[#Kooperatívne a nekooperatívne hry | kooperatívnych hrách]], kde nie sú určené žiadne individuálne odmeny pre hráčov. Namiesto toho [http://en.wikipedia.org/wiki/Characteristic_function charakteristická funkcia] definuje ohodnotenie každého spojenectva. Štandardným predpokladom je že prázdna koalícia získa ohodnotenie 0. &lt;br /&gt;
&lt;br /&gt;
Pôvod tejto formy pochádza z knihy [http://en.wikipedia.org/wiki/Von_Neumann von Neumanna] a [http://en.wikipedia.org/wiki/Oskar_Morgenstern Morgensterna], ktorí pri štúdiu koaličných hier vyjadrených normálnou formou usúdili, že ak sa vytvorí koalícia ''K'', hrá proti inej koalícii ''N'' ''(N\K)'' rovnako ako keby sa hrala hra dvoch hráčov. Existujú rôzne modely odvodenia koaličných odmien z [[#Normálna forma | normálnej formy hry]], ale nie všetky hry v charakteristickej forme  môžu byť odvodené z hier určených normálnou formou. &lt;br /&gt;
&lt;br /&gt;
Formálne je hra určená formou charakteristickej funkcie daná dvojicou ''(N,ϑ)'', kde ''N'' označuje súbor hráčov a ''ϑ:2^N→R'' je charakteristická funkcia [1]. &lt;br /&gt;
&lt;br /&gt;
===Forma rozdeľujúcej funkcie===&lt;br /&gt;
&lt;br /&gt;
Rozšírenie [[#Forma charakteristickej funkcie | formy charakteristickej funkcie]], kde odmena koalície nezávisí iba na jej členoch, ale tiež na spôsobe akým sú rozdelení ostatní hráči [1].&lt;br /&gt;
&lt;br /&gt;
==Typy hier==&lt;br /&gt;
===Kooperatívne a nekooperatívne hry===&lt;br /&gt;
&lt;br /&gt;
Hra je [http://en.wikipedia.org/wiki/Cooperative_game kooperatívna] ak hráči majú možnosť vytvoriť medzi sebou určité zväzky - '''koalície'''. V takomto druhu hier sa od hráčov vyžaduje dodržanie týchto ich záväzkov. V [http://en.wikipedia.org/wiki/Non_cooperative_game nekooperatívnych hrách] sa takéto záväzky nedodržiavajú. Často je tiež v kooperatívnych hrách usudzované, že hráči môžu navzájom ''komunikovať'' (teda, že vedia navzájom o svojich stratégiách vo vytvorenom zväzku). Pri nekooperatívnych hrách je na druhú stranu väčšinou možné modelovať situácie do najmenších detailov a vyvodzovať presné dôsledky. Kooperatívne hry sa sústreďujú na hru ako celok. Určitým spojením medzi kooperatívnymi a nekooperatívnymi hrami sú tzv. '''hybridné hry''', ktoré obsahujú elementy z oboch typov [1].&lt;br /&gt;
&lt;br /&gt;
===Symetrické a asymetrické hry===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab2-symetricka_hra.png | thumb | 300px | right | '''Tab. 2 – Symetrická hra''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Symmetric_games Symetrické hry] sú také, kde odmeny (ohodnotenia) za zvolenie určitej stratégie závisia iba od ostatných stratégií, ktoré zvolia ostatní hráči a nie od toho, kto volí danú stratégiu. Inak povedané, ak môžeme zameniť hráčov a odmeny budú stále rovnaké, potom hra je symetrická. Väčšina bežne študovaných hier 2x2 je symetrická. Príkladom je napr. [[#Väzňova dilema | väzňova dilema]]. Tabuľka 2 je ukážka symetrickej hry v [[#Normálna forma | normálnej forme]].&lt;br /&gt;
&lt;br /&gt;
Väčšina asymetrických hier sú hry, kde hráči nemajú na výber rovnaké stratégie. Je tiež ale možné, že hra, ktorá má pre oboch hráčov stratégie identické, nie je symetrická. Takéto hry sa líšia v ohodnotení stratégií v závislosti od toho, aký hráč danú stratégiu vykonal [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s nulovým a nenulovým súčtom===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab3-hra_s_nulovym_suctom.png | thumb | 300px | right | '''Tab. 3 – Hra s nulovým súčtom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Zero_sum_game Hry s nulovým súčtom] sú špeciálnym typom hier s konštantným súčtom, v ktorých voľby hráčov nemôžu ani zvýšiť a ani znížiť zdroje, ktoré sú k dispozícii. V hrách s nulovým súčtom je celkové ohodnotenie všetkých hráčov vždy rovné nule (hráč môže profitovať iba na adekvátny  úkor ostatných). Príkladom takýchto hier sú aj doskové spoločenské hry ako šach, dáma alebo napr. poker. Tabuľka 3 znázorňuje hru dvoch hráčov s nulovým súčtom.&lt;br /&gt;
&lt;br /&gt;
Mnoho hier však sú hry s nenulovým súčtom (vrátane [[#Väzňova dilema | väzňovej dilemy]]). Zisk jedného hráča tu nemusí nutne znamenať stratu hráča druhého. &lt;br /&gt;
&lt;br /&gt;
Hry s konštantným súčtom zodpovedajú javom ako krádeže a hazardné hry, ale nie základným ekonomickým princípom, kde je možné potenciálne nadobudnúť zisk z obchodu [1].&lt;br /&gt;
&lt;br /&gt;
===Simultánne a ťahové (sekvenčné) hry===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Simultaneous_game Simultánne hry] sú také, pri ktorých hráči vykonávajú svoje stratégie (ťahy) súčasne alebo ak neťahajú súčasne, tak hráči, ktorí sú na ťahu neskôr nevedia o predošlých akciách svojich súperov. &lt;br /&gt;
&lt;br /&gt;
V [http://en.wikipedia.org/wiki/Sequential_game sekvenčných hrách] majú tzv. neskorší hráči určité poznatky o predošlých akciách ostatných. Tieto poznatky však môžu byť len veľmi obmedzené. Môžu byť napr. informovaní len o tom, že nejaký hráč nevykonal určitú stratégiu, no nevedia, ktorú z možných stratégií vykonal. Na reprezentáciu simultánnych hier sa často volí [[#Normálna forma | normálna forma]] a na reprezentáciu sekvenčných [[#Rozšírená forma | rozšírená forma]] [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s úplnými a neúplnými informáciami===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr2-hra_s_neuplnymi_informaciami.png | thumb | 300px | right | '''Obr. 2 – Hra s neúplnými informáciami''' &amp;lt;br&amp;gt;&lt;br /&gt;
bodkovaná čiara predstavuje neznalosť hráča 2 o akcii hráča 1]]&lt;br /&gt;
Hry s [http://en.wikipedia.org/wiki/Perfect_information úplnými informáciami] sú dôležitou podmnožinou [[#Simultánne a ťahové (sekvenčné) hry | sekvenčných hier]]. Pri hrách s úplnými informáciami všetci hráči vedia o všetkých predošlých ťahoch ostatných hráčov. To znamená, že takýmto druhom hier nemôžu byť simultánne hry, pri ktorých už z princípu ostatní hráči nevedia o všetkých predošlých akciách svojich spoluhráčov.Väčšina hier analyzovaných v hernej teórii sú však hry s neúplnou informáciou. Hry s úplnou informáciou predstavujú aj rôzne doskové spoločenské hry ako napr. šach, Go, dáma a iné. &lt;br /&gt;
&lt;br /&gt;
Hry s úplnými informáciami bývajú často zamieňané s hrami s [http://en.wikipedia.org/wiki/Complete_information kompletnými informáciami], čo sú hry, pri ktorých každý hráč pozná stratégie a ohodnotenia ostatných hráčov, nemusí však vedieť o tom aké akcie vykonali, teda, ktoré stratégie zvolili. Obrázok 2 ukazuje znázornenie hry s neúplnými informáciami v [[#Rozšírená forma | rozšírenej forme]].&lt;br /&gt;
&lt;br /&gt;
===Nekonečne dlhé hry===&lt;br /&gt;
&lt;br /&gt;
Hry analyzované ekonómami a reálnymi hráčmi sú obecne ukončené po určitom konečnom počte krokov. V matematike a teórii množín však sú objektom štúdia aj hry, ktoré trvajú nekonečný počet ťahov s víťazom (alebo daným ohodnotením) známym až po ukončení všetkých ťahov.&lt;br /&gt;
&lt;br /&gt;
Záujem sa v takomto prípade hier nesústreďuje ani tak na najoptimálnejší spôsob hry ako zisťovanie, či pre určitého hráča existuje alebo neexistuje tzv. '''výherná stratégia'''. Existencia takýchto stratégií má významné dôsledky v deskriptívnej teórii množín [1].&lt;br /&gt;
&lt;br /&gt;
===Metahry===&lt;br /&gt;
&lt;br /&gt;
Sú to hry, ktorých hra znamená rozvoj pravidiel, cieľa alebo predmetu inej hry. Metahry sa snažia o maximalizovanie praktickej hodnoty vyvinutého súboru pravidiel. Teória [http://en.wikipedia.org/wiki/Metagame metahier] je spojená s dizajnom [http://en.wikipedia.org/wiki/Mechanism_design mechanizmov hier] [1].&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=6946</id>
		<title>Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cie_te%C3%B3rie_grafov_a_te%C3%B3rie_hier_v_rozhodovac%C3%ADch_probl%C3%A9moch&amp;diff=6946"/>
		<updated>2010-09-05T17:16:21Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;1&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Ľubomír Milko&lt;br /&gt;
|Ing. Juraj Ďuďák&lt;br /&gt;
|2009/2010&lt;br /&gt;
|Bakalárska práca&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Táto práca obsahuje charakteristiku teórie hier a&amp;amp;nbsp;teórie grafov a následne popisuje použitie princípov z tejto oblasti v základných druhoch rozhodovacích problémov. &lt;br /&gt;
Vo štvrtej kapitole sa podrobnejšie opisujú princípy analýzy a riešenia hier, ktoré môžu byť reprezentované hernými stromami. &lt;br /&gt;
Posledná časť práce je venovaná implementácii rozobraných princípov voľby vhodného ťahu v doskovej hre dáma.&lt;br /&gt;
|tu bude anstrakt v AJ&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
Problémy vyžadujúce správne rozhodovanie s ohľadom na následky zvoleného rozhodnutia nás sprevádzajú v takmer všetkých oblastiach ľudskej činnosti od hrania rôznych spoločenských hier až po pokročilé riadenie cestnej siete, správne ekonomické rozhodnutia alebo stratégiu vojenských konfliktov. Postupné snahy o matematickú interpretáciu a riešenie týchto problémy voľby správneho rozhodnutia vyústili v samostatné odvetvie aplikovanej matematiky s názvom teória hier. V tejto teórii sa rozhodovacie problémy znázorňujú ako množina stratégií, ktoré možno prijať a množina následkov, ktoré vzniknú v dôsledku zvolenej stratégie. Následky sú často číselnou interpretáciou daného stavu. Na praktickú interpretáciu tohto súboru množín sa využíva teória grafov. Tieto dve teórie možno použiť na vyriešenie mnohých praktických rozhodovacích problémov. Zaujímavým praktickým a názorným  príkladom aplikácie môže byť aj hľadanie optimálneho ťahu v doskových hrách akou je napríklad dáma. Súčasťou tejto práce je teda aj praktické využitie poznatkov z teórie hier a teórie grafov v tomto type hier. Cieľom tejto práce potom je:  &lt;br /&gt;
*charakteristika teórie hier a teórie grafov&lt;br /&gt;
*popis interpretácie základných rozhodovacích problémov pomocou týchto teórií&lt;br /&gt;
*praktické použitie popísaných teoretických princípov v programe – hra dáma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Zoznam použitých skratiek a pojmov'''&lt;br /&gt;
&lt;br /&gt;
;GUI: (z angl. Graphical User Interface) grafické užívateľské rozhranie&lt;br /&gt;
;AI: (z angl. Artificial Intelligence) umelá inteligencia&lt;br /&gt;
;RAND: (z angl. Research ANd Development) americká nezisková výskumná korporácia, ktorá bola založená pre americkú armádu, no neskôr sa jej pole pôsobnosti rozšírilo aj do iných oblastí.&lt;br /&gt;
;Hra: V teórii hier je hra strategická interakcia medzi jednotlivcami.&lt;br /&gt;
;Hráč: Hráčom sa označuje každý aktívny účastník hry.&lt;br /&gt;
;Pozícia: Pozícia je označenie pre aktuálny stav hry. Môže to byť napr. rozloženie figúrok na šachovnici.&lt;br /&gt;
;Ťah: Ťah je zvolená a uskutočnená stratégia hráča v danej pozícii hry.&lt;br /&gt;
;Riešenie hry: Riešením hry je nájdenie takej postupnosti ťahov (stratégie), ktorá vedie k viťaznej pozícii.&lt;br /&gt;
;Graf: V teórii grafov je grafom objekt tvorený množinou bodov poprepájaných čiarami podľa daných pravidiel. Body sú označované ako vrcholy a čiary ako hrany grafu.&lt;br /&gt;
;Strom: Herný strom je typ grafu, ktorý sa využíva na znázornenie priebehu hry.	&lt;br /&gt;
;Vrchol (uzol): Vrchol herného stromu reprezentuje pozíciu hry.&lt;br /&gt;
;Hrana: Hrana herného stromu symbolizuje ťah niektorého z hráčov z určitej pozície.&lt;br /&gt;
;Minimax: Metóda minimax sa využíva na prehľadávanie herných stromov s cieľom nájdenia optimálneho ťahu z danej pozície.&lt;br /&gt;
;Alfa-beta orezávanie: Technika na zmenšenie počtu prehľadávaných vrcholov v metóde minimax, čím sa proces prehľadávania urýchli.&lt;br /&gt;
;TRUE: Označenie true symbolizuje logickú hodnotu pravda. Symbolom logickej pravdivosti je aj číslo 1.	&lt;br /&gt;
;FALSE: Označenie false symbolizuje logickú hodnotu nepravda. Symbolom logickej nepravdivosti  aj číslo 0.&lt;br /&gt;
&lt;br /&gt;
=Teória hier=&lt;br /&gt;
==Základné pojmy a charakteristika teórie hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/Te%C3%B3ria_hier Teória hier] je odvetvím aplikovanej matematiky, ktorá sa snaží matematicky zachytiť správanie v strategických situáciách, kde úspech jednotlivca pri vykonaní určitej voľby závisí od volieb ostatných [1].&lt;br /&gt;
&lt;br /&gt;
Súbor situácií, v ktorých sa každý účastník môže nachádzať je v teórii hier nazývaný [http://en.wikipedia.org/wiki/Game#Definitions hra]. '''Hra''' je akousi strategickou interakciou medzi jednotlivcami. Každý účastník (prvok, ktorý sa aktívne zúčastňuje hry) je označený ako '''hráč'''. Každý hráč má v daných momentoch možnosť voľby akcie, ktorá ďalej ovplyvní priebeh hry. Každá z možných akcií, ktoré hráč môže vykonať sa označuje ako '''ťah'''. Súbor ťahov, ktoré hráč použije v hre je označovaný ako [http://en.wikipedia.org/wiki/Strategy stratégia].&lt;br /&gt;
&lt;br /&gt;
Teória hier skúma predpokladané a skutočné správanie sa hráčov v hrách, rovnako ako aj optimálne stratégie. Zdanlivo odlišné typy interakcií medzi hráčmi a hrou sa môžu prejavovať podobnými štruktúrami pohnútok, takže všetky môžu byť reprezentované ako príklady jednej konkrétnej hry. V počiatkoch bola teória hier rozvíjaná na analyzovanie súťaží (situácií), kde každému hráčovi sa darilo lepšie na úkor ostatných [1]. Jedná sa o tzv. [[#Hry s nulovým a nenulovým súčtom | hry s nulovým súčtom]]. Išlo napr. o analýzu rôznych vojenských konfliktov, prípadne spoločenských hier. Neskôr sa teória hier rozšírila na analyzovanie širokého spektra  interakcií, ktoré sú klasifikované podľa niekoľkých kritérií. Dnes pojem teória hier zahŕňa množstvo teórií, ktoré možno aplikovať v rôznych rozhodovacích problémoch, kde hráčmi môžu byť ľudia, počítače, zvieratá, rastliny, atď.&lt;br /&gt;
&lt;br /&gt;
Tradičné aplikácie teórie hier sa snažia v hrách nájsť stav rovnováhy. To znamená nájsť súbor stratégií, kde je nepravdepodobné, že jednotlivé prvky budú meniť svoje správanie. Na riešenie týchto problémov bolo vyvinutých veľa konceptov, z ktorých najznámejšia je [http://en.wikipedia.org/wiki/Nash_equilibrium Nashova rovnováha] [1].	&lt;br /&gt;
&lt;br /&gt;
===Nashova rovnováha===&lt;br /&gt;
&lt;br /&gt;
Je to koncept riešenia hier zahŕňajúcich dvoch alebo viac hráčov, kde každý hráč pozná stratégie rovnováhy (teda najlepšie stratégie, aké môžu zvoliť ostatní, aby získali čo najviac) ostatných hráčov a žiadny hráč nemá čo získať zmenou iba svojej vlastnej stratégie. Ak každý hráč zvolil stratégiu a žiadny hráč nemôže profitovať zmenou svojej stratégie, pokiaľ ostatní hráči ponechajú svoje stratégie nezmenené, potom daný súbor strategických rozhodnutí a odpovedajúcich odmien stanovuje Nashov stav rovnováhy. Inými slovami, byť v Nashovom stave rovnováhy znamená, že každý hráč odpovie negatívne na otázku : “Ak s určitosťou poznám stratégie ostatných hráčov, môžem profitovať zmenou mojej stratégie ?“ [1]. Jedným z najznámejších typov takejto hry je napr. [http://sk.wikipedia.org/wiki/V%C3%A4z%C5%88ova_dilema väzňova dilema] spopularizovaná matematikom [http://en.wikipedia.org/wiki/Albert_W._Tucker Albertom W. Tuckerom]. &lt;br /&gt;
&lt;br /&gt;
===Väzňova dilema===&lt;br /&gt;
&lt;br /&gt;
Opis problému je nasledovný:&lt;br /&gt;
Dvaja väzni vykradli banku a boli neskôr chytení políciou. Vo väzení ich zavrú do samostatných ciel. Väzni nemajú možnosť spolu komunikovať. Polícia nemá dosť dôkazov aby uväznila oboch. Obaja dostanú od polície ponuku spolupracovať (zradiť komplica), výmenou za nízky trest pre seba. Možné výsledky sú takéto: &lt;br /&gt;
*Ak budú obaja navzájom spolupracovať, budú ich držať najviac rok vo vyšetrovacej väzbe. &lt;br /&gt;
*Ak jeden z väzňov zradí komplica, pustia ho ihneď na slobodu, ale komplic dostane 10 rokov väzenia. &lt;br /&gt;
*Ak sa priznajú/zradia obaja, rozdelia si 10 ročný trest, čiže každý dostane 5 rokov. &lt;br /&gt;
Z hľadiska skupinového správania sa je najvýhodnejšie riešenie ak obaja spolupracujú, pretože vtedy je celkový čas ktorý obaja strávia vo väzení najmenší. Z hľadiska sebeckého správania sa každého z nich je najjednoduchšie priznať sa, pretože tak môže dostať v horšom prípade 5 rokov, oproti možnostiam 1 alebo 10 rokov ak sa neprizná [11].&lt;br /&gt;
&lt;br /&gt;
==Stručný vývoj teórie hier==&lt;br /&gt;
&lt;br /&gt;
Prvá známa zmienka o [[#Teória hier | teórii hier]] sa vyskytla v liste z roku 1713 napísanom [http://en.wikipedia.org/wiki/James_Waldegrave,_1st_Earl_Waldegrave Jamesom Waldegraveom]. V tomto liste Waldegrave navrhol tzv. zmiešanú minimax stratégiu ako riešenie kartovej hry pre dvoch hráčov nazývanej “le Her”. Neskôr roku 1838 využil hernú teoretickú analýzu [http://en.wikipedia.org/wiki/Augustin_Cournot Antoine Augustin Cournot] vo svojej knihe Výskumy matematických princípov teórie bohatstva. V tejto svojej práci Cournot pojednáva o duopoloch a prezentuje riešenie, ktoré je obmedzenou verziou [[#Nashova rovnováha | Nashovej rovnováhy]].&lt;br /&gt;
&lt;br /&gt;
Hoci bola Cournotova analýza viac všeobecná ako Waldegraveova, teória hier stále neexistovala ako samostatná oblasť vedy, až pokiaľ [http://en.wikipedia.org/wiki/John_von_Neumann John von Neumann], ktorý je považovaný za zakladateľa teórie hier, nepublikoval sériu prác na túto tému v roku 1928. Neskôr, v roku 1944, Von Neumann spolu s [http://en.wikipedia.org/wiki/Oskar_Morgenstern Oskarom Morgensternom] vydal knihu ''Teória hier a ekonomické správanie''. Táto kniha obsahuje metódy hľadania riešení hier dvoch hráčov [[#Hry s nulovým a nenulovým súčtom | s nulovým súčtom]]. Počas tohto obdobia bola teória hier primárne zameraná na teóriu [[#Kooperatívne a nekooperatívne hry | kooperatívnych hier]], ktorá analyzovala optimálne stratégie pre skupiny jednotlivcov za predpokladu, že môžu medzi sebou presadiť dohodu o vhodnej spoločnej stratégii.&lt;br /&gt;
&lt;br /&gt;
V roku 1950 sa objavila prvá zmienka o väzňovej dileme a organizácia [http://en.wikipedia.org/wiki/RAND RAND]  (Research ANd Development)  podnikla experiment na základe tejto hry. V tomto čase aj [http://en.wikipedia.org/wiki/John_Forbes_Nash,_Jr. John Nash] vyvinul kritérium pre vzájomnú koexistenciu stratégie hráčov, známe ako [[#Nashova rovnováha | Nashova rovnováha]]. Toto kritérium možno aplikovať na širšie spektrum hier, než kritérium, ktoré navrhli Neumann a Morgenstern. Toto kritérium je dostatočne univerzálne a umožňuje analýzu kooperatívnych aj nekooperatívnych hier. &lt;br /&gt;
&lt;br /&gt;
Teória hier zaznamenala náhly vzostup v 50-tych rokoch, kedy boli vymyslené nové herné koncepty ako napríklad: jadrá, [[#Rozšírená forma | rozšírená forma]] hier, fiktívne hry, atď. V tomto období sa aj objavili prvé aplikácie teórie hier vo filozofii a politike.&lt;br /&gt;
&lt;br /&gt;
V roku 1956 [http://en.wikipedia.org/wiki/Reinhard_Selten Reinhard Selten] uviedol svoj koncept riešenia tzv. [http://en.wikipedia.org/wiki/Perfect_equilibrium perfektnej rovnováhy] v určitej podmnožine hry, ktorá vylepšila [[#Nashova rovnováha | Nashovu rovnováhu]]. &lt;br /&gt;
&lt;br /&gt;
V 70-tych rokoch bola teória hier výrazne aplikovaná v biológii, hlavne ako dôsledok práce [http://en.wikipedia.org/wiki/John_Maynard_Smith Johna Maynarda Smitha] a jeho evolučne stabilnej stratégie. Navyše boli uvedené a analyzované ďalšie koncepty rozširujúce teóriu hier.&lt;br /&gt;
&lt;br /&gt;
V roku 2005, herní teoretik [http://en.wikipedia.org/wiki/Thomas_Schelling Thomas Schelling] získal Nobelovu cenu za prácu na dynamických modeloch, ktoré boli prvotnými ukážkami [http://en.wikipedia.org/wiki/Evolutionary_game_theory evolučnej hernej teórie]. &lt;br /&gt;
&lt;br /&gt;
V roku 2007 boli [http://en.wikipedia.org/wiki/Roger_Myerson Roger Myerson], spolu s [http://en.wikipedia.org/wiki/Leonid_Hurwicz Leonidom Hurwiczom] a [http://en.wikipedia.org/wiki/Eric_Maskin Ericom Maskinom] ocenení Nobelovou cenou za ekonomiku za položenie základov [http://en.wikipedia.org/wiki/Mechanism_design_theory teórie dizajnu mechanizmov hier].&lt;br /&gt;
&lt;br /&gt;
==Oblasti využitia teórie hier==&lt;br /&gt;
&lt;br /&gt;
[[#Teória hier | Teória hier]] bola využívaná hlavne na štúdium správania ľudí a zvierat. Primárne bola rozvíjaná v ekonomike na pochopenie rôznych druhov ekonomického správania, zahŕňajúcich správanie firiem, trhu a zákazníkov. Postupne sa využitie teórie hier v spoločenských vedách zväčšovalo a poznatky z teórie hier sa začali aplikovať aj na politické, sociologické a psychologické javy. &lt;br /&gt;
&lt;br /&gt;
Hernú teoretickú analýzu spočiatku využíval [http://en.wikipedia.org/wiki/Ronald_Fisher Ronald Fisher] na štúdium správania zvierat v 30-tych rokoch (hoci ešte predtým urobil k tejto téme niekoľko neformálnych vyjadrení [http://sk.wikipedia.org/wiki/Charles_Darwin#Orchidee.2C_Vari.C3.A1cia.2C_P.C3.B4vod_.C4.8Dloveka_a_.C4.8Cervy Charles Darwin]). Neskôr boli analytické metódy, ktoré využíval aj Fisher pomenované teória hier. Výsledky rozvoja tejto oblasti v ekonomike boli neskôr rozsiahlo aplikované v biológii Johnom M. Smithom v jeho knihe [http://en.wikipedia.org/wiki/Evolution_and_the_Theory_of_Games Evolúcia a teória hier]. &lt;br /&gt;
&lt;br /&gt;
Poznatky z teórie hier sa využívajú aj na predpovedanie a vyloženie etického a normatívneho správania. Vo filozofii sa teória hier aplikovala na pochopenie dobrého alebo správneho správania. Počiatky využitia teórie hier na tomto poli môžu byť datované až do čias Platóna. &lt;br /&gt;
&lt;br /&gt;
Prvotné aplikácie teórie hier v politických vedách je možno nájsť v práci [http://en.wikipedia.org/wiki/Anthony_Downs Anthonyho Downsa]. Významnou je napr. jeho kniha Ekonomická teória demokracie (1957). &lt;br /&gt;
&lt;br /&gt;
V ekonomike je teória hier využívaná na analýzu veľkého množstva ekonomických javov ako napr. trh, aukcie, výpredaje, duopoly, oligopoly, sociálna sieť a volebné systémy. Tento výskum sa zvyčajne zameriava na určitý súbor stratégií známych ako equilibrium (rovnováha) v hrách. V [[#Kooperatívne a nekooperatívne hry | nekooperatívnych hrách]] je najznámejším z týchto konceptov spomínaná [[#Nashova rovnováha | Nashova rovnováha]].&lt;br /&gt;
&lt;br /&gt;
V posledných rokoch zohráva teória hier významnú úlohu aj v počítačových vedách a logike. Hry sú napr. využívané na modelovanie interaktívnych výpočtov. &lt;br /&gt;
&lt;br /&gt;
Využitie teórie hier však možno nájsť aj v telekomunikáciách, doprave, psychológii, vojenských vedách, hazarde a mnohých iných oblastiach.&lt;br /&gt;
&lt;br /&gt;
==Spôsoby reprezentácie rozhodovacích problémov==&lt;br /&gt;
&lt;br /&gt;
Hry skúmané v teórii hier sú dobre definovateľnými matematickými objektmi. [[#Základné pojmy a charakteristika teórie hier | Hra]] pozostáva zo súboru hráčov, súboru ťahov (alebo stratégií), ktoré môžu hráči vykonať a daného ohodnotenia, pre každú kombináciu stratégií. Pre [[#Kooperatívne a nekooperatívne hry | nekooperatívne hry]] , kde hráči navzájom nemôžu spolupracovať sa využíva [http://en.wikipedia.org/wiki/Extensive-form_game rozšírená] alebo [http://en.wikipedia.org/wiki/Normal_form_game normálna] forma reprezentácie hry. [[#Kooperatívne a nekooperatívne hry | Kooperatívne hry]] sú často reprezentované [http://en.wikipedia.org/wiki/Characteristic_function charakteristickou funkciou]. &lt;br /&gt;
&lt;br /&gt;
===Rozšírená forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr1-rozsirena_forma.png | thumb | 200px | right | '''Obr. 1 – Rozšírená forma hry''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Extensive-form_game Rozšírená forma] môže byť použitá na opis hier s určitým dôležitým poradím vykonávania jednotlivých ťahov (stratégií). Takéto hry sú často reprezentované ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch_3#Herné stromy | herné stromy]]. Každý vrchol (uzol) tu predstavuje rozhodovací bod hráča. Hráč je označený číslom pri každom vrchole. Čiary smerujúce z každého vrcholu reprezentujú možnú akciu (ťah) príslušného hráča. Odmeny (hodnotenie) hráčov sú reprezentované na konci posledných spodných čiar. &lt;br /&gt;
&lt;br /&gt;
V hre znázornenej na obrázku 1 sú dvaja hráči. ''Hráč 1'' začína a má možnosti ''F'' alebo ''U''. ''Hráč 2'' vidí ťah ''Hráča 1'' a vyberá si medzi ťahmi ''A'' a ''R''. Ak uvažujeme, že ''Hráč 1'' vyberie ''U'' a ''Hráč 2'' zvolí možnosť ''A'', potom ''Hráč 1'' získa hodnotenie ''8'' a ''Hráč 2'' získa hodnotenie ''2''.&lt;br /&gt;
&lt;br /&gt;
Rozšírenou formou sa dajú zachytiť aj hry so [[#Simultánne a ťahové (sekvenčné) hry | simultánnym pohybom]] a [[#Hry s úplnými a neúplnými informáciami | hry s neúplnou informáciou]]. V takomto prípade buď bodkovaná čiara spája uzly na znázornenie, že sa jedná o rovnaký súbor informácií (teda, že hráči nevedia, v ktorom bode sa nachádzajú) alebo je okolo takýchto uzlov nakreslená uzavretá čiara [1].&lt;br /&gt;
&lt;br /&gt;
===Normálna forma===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab1-normalna_forma.png | thumb | 300px | right | '''Tab. 1 – Normálna forma – väzňova dilema''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Normal_form_game Normálna (alebo strategická)] forma  hry je reprezentovaná maticou, ktorá zobrazuje hráčov, stratégie a odmeny. Pre každú kombináciu ťahov (stratégií) priraďuje zodpovedajúce ohodnotenie (odmenu) každému z hráčov. V tabuľke 1 je znázornená tzv. [[#Väzňova dilema | väzňova dilema]]. ''Väzeň 1'' vyberá svoju stratégiu jednania z riadkov a ''väzeň 2'' zo stĺpcov. Každý z väzňov má na výber dve stratégie, reprezentované dvomi riadkami a dvomi stĺpcami. Vo vnútri buniek sú zapísané počty rokov (odmena) , ktoré budú musieť stráviť vo väzení pri zvolených stratégiách . Nevýhodné odmeny sú zvyčajne pre upresnenie zapísané zápornou hodnotou. Prvé číslo znázorňuje odmena ''väzňa 1'', druhé číslo je odmena ''väzňa 2''. &lt;br /&gt;
&lt;br /&gt;
Za predpokladu, že ''väzeň 1'' zvolí možnosť spolupracovať a ''väzeň 2'' bude tiež spolupracovať získajú obaja ohodnotenie ''-1''. Ak je hra reprezentovaná touto formou predpokladá sa, že hráči vykonávajú svoje ťahy (stratégie) súčasne alebo prinajmenšom nepoznajú ťah súpera. V opačnom prípade sa hry znázorňujú [[#Rozšírená forma | rozšírenou formou]].&lt;br /&gt;
&lt;br /&gt;
===Forma charakteristickej funkcie===&lt;br /&gt;
&lt;br /&gt;
Využíva sa pri [[#Kooperatívne a nekooperatívne hry | kooperatívnych hrách]], kde nie sú určené žiadne individuálne odmeny pre hráčov. Namiesto toho [http://en.wikipedia.org/wiki/Characteristic_function charakteristická funkcia] definuje ohodnotenie každého spojenectva. Štandardným predpokladom je že prázdna koalícia získa ohodnotenie 0. &lt;br /&gt;
&lt;br /&gt;
Pôvod tejto formy pochádza z knihy [http://en.wikipedia.org/wiki/Von_Neumann von Neumanna] a [http://en.wikipedia.org/wiki/Oskar_Morgenstern Morgensterna], ktorí pri štúdiu koaličných hier vyjadrených normálnou formou usúdili, že ak sa vytvorí koalícia ''K'', hrá proti inej koalícii ''N'' ''(N\K)'' rovnako ako keby sa hrala hra dvoch hráčov. Existujú rôzne modely odvodenia koaličných odmien z [[#Normálna forma | normálnej formy hry]], ale nie všetky hry v charakteristickej forme  môžu byť odvodené z hier určených normálnou formou. &lt;br /&gt;
&lt;br /&gt;
Formálne je hra určená formou charakteristickej funkcie daná dvojicou ''(N,ϑ)'', kde ''N'' označuje súbor hráčov a ''ϑ:2^N→R'' je charakteristická funkcia [1]. &lt;br /&gt;
&lt;br /&gt;
===Forma rozdeľujúcej funkcie===&lt;br /&gt;
&lt;br /&gt;
Rozšírenie [[#Forma charakteristickej funkcie | formy charakteristickej funkcie]], kde odmena koalície nezávisí iba na jej členoch, ale tiež na spôsobe akým sú rozdelení ostatní hráči [1].&lt;br /&gt;
&lt;br /&gt;
==Typy hier==&lt;br /&gt;
===Kooperatívne a nekooperatívne hry===&lt;br /&gt;
&lt;br /&gt;
Hra je [http://en.wikipedia.org/wiki/Cooperative_game kooperatívna] ak hráči majú možnosť vytvoriť medzi sebou určité zväzky - '''koalície'''. V takomto druhu hier sa od hráčov vyžaduje dodržanie týchto ich záväzkov. V [http://en.wikipedia.org/wiki/Non_cooperative_game nekooperatívnych hrách] sa takéto záväzky nedodržiavajú. Často je tiež v kooperatívnych hrách usudzované, že hráči môžu navzájom ''komunikovať'' (teda, že vedia navzájom o svojich stratégiách vo vytvorenom zväzku). Pri nekooperatívnych hrách je na druhú stranu väčšinou možné modelovať situácie do najmenších detailov a vyvodzovať presné dôsledky. Kooperatívne hry sa sústreďujú na hru ako celok. Určitým spojením medzi kooperatívnymi a nekooperatívnymi hrami sú tzv. '''hybridné hry''', ktoré obsahujú elementy z oboch typov [1].&lt;br /&gt;
&lt;br /&gt;
===Symetrické a asymetrické hry===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab2-symetricka_hra.png | thumb | 300px | right | '''Tab. 2 – Symetrická hra''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Symmetric_games Symetrické hry] sú také, kde odmeny (ohodnotenia) za zvolenie určitej stratégie závisia iba od ostatných stratégií, ktoré zvolia ostatní hráči a nie od toho, kto volí danú stratégiu. Inak povedané, ak môžeme zameniť hráčov a odmeny budú stále rovnaké, potom hra je symetrická. Väčšina bežne študovaných hier 2x2 je symetrická. Príkladom je napr. [[#Väzňova dilema | väzňova dilema]]. Tabuľka 2 je ukážka symetrickej hry v [[#Normálna forma | normálnej forme]].&lt;br /&gt;
&lt;br /&gt;
Väčšina asymetrických hier sú hry, kde hráči nemajú na výber rovnaké stratégie. Je tiež ale možné, že hra, ktorá má pre oboch hráčov stratégie identické, nie je symetrická. Takéto hry sa líšia v ohodnotení stratégií v závislosti od toho, aký hráč danú stratégiu vykonal [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s nulovým a nenulovým súčtom===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-tab3-hra_s_nulovym_suctom.png | thumb | 300px | right | '''Tab. 3 – Hra s nulovým súčtom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Zero_sum_game Hry s nulovým súčtom] sú špeciálnym typom hier s konštantným súčtom, v ktorých voľby hráčov nemôžu ani zvýšiť a ani znížiť zdroje, ktoré sú k dispozícii. V hrách s nulovým súčtom je celkové ohodnotenie všetkých hráčov vždy rovné nule (hráč môže profitovať iba na adekvátny  úkor ostatných). Príkladom takýchto hier sú aj doskové spoločenské hry ako šach, dáma alebo napr. poker. Tabuľka 3 znázorňuje hru dvoch hráčov s nulovým súčtom.&lt;br /&gt;
&lt;br /&gt;
Mnoho hier však sú hry s nenulovým súčtom (vrátane [[#Väzňova dilema | väzňovej dilemy]]). Zisk jedného hráča tu nemusí nutne znamenať stratu hráča druhého. &lt;br /&gt;
&lt;br /&gt;
Hry s konštantným súčtom zodpovedajú javom ako krádeže a hazardné hry, ale nie základným ekonomickým princípom, kde je možné potenciálne nadobudnúť zisk z obchodu [1].&lt;br /&gt;
&lt;br /&gt;
===Simultánne a ťahové (sekvenčné) hry===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Simultaneous_game Simultánne hry] sú také, pri ktorých hráči vykonávajú svoje stratégie (ťahy) súčasne alebo ak neťahajú súčasne, tak hráči, ktorí sú na ťahu neskôr nevedia o predošlých akciách svojich súperov. &lt;br /&gt;
&lt;br /&gt;
V [http://en.wikipedia.org/wiki/Sequential_game sekvenčných hrách] majú tzv. neskorší hráči určité poznatky o predošlých akciách ostatných. Tieto poznatky však môžu byť len veľmi obmedzené. Môžu byť napr. informovaní len o tom, že nejaký hráč nevykonal určitú stratégiu, no nevedia, ktorú z možných stratégií vykonal. Na reprezentáciu simultánnych hier sa často volí [[#Normálna forma | normálna forma]] a na reprezentáciu sekvenčných [[#Rozšírená forma | rozšírená forma]] [1].&lt;br /&gt;
&lt;br /&gt;
===Hry s úplnými a neúplnými informáciami===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr2-hra_s_neuplnymi_informaciami.png | thumb | 300px | right | '''Obr. 2 – Hra s neúplnými informáciami''' &amp;lt;br&amp;gt;&lt;br /&gt;
bodkovaná čiara predstavuje neznalosť hráča 2 o akcii hráča 1]]&lt;br /&gt;
Hry s [http://en.wikipedia.org/wiki/Perfect_information úplnými informáciami] sú dôležitou podmnožinou [[#Simultánne a ťahové (sekvenčné) hry | sekvenčných hier]]. Pri hrách s úplnými informáciami všetci hráči vedia o všetkých predošlých ťahoch ostatných hráčov. To znamená, že takýmto druhom hier nemôžu byť simultánne hry, pri ktorých už z princípu ostatní hráči nevedia o všetkých predošlých akciách svojich spoluhráčov.Väčšina hier analyzovaných v hernej teórii sú však hry s neúplnou informáciou. Hry s úplnou informáciou predstavujú aj rôzne doskové spoločenské hry ako napr. šach, Go, dáma a iné. &lt;br /&gt;
&lt;br /&gt;
Hry s úplnými informáciami bývajú často zamieňané s hrami s [http://en.wikipedia.org/wiki/Complete_information kompletnými informáciami], čo sú hry, pri ktorých každý hráč pozná stratégie a ohodnotenia ostatných hráčov, nemusí však vedieť o tom aké akcie vykonali, teda, ktoré stratégie zvolili. Obrázok 2 ukazuje znázornenie hry s neúplnými informáciami v [[#Rozšírená forma | rozšírenej forme]].&lt;br /&gt;
&lt;br /&gt;
===Nekonečne dlhé hry===&lt;br /&gt;
&lt;br /&gt;
Hry analyzované ekonómami a reálnymi hráčmi sú obecne ukončené po určitom konečnom počte krokov. V matematike a teórii množín však sú objektom štúdia aj hry, ktoré trvajú nekonečný počet ťahov s víťazom (alebo daným ohodnotením) známym až po ukončení všetkých ťahov.&lt;br /&gt;
&lt;br /&gt;
Záujem sa v takomto prípade hier nesústreďuje ani tak na najoptimálnejší spôsob hry ako zisťovanie, či pre určitého hráča existuje alebo neexistuje tzv. '''výherná stratégia'''. Existencia takýchto stratégií má významné dôsledky v deskriptívnej teórii množín [1].&lt;br /&gt;
&lt;br /&gt;
===Metahry===&lt;br /&gt;
&lt;br /&gt;
Sú to hry, ktorých hra znamená rozvoj pravidiel, cieľa alebo predmetu inej hry. Metahry sa snažia o maximalizovanie praktickej hodnoty vyvinutého súboru pravidiel. Teória [http://en.wikipedia.org/wiki/Metagame metahier] je spojená s dizajnom [http://en.wikipedia.org/wiki/Mechanism_design mechanizmov hier] [1].&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6944</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6944"/>
		<updated>2010-09-05T17:05:11Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
Ohodnotenie pozície z hľadiska konkrétneho hráča je v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | metóde minimax]] dôležité pri výbere vhodného ťahu v smere od ohodnotených listových vrcholov [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] až k počiatočnej pozícii v koreňovom vrchole. Funkcia ohodnocovania pozícií je pre výber vhodného ťahu v metóde minimax veľmi dôležitá a platí pravidlo, že čím presnejšie je daná pozícia ohodnotená, tým lepšia je potom [[#Umelá inteligencia | umelá inteligencia]] celého programu. Rovnako ako v prípade [[#Generátor ťahov | generátora ťahov]] je aj funkcia ohodnocujúca jednotlivé pozície veľmi závislá od typu danej hry, preto som ju do programu implementoval ako samostatný celok nahraditeľný inou ohodnocovacou metódou. V mojom riešení som počítačového hráča (program) vybral za maximalizujúceho a ľudský hráč je minimalizujúci. To znamená, že všetky atribúty danej pozície výhodné pre počítačového hráča sú ohodnotené kladne a atribúty vhodné pre ľudského hráča záporne. &lt;br /&gt;
&lt;br /&gt;
Keďže sám dámu nehrávam na vyššej úrovni, bolo by pre mňa pomerne obtiažne určovať presne hodnotu pozície z komplexnejšieho hľadiska. Preto som zvolil možnosť ohodnocovať len základné atribúty na danej pozícii a celý problém ohodnocovania pozícií som rozložil na dve časti:&lt;br /&gt;
*[[#Materiálne ohodnotenie | materiálne ohodnotenie]]&lt;br /&gt;
*[[#Pozičné ohodnotenie | pozičné ohodnotenie]]&lt;br /&gt;
&lt;br /&gt;
O samotné ohodnotenie danej pozície sa stará metóda &amp;lt;tt&amp;gt;int OhodnotPoziciu(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TEvaluate&amp;lt;/tt&amp;gt;. Po zavolaní vráti funkcia celé číslo, ktoré symbolizuje hodnotu pozície v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Táto trieda je taktiež nezávislá od ostatných častí programu a je nahraditeľná inou, ktorá bude pozície predávané parametrom &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ohodnocovať iným spôsobom.&lt;br /&gt;
&lt;br /&gt;
Jednotlivé materiálne a pozičné hodnoty sú definované v externom *.xml súbore.&lt;br /&gt;
Editáciou  tohoto súboru je umožnené vo veľkej miere nastaviť charakter hry výsledného programu a pri vhodných parametroch aj podstatne vylepšiť samotnú „umelú inteligenciu“. &lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Táto forma ohodnotenia v podstate reprezentuje výhodnosť danej pozície z hľadiska počtu figúrok. Hra [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je v tomto smere pomerne jednoducho charakterizovateľná, pretože vo väčšine prípadov platí, že čím väčší počet figúrok má hráč, tým je pre neho daná pozícia výhodnejšia. Je teda zrejmé, že figúrky ľudského – minimalizujúceho hráča (biela farba), budú všetky ohodnotené určitou zápornou hodnotou a všetky figúrky počítačového protivníka (čierna farba), ktorý maximalizuje, naopak budú ohodnotené kladne. Ak stanovíme, že každá figúrka bude mať absolútnu materiálnu hodnotu 1. Potom v určitom konkrétnom príklade, kde na šachovnici bude 5 bielych figúrok a 3 čierne figúrky, bude celková hodnota danej pozície -2, čo znamená, že pozícia bude výhodná pre minimalizujúceho hráča. &lt;br /&gt;
&lt;br /&gt;
V hre dáma sa však vyskytujú dva rôzne typy figúrok – pešiaci a dámy. To vytvára problém určenia vzájomného optimálneho pomeru hodnôt medzi týmito dvoma typmi hracích figúrok. Z poznania pravidiel hry je však na prvý pohľad zrejmé, že hodnota figúrky dámy by mala byť vyššia ako hodnota pešiaka. V mojej implementácii som sa rozhodol, že dáma bude mať viac ako trojnásobnú hodnotu pešiaka. Tým by sa malo zabezpečiť dostatočné preferovanie pozícií v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | hernom strome]], ktoré vedú k vytvoreniu dámy. &lt;br /&gt;
&lt;br /&gt;
Zápis materiálnych hodnôt v *.xml súbore je nasledovný:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;   &amp;lt;!—-materiálne ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok ľudského hráča (minimalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;hrac p_val=&amp;quot;-3&amp;quot; d_val=&amp;quot;-10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;!—-ohodnotenie figúrok umelej inteligencie (maximalizuje)--&amp;gt;&lt;br /&gt;
      &amp;lt;ai p_val=&amp;quot;3 &amp;quot; d_val=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-pozičné ohodnotenie--&amp;gt;		&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Materiálne ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;materialne&amp;lt;/tt&amp;gt;. Atribút &amp;lt;tt&amp;gt;p_val&amp;lt;/tt&amp;gt; elementu &amp;lt;tt&amp;gt;hrac&amp;lt;/tt&amp;gt; určuje hodnotu pešiaka ľudského hráča a atribút &amp;lt;tt&amp;gt;d_val&amp;lt;/tt&amp;gt; hodnotu dámy. Materiálne ohodnotenie počítačového hráča v elemente &amp;lt;tt&amp;gt;ai&amp;lt;/tt&amp;gt; je ekvivalentné.&lt;br /&gt;
&lt;br /&gt;
Pri určovaní konkrétnej materiálnej hodnoty jednotlivých figúrok je však dôležité aj pozičné ohodnotenie a to opäť hlavne nájdenie správneho pomeru medzi ohodnotením výhodnej pozície a materiálnym ohodnotením figúrky.&lt;br /&gt;
&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
Tento spôsob ohodnocovania je založený na znalosti určitých strategicky výhodných a nevýhodných pozícií. V zjednodušenej forme ide o obsadenie políčok šachovnice, ktoré majú výhodnú polohu a výhybanie sa poliam s nevhodnou polohou. V dáme sú za výhodné políčka považované zadné rady šachovnice oboch hráčov, ktoré, ak sú obsadené, tak protihráčovi znemožňujú vytvorenie figúrky dámy. Taktiež je výhodné obsadiť krajné polia na pravej a ľavej strane, ktoré zase znemožňujú protihráčovi preskočiť figúrky na týchto políčkach. Ďalšími možnými strategicky výhodnými polohami som sa nezaoberal, no je možné ich doplniť do *.xml súboru s jednotlivými ohodnoteniami. &lt;br /&gt;
&lt;br /&gt;
Štruktúra zápisu pozičného ohodnotenia v *.xml súbore je nasledovná:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;hodnoty&amp;gt;&lt;br /&gt;
   &amp;lt;materialne&amp;gt;&lt;br /&gt;
      &amp;lt;!—-materiálne ohodnotenie--&amp;gt; &lt;br /&gt;
   &amp;lt;/materialne&amp;gt;&lt;br /&gt;
   &amp;lt;pozicne&amp;gt;	&amp;lt;!—-pozičné ohodnotenie--&amp;gt;&lt;br /&gt;
      &amp;lt;pos_val x=&amp;quot;0&amp;quot; y=&amp;quot;7&amp;quot; fig_val=&amp;quot;-1&amp;quot; hodnota=&amp;quot;-1&amp;quot;/&amp;gt;						 &lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!—-tu sa nachádzajú ďalšie elementy pos_val--&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
   &amp;lt;/pozicne&amp;gt;&lt;br /&gt;
&amp;lt;/hodnoty&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celé pozičné ohodnotenie je tvorené elementom &amp;lt;tt&amp;gt;pozicne&amp;lt;/tt&amp;gt;, ktorý obsahuje elementy &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; reprezentujúce jednotlivé strategicky výhodné (nevýhodné) polia šachovnice. Elementov &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; môže byť ľubovoľný počet a každý z nich obsahuje atribúty &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt;, ktoré určujú súradnice výhodného (nevýhodného) poľa na šachovnici, atribút &amp;lt;tt&amp;gt;fig_val&amp;lt;/tt&amp;gt; určujúci pre akú figúrku je dané pole výhodné (nevýhodné) a posledným atribútom je &amp;lt;tt&amp;gt;hodnota&amp;lt;/tt&amp;gt;, ktorý udáva číselné ohodnotenie, v prípade, že daná figúrka obsadí konkrétne pole. &lt;br /&gt;
&lt;br /&gt;
V uvedenom elemente &amp;lt;tt&amp;gt;pos_val&amp;lt;/tt&amp;gt; je zadané, že ak je pole so súradnicami [0,7] obsadené figúrkou reprezentovanou číslom -1 (biely pešiak), tak sa celková hodnota pozície zníži o -1, čo je pre bieleho hráča výhodné, pretože minimalizuje. Ak by atribút hodnota bol rovný 1, potom by pre bieleho hráča bola daná pozícia nevýhodná.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6942</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6942"/>
		<updated>2010-09-05T16:37:15Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png‎ | thumb | 400px | right | '''Obr. 21 – Grafické znázornenie triedy TTester''']]&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt; zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
Ako už bolo spomenuté v kapitole 4.5 o [[#Kontrola ťahov | kontrole hráčových ťahov]] , tak trieda &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;  dedí metódy testovania pohybu figúrok z triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;. Zároveň však oproti triede &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; (kontrola hráčových ťahov), využíva aj metódy, ktoré vykonajú daný ťah na zadanej pozícii.&lt;br /&gt;
&lt;br /&gt;
Trieda &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt; pozostáva z komponentov uvedených na obrázku Obr.  21.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 kod v jazyku C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png&amp;diff=6940</id>
		<title>Súbor:Atgathvrp-obr21-graficke znazornenie triedy ttester.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr21-graficke_znazornenie_triedy_ttester.png&amp;diff=6940"/>
		<updated>2010-09-05T16:33:52Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6939</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6939"/>
		<updated>2010-09-05T16:27:20Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']] &lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | kapitole 3.1]] je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre [http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) dáma] je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=0.png‎ | thumb | 200px | '''Obr. 19 – Volanie funkcie generátora ťahov s parametrom UrobTah = 0''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah=3.png‎ | thumb | 120px | '''Obr. 20 – Volanie funkcie generátora ťahov s parametrom UrobTah = 3''']]&lt;br /&gt;
|}&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou &amp;lt;tt&amp;gt;int GenerujTahy(TBoard Sachovnica, int UrobTah)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TGenerator&amp;lt;/tt&amp;gt;. Celá táto trieda je oddeliteľná a pri zmene alebo úprave triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy &amp;lt;tt&amp;gt;GenerujTahy&amp;lt;/tt&amp;gt; v závislosti od parametra &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Ak parameter &amp;lt;tt&amp;gt;UrobTah = 0&amp;lt;/tt&amp;gt;, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri Sachovnica. Pri &amp;lt;tt&amp;gt;UrobTah &amp;gt; 0&amp;lt;/tt&amp;gt; sa pozícia Sachovnica zmení vykonaním ťahu s indexom &amp;lt;tt&amp;gt;UrobTah&amp;lt;/tt&amp;gt;. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 kod v jazyku C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah%3D3.png&amp;diff=6938</id>
		<title>Súbor:Atgathvrp-obr20-volanie funkcie generatora tahov s parametrom urobtah=3.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr20-volanie_funkcie_generatora_tahov_s_parametrom_urobtah%3D3.png&amp;diff=6938"/>
		<updated>2010-09-05T16:18:53Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah%3D0.png&amp;diff=6937</id>
		<title>Súbor:Atgathvrp-obr19-volanie funkcie generatora tahov s parametrom urobtah=0.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr19-volanie_funkcie_generatora_tahov_s_parametrom_urobtah%3D0.png&amp;diff=6937"/>
		<updated>2010-09-05T16:18:14Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6936</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6936"/>
		<updated>2010-09-05T16:06:20Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']]&lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*[[#Rozhodovacia funkcia | rozhodovacia funkcia]] (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
V [[#Implementácia algoritmu minimax | minimax algoritme]] má generátor ťahov za úlohu vytvárať vrcholy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]] od koreňového (symbolizuje počiatočnú pozíciu) až po listové. Úlohou generátora je nájsť všetky možné legálne ťahy z aktuálne danej pozície a následne vykonať ťah, ktorý mu zadá [[#Implementácia algoritmu minimax | algoritmus minimax]].&lt;br /&gt;
&lt;br /&gt;
Samotná realizácia generátora ťahov je veľmi špecifická vzhľadom na hru, ktorej ťahy sa generujú. Na ilustračnom príklade hry piškvorky v kapitole 3.1 je vidieť, že generátor ťahov má vlastne za úlohu iba nájsť voľné políčka, ktoré je možné obsadiť a samotný ťah je vykonaný iba obsadením prázdneho políčka symbolom krúžku alebo krížika. Generátor pre hru piškvorky je teda veľmi jednoduchý a ľahko programovo realizovateľný. Pri hre dáma je však situácia podstatne zložitejšia. Pravidlá pohybu jednotlivých figúrok sa programovo interpretujú oveľa komplikovanejšie, čo je spôsobené hlavne možnosťou viacnásobného skákania súperových figúrok a voľnejším pohybom dám, ktorý ešte viac komplikuje viacnásobné skákanie. To si vyžiadalo vytvorenie zložitejších funkcií, ktoré rekurzívne testujú rôzne možnosti viacnásobných skokov.&lt;br /&gt;
&lt;br /&gt;
Generátor ťahov je teda jednou z najkomplikovanejších súčastí môjho programu a po hlbšej analýze som sa rozhodol nevyužiť samostatný generátor ťahov, ale generovať priamo pozície, ktoré by vznikli po vykonaní daného ťahu. Tým odpadá nutnosť tvorby samostatnej dátovej štruktúry pre uchovávanie vygenerovaných ťahov a funkcie, ktorá by dané ťahy realizovala nad danou pozíciou. Generátor ťahov v mojom programe tiež plní úlohu počítadla možných legálnych ťahov z aktuálnej pozície, ktoré je potrebné v algoritme minimax.&lt;br /&gt;
&lt;br /&gt;
V programe je generátor ťahov realizovaný metódou int GenerujTahy(TBoard Sachovnica, int UrobTah) triedy TGenerator. Celá táto trieda je oddeliteľná a po zmene alebo úprave triedy TBoard môže byť nahradená generátorom pre úplne odlišný typ hry. Musí sa však zachovať funkčnosť metódy GenerujTahy v závislosti od parametra UrobTah. Ak parameter UrobTah = 0, funkcia vráti počet možných legálnych ťahov z pozície danej v parametri Sachovnica. Pri UrobTah &amp;gt; 0 sa pozícia Sachovnica zmení vykonaním ťahu s indexom UrobTah. Pre bieleho hráča je princíp znázornený na obrázkoch Obr.  19 a Obr.  20.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 kod v jazyku C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6934</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6934"/>
		<updated>2010-09-05T15:54:53Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']]&lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
Algoritmus výberu najvhodnejšieho ťahu je realizovaný na princípe metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax]] s [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávaním]]. Pri použití tejto metódy je zrejmé, že okrem samotného vhodne upraveného minimax algoritmu sú potrebné ešte ďalšie dve súčasti. Prvou súčasťou je [[#Generátor ťahov | generátore ťahov]], ktorý z každej danej pozície vie určiť a vykonať všetky možné ťahy. Ďalším nevyhnutným komponentom je funkcia na [[#Ohodnocovanie pozícií | ohodnotenie pozície]] v listových vrcholoch [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herného stromu]].&lt;br /&gt;
&lt;br /&gt;
Pri tvorbe  umelej inteligencie som teda využil tri komponenty:&lt;br /&gt;
*[[#Generátor ťahov | generátor ťahov]]&lt;br /&gt;
*[[#Ohodnocovanie pozícií | ohodnocovacia funkcia]]&lt;br /&gt;
*rozhodovacia funkcia (na princípe [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax metódy]])&lt;br /&gt;
Prvé dve súčasti sú závislé od pravidiel konkrétnej hry, preto som ich do programu&lt;br /&gt;
zapracoval ako samostatné a oddeliteľné celky.&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 kod v jazyku C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6911</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6911"/>
		<updated>2010-09-05T14:27:02Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami - [[#Reprezentácia šachovnice | šachovnica]], [[#Kontrola ťahov | kontrola ťahu]], [[#Umelá inteligencia | umelá inteligencia]] a [[#Grafické užívateľské rozhranie | užívateľské rozhranie]].&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']]&lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
==Kontrola ťahov==&lt;br /&gt;
&lt;br /&gt;
Aby hráč nemohol vykonať ťah, ktorý by bol v rozpore s pravidlami hry, bolo nutné implementovať aj určitú formu kontroly správnosti hráčovho ťahu a vrátiť späť prípadný ilegálny ťah. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png | thumb | 400px | right | '''Obr. 18 – Hodnoty v premennej PoslTah pri vykonaní ťahu hráča''']]&lt;br /&gt;
Samotnú kontrolu správnosti hráčovho posledného ťahu vykonáva metóda &amp;lt;tt&amp;gt;int SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy využíva premennú &amp;lt;tt&amp;gt;char temppole[8][8]&amp;lt;/tt&amp;gt; a dátovú štruktúru &amp;lt;tt&amp;gt;TTah PoslTah&amp;lt;/tt&amp;gt; z parametra &amp;lt;tt&amp;gt;Sachovnica&amp;lt;/tt&amp;gt;, ktorý je objektom triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Premenná &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; má úplne rovnaké vlastnosti ako &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt; a využíva sa na dočasné uloženie rozloženia na šachovnici po hráčom vykonanom ťahu, aby bolo možné prípadne nesprávny ťah vrátiť o krok späť.&lt;br /&gt;
&lt;br /&gt;
Dátový typ &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;, ktorý využíva premenná &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; je tvorený triedou, ktorá obsahuje dve premenné &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TSuradnice&amp;lt;/tt&amp;gt; a premennú reprezentujúcu figúrku, s ktorou hráč naposledy ťahal – &amp;lt;tt&amp;gt;char Figurka&amp;lt;/tt&amp;gt;. Premenná &amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt; obsahuje súradnice prvku matice šachovnice odkiaľ hráč ťahal. Premenná &amp;lt;tt&amp;gt;Do&amp;lt;/tt&amp;gt; obsahuje zase súradnice, na ktoré sa hráč presunul.&lt;br /&gt;
&lt;br /&gt;
Keďže algoritmický princíp kontroly možností pohybu a skákania figúrok je použiteľný aj v [[#Generátor ťahov | generátore ťahov]], dedí trieda &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt; spolu s generátorom tieto testovacie metódy pohybu figúrok zo samostatnej triedy &amp;lt;tt&amp;gt;TTester&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Postup kontroly hráčovho ťahu je nasledovný:&lt;br /&gt;
#Hráč v užívateľskom prostredí - GUI vykoná ťah, ktorý spôsobí zmenu rozloženia (pozície) na šachovnici.&lt;br /&gt;
#Hráčov ťah sa uloží do premmenej &amp;lt;tt&amp;gt;PoslTah&amp;lt;/tt&amp;gt; typu &amp;lt;tt&amp;gt;TTah&amp;lt;/tt&amp;gt;. Zmena v GUI sa uloží do matice ukladajúcej dočasnú aktuálnu pozíciu – &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
#Metóda &amp;lt;tt&amp;gt;SkontrolujPoslednyTah(TBoard Sachovnica)&amp;lt;/tt&amp;gt; overí správnosť hráčovho ťahu.&lt;br /&gt;
#Ak je hráčov ťah správny, tak táto funkcia vráti hodnotu 0 a pozícia uložená v &amp;lt;tt&amp;gt;temppole[8][8]&amp;lt;/tt&amp;gt; sa prekopíruje do matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;, ktorá reprezentuje aktuálne rozloženie na šachovnici.&lt;br /&gt;
V prípade, že je hráčov ťah nesprávny vráti kontrolná funkcia číslo, ktoré symbolizuje porušenie konkrétneho pravidla. Podľa tohoto čísla sa potom vypíše príslušné hlásenie o hráčovej chybe v ťahu. Rozloženie v GUI sa vráti do pôvodného stavu podľa matice &amp;lt;tt&amp;gt;pole[8][8]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Umelá inteligencia==&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
===Materiálne ohodnotenie===&lt;br /&gt;
===Pozičné ohodnotenie===&lt;br /&gt;
&lt;br /&gt;
==Rozhodovacia funkcia==&lt;br /&gt;
===Implementácia algoritmu minimax===&lt;br /&gt;
===Alfa-beta orezávanie===&lt;br /&gt;
===Výber najlepšieho ťahu===&lt;br /&gt;
&lt;br /&gt;
==Grafické užívateľské rozhranie==&lt;br /&gt;
===Prepojenie s jadrom programu===&lt;br /&gt;
===Popis rozhrania aplikácie===&lt;br /&gt;
===Ovládanie===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 kod v jazyku C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png&amp;diff=6910</id>
		<title>Súbor:Atgathvrp-obr18-hodnoty v premennej posltah pri vykonani tahu hraca.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr18-hodnoty_v_premennej_posltah_pri_vykonani_tahu_hraca.png&amp;diff=6910"/>
		<updated>2010-09-05T14:03:59Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6909</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6909"/>
		<updated>2010-09-05T14:01:14Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami – '''šachovnica''', '''kontrola ťahu''', '''umelá inteligencia''' a '''užívateľské rozhranie'''.&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 120px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 120px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']]&lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
Určitou nevýhodou tohoto riešenia je nutnosť samostatného testovania okrajov šachovnice, ktorá by sa eliminovala napr. použitím matice 10x10, kde prvky v okolí vnútornej matice 8x8 by mali určitú hodnotu symbolizujúcu okraj šachovnice a odpadla by nutnosť testovania súradníc. Takéto riešenie som však zavrhol kvôli prehľadnosti a názornosti s využitím matice 8x8.&lt;br /&gt;
&lt;br /&gt;
V samotnom programe je matica šachovnice (&amp;lt;tt&amp;gt;char pole[8][8]&amp;lt;/tt&amp;gt;) premennou, ktorá je súčasťou triedy &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Okrem tejto matice obsahuje trieda &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt; aj ďalšie dôležité premenné a metódy využívané pri operáciách so šachovnicou. Objekt tejto triedy je potom predávaný ako parameter jednotlivým funkčným celkom programu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6907</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6907"/>
		<updated>2010-09-05T13:58:42Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami – '''šachovnica''', '''kontrola ťahu''', '''umelá inteligencia''' a '''užívateľské rozhranie'''.&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
==Reprezentácia šachovnice==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png | thumb | 200px | '''Obr. 16 – Súradnice prvkov matice reprezentujúcej šachovnicu''']]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Súbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png‎ | thumb | 200px | '''Obr. 17 – Hodnoty prvkov matice šachovnice na začiatku hry''']]&lt;br /&gt;
|}&lt;br /&gt;
Voľba vhodnej dátovej formy, ktorá bude v programe reprezentovať šachovnicu je veľmi dôležitá, pretože ovplyvňuje prakticky všetky algoritmy použité v ostatných častiach programu. Táto dátová štruktúra sa taktiež významnou mierou podieľa na celkovej rýchlosti aplikácie. &lt;br /&gt;
&lt;br /&gt;
V mojom riešení som sa zameral hlavne na jednoduchý a pre mňa intuitívny spôsob reprezentácie šachovnice, preto som zvolil klasickú maticu 8x8, kde každý prvok matice odpovedá jednému políčku na šachovnici, pričom ľavé horné pole má súradnice 0,0. Každý prvok matice obsahuje celé číslo v rozsahu &amp;lt;-2,2&amp;gt;, ktoré reprezentuje figúrku v príslušnom  poli šachovnice. Hodnota nula značí, že políčko šachovnice je prázdne. 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png&amp;diff=6904</id>
		<title>Súbor:Atgathvrp-obr17-hodnoty prvkov matice sachovnice na zaciatku hry.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr17-hodnoty_prvkov_matice_sachovnice_na_zaciatku_hry.png&amp;diff=6904"/>
		<updated>2010-09-05T13:55:51Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png&amp;diff=6903</id>
		<title>Súbor:Atgathvrp-obr16-suradnice prvkov matice reprezentujucej sachovnicu.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr16-suradnice_prvkov_matice_reprezentujucej_sachovnicu.png&amp;diff=6903"/>
		<updated>2010-09-05T13:55:40Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6895</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6895"/>
		<updated>2010-09-05T13:46:52Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
[[Súbor:Atgathvrp-obr15-uml diagram tried.png | thumb | 400px | right | '''Obr. 15 – UML diagram tried''']]&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami – '''šachovnica''', '''kontrola ťahu''', '''umelá inteligencia''' a '''užívateľské rozhranie'''.&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr15-uml_diagram_tried.png&amp;diff=6893</id>
		<title>Súbor:Atgathvrp-obr15-uml diagram tried.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr15-uml_diagram_tried.png&amp;diff=6893"/>
		<updated>2010-09-05T13:41:27Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6891</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6891"/>
		<updated>2010-09-05T13:33:10Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Použitý jazyk a vývojové prostredie==&lt;br /&gt;
&lt;br /&gt;
Ako programovací jazyk som zvolil C++, s ktorým som už mal určité predošlé skúsenosti. Aj napriek občasnej ťažkopádnosti a komplikovanejším konštrukciám je tento jazyk veľmi často používaným hlavne pre svoju rýchlosť, množstvo dokumentácie a rozšírenosť. &lt;br /&gt;
&lt;br /&gt;
Pri vývojovom prostredí padla voľba na C++ Builder vo verziách 2006 a 2010 od firmy Embarcadero Technologies, pretože s týmto editorom mám už dlhodobé skúsenosti a vyniká hlavne pomerne jednoduchou tvorbou užívateľského rozhrania vo Windows. Nevýhodou je nemožnosť kompilácie programu pre inú platformu, no táto požiadavka pre mňa nebola až tak podstatná.	&lt;br /&gt;
&lt;br /&gt;
Pre čítanie a zápis *.xml súborov som využil [http://www.applied-mathematics.net/tools/xmlParser.html XML parser] XML parser od autora Dr. F. V.  Berghena, ktorý vyniká hlavne jednoduchosťou použitia a malou veľkosťou celej knižnice.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Pri vytváraní programu som sa sústredil predovšetkým na jednoduchosť a názornosť riešení jednotlivých problémov spojených s algoritmizáciou rôznych teoretických princípov a pravidiel. Taktiež som celý problém realizácie programu rozložil na viacero, funkčne čo najviac nezávislých celkov, ktoré sú jednoducho upraviteľné, prípadne plne nahraditeľné inými. Otázkou celkovej rýchlosti programu som sa veľmi nezaoberal, pretože som sa snažil hlavne o jasnú a zrozumiteľnú implementáciu. Taktiež by pri použití techník, zvyšujúcich rýchlosť algoritmov, nebolo možné natoľko oddeliť od seba jednotlivé časti programu a skomplikoval by sa aj popis činnosti jednotlivých funkčných blokov.&lt;br /&gt;
&lt;br /&gt;
V mojej implementácii som celú hru rozložil na štyri základné časti reprezentované príslušnými objektovými triedami – '''šachovnica''', '''kontrola ťahu''', '''umelá inteligencia''' a '''užívateľské rozhranie'''.&lt;br /&gt;
&lt;br /&gt;
Samotná šachovnica a základné operácie s ňou spojené sú tvorené triedou &amp;lt;tt&amp;gt;TBoard&amp;lt;/tt&amp;gt;. Objekt vytvorený z tejto triedy je využívaný v celom programe a dal by sa prirovnať k reálnej šachovnici s figúrkami. &lt;br /&gt;
&lt;br /&gt;
Ďalšou neoddeliteľnou súčasťou programu je kontrola správnosti hráčových ťahov reprezentovaná triedou &amp;lt;tt&amp;gt;TCheckMove&amp;lt;/tt&amp;gt;. Objekt tejto triedy zamedzuje ľudskému hráčovi urobiť nelegálny ťah.&lt;br /&gt;
&lt;br /&gt;
Jadrom „umelej inteligencie“ počítača, ktorá vyberá a vykonáva najvhodnejší ťah je trieda &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt;. Bez príslušného objektu triedy &amp;lt;tt&amp;gt;TAI&amp;lt;/tt&amp;gt; by celý program bol len elektronickou verziou dámy pre dvoch hráčov.&lt;br /&gt;
&lt;br /&gt;
Pre samotné zobrazenie a ovládanie figúrok na šachovnici je v programe potrebný aj kód užívateľského rozhrania, ktorého najzákladnejšiu časť reprezentuje trieda &amp;lt;tt&amp;gt;TGUI&amp;lt;/tt&amp;gt;. Táto trieda je len jedna z viacerých spojených s grafickým užívateľským rozhraním, no je najviac prepojená s ostatnými časťami programu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6890</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6890"/>
		<updated>2010-09-05T13:22:24Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Pravidlá tejto hry sú všeobecne známe, preto spomeniem len základné charakteristiky. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok na čiernych poliach v prvých dvoch radoch na protiľahlých stranách šachovnice. Pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši (viď. [11]). Hráči sa snažia o odstránenie všetkých figúrok súpera ich preskakovaním. Vyhráva hráč, ktorý preskočí všetky figúrky súpera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | Herný strom]] reprezentujúci hru dáma sa však s rastúcim počtom úrovní zväčšuje do takej miery, že je prakticky nemožné, aby človek analyzoval a hľadal správny ťah z takéhoto stromu. Takáto reprezentácia je ale vhodná pre počítačové spracovanie, kde je rozsiahlosť herného stromu vykompenzovaná rýchlosťou a presnosťou algoritmického riešenia počítačom. Ako zjavné riešenie sa teda ponúka [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Cieľom riešenia je teda nájsť vhodný spôsob zapracovania tejto metódy do algoritmu vykonávaného počítačom.&lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6886</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=6886"/>
		<updated>2010-09-05T13:09:20Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma ]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
= = &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch &amp;quot;brať&amp;quot; figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Na výber vhodného ťahu z takto interpretovanej hry sa použije [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1827</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1827"/>
		<updated>2010-02-03T11:39:14Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch &amp;quot;brať&amp;quot; figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Na výber vhodného ťahu z takto interpretovanej hry sa použije [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je dôležité si uvedomiť, že v tomto tvare algoritmus skúma ťahy len do hĺbky 1. To znamená, že vráti najväčšiu hodnotu ťahu, ktorý môže byť urobený z danej koreňovej pozície, ale do ohodnotenia ťahov sa nepremieta ďalší možný vývoj hry. Aby bolo možné preskúmať ťahy až do určitej hĺbky, prípadne do miesta, kde hra končí, je treba túto minimaxovú funkciu upraviť do rekurzívnej podoby. Tú znázorňuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 negamax(Pozicia, HlbkaPrehladavania) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true) //ak sa dospeje do vopred danej hlbky alebo &lt;br /&gt;
       return OhodnotPoziciu(Pozicia);                         //je aktualna pozicia koncova, tak sa pozicia ohodnoti&lt;br /&gt;
&lt;br /&gt;
    NajlepsiaHodnota=-∞;&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
    &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);&lt;br /&gt;
       Hodnota=-negamax(Pozicia, HlbkaPrehladavania-1);        //tu funkcia zavola samu seba a znova generuje nove pozicie pre aktualnu poziciu&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    &lt;br /&gt;
    return NajlepsiaHodnota;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Za pozornosť tu stojí znamienko mínus pri rekurzívnom volaní funkcie. To znamená, že vrátená hodnota pozície sa po každom rekurzívnom volaní prevráti na opačnú hodnotu. To je dôležité z toho dôvodu, že na ťahu je striedavo maximalizujúci a minimalizujúci hráč. Takýmto spôsobom potom netreba hľadať raz maximálnu a raz minimálnu hodnotu, ale stále len maximálnu. Táto úprava minimaxového algoritmu je známa pod názvom [http://en.wikipedia.org/wiki/Negamax negamax].&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
&lt;br /&gt;
Z praktického hľadiska je problém výberu optimálneho ťahu v programe vyriešený už funkciou [[#Implementácia algoritmu minimax | negamax]]. No v dáme je často možné vykonať veľké množstvo rôznych ťahov, ktoré podstatne rozširujú [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | herný strom]], ktorý musí [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimax algoritmus]] prejsť, čo sa negatívne prejaví na čase spracovania stromu. Výraznú úsporu počtu vetiev, ktoré treba preskúmať však predstavuje použitie metódy [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Alfa-Beta orezávanie | alfa-beta orezávania]]. Táto metóda má aj tú výhodu, že dáva rovnaké výsledky ako samotný algoritmus minimax. Jej implementácia do existujúcej minimaxovej funkcie je navyše pomerne jednoduchá ako ukazuje nasledujúci pseudokód:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, alfa, beta) &lt;br /&gt;
 {                &lt;br /&gt;
    if(HlbkaPrehladavania&amp;lt;=0 || KoncovaPozicia(Pozicia)==true)&lt;br /&gt;
       return OhodnotPoziciu(Pozicia);&lt;br /&gt;
&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);  &lt;br /&gt;
&lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) &lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);   		&lt;br /&gt;
       Hodnota=-minimax(Pozicia, HlbkaPrehladavania-1, -beta, -alfa); //hodnoty alfa a beta sa musia &amp;quot;prevratit&amp;quot; pre druheho hraca&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);&lt;br /&gt;
&lt;br /&gt;
       if(Hodnota&amp;gt;=beta)                                              //ak sa najde nevyhodna hodnota pre maximalizujuceho hraca, tak &lt;br /&gt;
          return beta;                                                //sa z danej nevyhodnej vetvy hned ”vyskoci” a usetri sa cas&lt;br /&gt;
       if(Hodnota&amp;gt;alfa)&lt;br /&gt;
          alfa=Hodnota;                                               //tu sa uklada zatial najlepsia najdena hodnota&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    return alfa; &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prvotné zavolanie funkcie musí mať potom nasledujúci tvar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 alfabeta(Pozicia, HlbkaPrehladavania, -∞, ∞);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
&lt;br /&gt;
Generovanie všetkých možných a zároveň legálnych ťahov z ľubovoľnej danej pozície je z môjho pohľadu pre hru dáma pomerne náročná záležitosť. Keďže v [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxe]] sa táto funkcia volá veľmi často mala by byť aj dostatočne rýchla. Pri analyzovaní rôznych spôsobov implementácie generátora ťahov som sa nakoniec rozhodol nevyužiť samostatný generátor ťahov ale generovať priamo pozície. Správny názov tejto časti programu by teda mal byť '''generátor pozícií'''. Jeho hlavnou úlohou je z danej pozície vygenerovať novú legálnu pozíciu, ktorá by vznikla po vygenerovaní určitého ťahu a jeho uskutočnení na danej východzej pozícii. Index pozície, ktorú treba vygenerovať pre danú východziu pozíciu je predávaný parametrom. &lt;br /&gt;
&lt;br /&gt;
Keďže táto funkcia v mojej implementácii zisťuje všetky legálne ťahy (a hneď ich aj vykonáva) slúži zároveň aj ako počítadlo možných ťahov. Taktiež informuje o tom, či je daná pozícia koncová.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;br /&gt;
&lt;br /&gt;
[[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | Ohodnocovanie pozícií]] v hre dáma sa dá poňať dvoma spôsobmi. Tým jednoduchým, kedy sa ohodnocujú len niektoré základné atribúty danej pozície (ako napr. počet figúrok) a zložitejším, kedy sa vychádza z hlbšej znalosti tejto hry, vďaka čomu je možné detailnejšie pozičné ohodnotenie jednotlivých figúrok. Keďže sám túto hru hrám len veľmi zriedkavo, vo výhodných strategických pozíciách figúrok sa veľmi nevyznám. Ohodnocuje sa teda len materiálna hodnota jednotlivých figúrok (dáma má vyššiu hodnotu ako pešiak) a ďalej sú ohodnotené niektoré základné pozičné vlastnosti.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1826</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1826"/>
		<updated>2010-02-03T11:05:55Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch &amp;quot;brať&amp;quot; figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Na výber vhodného ťahu z takto interpretovanej hry sa použije [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
&lt;br /&gt;
Už z popisu princípu [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmu minimax]] je zrejmé, že hlavná činnosť, ktorú algoritmus vykonáva, pozostáva z dvoch častí. Prvou je generovanie ťahov z danej pozície. Tieto ťahy potom vytvoria nové pozície a znova sa generujú ťahy pre všetky nové vygenerované pozície. Toto sa deje až dovtedy pokiaľ minimax nenarazí na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | listový vrchol]], kde sa má zavolať funkcia na [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] pozície. Potom sa v algoritme už ďalšie ťahy negenerujú ale nastúpi druhá fáza minimaxového algoritmu, ktorá prebieha smerom &amp;quot;hore&amp;quot; a z ohodnotených vrcholov vyberá najmenšiu alebo najväčšiu hodnotu, ktorou ohodnotí vrchol o stupeň vyššie. Takto pokračuje až ku [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Herné stromy | koreňovému vrcholu]] a v momente, kedy sa vyberie hodnota pre koreňový vrchol sa algoritmus zastaví. &lt;br /&gt;
&lt;br /&gt;
Základnú činnosť minimax algoritmu pre vykonanie všetkých možných ťahov z danej pozície, následné ohodnotenie zmenených pozícií a vybratie najväčšej hodnoty z nich je možné popísať nasledujúcim pseudokódom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 jednourovnovyminimax(Pozicia) &lt;br /&gt;
 {                &lt;br /&gt;
    NajlepsiaHodnota=-∞;                           //hladame tah, ktory vygeneruje poziciu s maximalnym ohodnotenim&lt;br /&gt;
    pocet=ZistiPocetMoznychTahov(Pozicia);         //zisti sa pocet moznych tahov z danej pozicie  &lt;br /&gt;
    for(IndexTahu=1, IndexTahu&amp;lt;pocet, IndexTahu++) //cyklus vykonavania vsetkych moznych tahov&lt;br /&gt;
    {&lt;br /&gt;
       UrobTah(Pozicia, IndexTahu);                //vykona sa konkretny tah  &lt;br /&gt;
       Hodnota=OhodnotPoziciu(Pozicia);            //kazdy tah sa ohodnoti&lt;br /&gt;
       VratTah(Pozicia, IndexTahu);                //pozicia sa po vykonani a ohodnoteni tahu vrati do pociatocneho stavu&lt;br /&gt;
       if(Hodnota&amp;gt;NajlepsiaHodnota)                //tu sa vybera najvyssia hodnota z hodnot vsetkych tahov v danej urovni&lt;br /&gt;
          NajlepsiaHodnota=Hodnota;&lt;br /&gt;
    } 	&lt;br /&gt;
    return NajlepsiaHodnota;                       //funkcia vrati najvyssiu hodnotu&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1825</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1825"/>
		<updated>2010-02-03T10:47:06Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch &amp;quot;brať&amp;quot; figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Na výber vhodného ťahu z takto interpretovanej hry sa použije [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude program vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť tvorí vlastne celý program okrem &amp;quot;umelej inteligencie&amp;quot;. Jeho dôležitou súčasťou je hlavne reprezentácia šachovnice v programovej podobe a následne implementácia pravidiel hry do algoritmickej podoby spracovateľnej počítačom. Samotný [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxový algoritmus]] je na implementácii danej hry závislý len veľmi málo. Iná je však situácia v prípade generátora ťahov a ohodnocovača pozícií. Preto je treba zvážiť rôzne druhy implementácie hry hlavne vzhľadom na tieto dve časti programu. V prípade nevhodne zvolenej implementácie hry je potom tvorba funkcií generovania ťahov a ohodnocovania pozícií výrazne sťažená. Program teda musí obsahovať ešte ďalšie nasledovné časti:&lt;br /&gt;
* dátová reprezentácia šachovnice&lt;br /&gt;
* kontrola a oprava nesprávnych ťahov hráča&lt;br /&gt;
* grafické rozhranie, ktoré zobrazuje dáta reprezentujúce šachovnicu v užívateľsky prijateľnej podobe a zároveň umožňuje vykonávanie ťahov, ktoré sa premietne aj do dátovej reprezentácie šachovnice a pravidiel hry&lt;br /&gt;
&lt;br /&gt;
Hoci sú všetky tieto súčasti významné pre celkové fungovanie  programu, z hľadiska [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórie hier]] je zaujímavá hlavne implementácia algoritmov, ktoré tvoria [[#Rozhodovacia časť programu | rozhodovaciu časť programu]], na základe ktorej sa vykoná optimálny ťah. Implementácia týchto algoritmov je preto popísaná v nasledujúcej kapitole. &lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1824</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1824"/>
		<updated>2010-02-03T10:39:43Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch &amp;quot;brať&amp;quot; figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] je teda [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Normálna forma | normálna forma]]. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Na výber vhodného ťahu z takto interpretovanej hry sa použije [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | minimaxová metóda]]. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
&lt;br /&gt;
Celý program možno rozdeliť do dvoch hlavných častí. Jedna časť obsahuje implementáciu šachovnice, grafické rozhranie a kontrolu hráčových ťahov (treba zaistiť, aby nemohlo dôjsť k situáciám, ktoré sú proti pravidlám). Druhú časť tvorí  rozhodovací algoritmus, na základe ktorého počítačový protivník vykoná svoj ťah. Táto druhá časť algoritmizuje teoretické princípy a postupy z teórie hier.&lt;br /&gt;
&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
&lt;br /&gt;
Táto časť využíva [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Algoritmus minimax | algoritmus minimax]] na simuláciu umelej inteligencie počítačového protihráča. Na to, aby sme pomocou algoritmu minimax mohli rozhodnúť o výbere optimálneho ťahu potrebujeme však určiť dve veci. Je dôležité vedieť určiť v každom bode hry všetky možné legálne ťahy oboch hráčov a ďalej je treba poznať [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] ľubovolnej pozície.&lt;br /&gt;
&lt;br /&gt;
Rozhodovaciu časť programu teda možno rozdeliť na ďalšie tri časti:&lt;br /&gt;
* implementácia samotného '''minimax''' algoritmu&lt;br /&gt;
* '''generátor''' všetkých možných legálnych ťahov z danej pozície&lt;br /&gt;
* '''ohodnocovač''' ľubovoľnej pozície&lt;br /&gt;
&lt;br /&gt;
Pre správne fungovanie algoritmu minimax je nevyhnutné, aby dobre pracovali aj ostatné dve súčasti, inak nebude celok vyberať správne ťahy. &lt;br /&gt;
&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1823</id>
		<title>Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Implement%C3%A1cia_algoritmov_z_te%C3%B3rie_hier_a_te%C3%B3rie_grafov_do_spolo%C4%8Denskej_hry_d%C3%A1ma&amp;diff=1823"/>
		<updated>2010-02-03T10:27:08Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;4&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Popis hry a jej reprezentácia v teórii hier==&lt;br /&gt;
&lt;br /&gt;
[http://sk.wikipedia.org/wiki/D%C3%A1ma_(hra) Dáma] by sa v [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] dala charakterizovať ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Kooperatívne a nekooperatívne hry | nekooperatívna]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Symetrické a asymetrické hry | symetrická]], [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Simultánne a ťahové (sekvenčné) hry | ťahová]] [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hra]] pre dvoch [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | hráčov]] s [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s nulovým a nenulovým súčtom | nulovým súčtom]] a [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Hry s úplnými a neúplnými informáciami | úplnými informáciami]]. Ide o hru dvoch hráčov na šachovnici 8x8, kde každý hráč má na začiatku osem figúrok (pri rôznych verziách sa počty figúrok a veľkosť šachovnice líši, viď. [23]). Figúrky môžu v určitých prípadoch brať figúrky súpera. Braná súperova figúrka je odstránená zo šachovnice. Úlohou každého z hráčov je odstrániť všetky súperove figúrky.&lt;br /&gt;
&lt;br /&gt;
Najzrejmejšou formou interpretácie a analýzy tejto hry v teórii hier je teda rozšírená forma. V prípade, že by sme potrebovali analyzovať iba určité druhy problémových pozícií, dala by sa použiť aj normálna forma. No na reprezentáciu v rôznych fázach hry je táto forma nevhodná. Reprezentácia hier v rozšírenej forme je popísaná v kapitole 4. Na výber vhodného ťahu z takto interpretovanej hry sa použije minimaxová metóda, ktorá bola vysvetlená v kapitole 4.4. Ostáva určiť ako túto metódu spracovať do algoritmu, ktorý by bol schopný vykonávať počítač. &lt;br /&gt;
&lt;br /&gt;
==Základná štruktúra programovej implementácie==&lt;br /&gt;
===Rozhodovacia časť programu===&lt;br /&gt;
===Ostatné súčasti programu===&lt;br /&gt;
==Implementácia algoritmu minimax==&lt;br /&gt;
===Implementácia alfa-beta orezávania===&lt;br /&gt;
==Generátor ťahov==&lt;br /&gt;
==Ohodnocovanie pozícií==&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1765</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1765"/>
		<updated>2010-02-02T14:10:10Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. '''Algoritmus vyfarbovania''' je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry) [17].&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; [7]. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
Začína sa z nulovej (koreňovej) pozície a ako prvý je na ťahu hráč ''A'', ktorý podľa dohody ''maximalizuje'' (vyberá si také ťahy, ktoré budú mať za následok pozície s čo najvyšším ohodnotením). Vygeneruje sa prvý možný ťah – ''a''  hráča ''A'', následkom čoho vznikne pozícia označená číslom ''1''. Potom sa postupne podľa znázorneného číselného poradia generujú všetky možné ťahy hráča ''B''. Keďže pozície vytvorené následkom ťahov hráča ''B'' sú zároveň listovými vrcholmi, tak sa v minimaxovej funkcii ohodnotia. Po vygenerovaní všetkých ťahov hráča ''B'' (označených ''2'' až ''6'') sa funkcia naspäť vráti k vrcholu č.''1'' a ohodnotí ho najmenšou (pretože hráč ''B'' minimalizuje) hodnotou z hodnôt pozícií patriacich pod vrchol ''1''. Pridelí sa mu teda hodnota ''-1''. Rovnako sa postupuje aj pre ťahy ''b'' a ''c''. Keď už sú ohodnotené všetky vrcholy v druhej úrovni stromu (vrcholy č. ''1'',''7'',''13''), funkcia sa rekurzívne vráti ku koreňovému vrcholu a ohodnotí ho najvyššou (pretože hráč ''A'' maximalizuje) hodnotou z vrcholov o jednu úroveň nižších. Zistili sme teda, že z koreňovej pozície (vrchol ''0'') bude najlepšie urobiť ťah ''c'' , ktorý pri najlepšom ťahu hráča ''B'' vráti hodnotu ''1'', ktorá je výhodná pre hráča ''A''. Ak by hráč ''A'' urobil na začiatku ťah ''b'', bol by to pre neho najhorší ťah, pretože výsledná pozícia po dvoch polťahoch by mohla mať hodnotu až ''-2'', čo je veľmi výhodné pre hráča ''B''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png‎ | thumb | 400px | right | '''Obr. 14 – Princíp alfa-beta orezávania''']]&lt;br /&gt;
Ide o techniku, ktorej účelom je urýchliť prehľadávanie [[#Herné stromy | stromu]] v metóde [[#Algoritmus minimax | minimax]]. Dosahuje sa to zmenšením počtu vetiev, ktoré musí algoritmus prejsť. Výhodou použitia tejto techniky je, že nemení výslednú hodnotu (koreňovú) hodnotu nájdenú pomocou minimaxovej metódy. Použitie minimaxu s [http://en.wikipedia.org/wiki/Alpha-beta_pruning alfa-beta orezávaním] teda produkuje rovnaké výsledky ako samotný algoritmus [[#Algoritmus minimax | minimax]]. Názov alfa-beta orézavanie je odvodený od dvoch premenných, ktoré sa v tomto algoritme používajú. Premenná ''alfa'' predstavuje minimálne isté skóre maximalizujúceho hráča a ''beta'' maximálne isté skóre minimalizujúceho hráča. Inak povedané alfa je maximálna dolná hranica možných ťahov maximalizujúceho hráča a beta minimálna horná hranica možných ťahov minimalizujúceho hráča. Tieto dve premenné udávajú interval hodnôt prehľadávaných pozícií. Princíp algoritmu je zobrazený na obrázku 14.&lt;br /&gt;
&lt;br /&gt;
Prvý je na ťahu maximalizujúci hráč. Po ňom ide minimalizujúci hráč a urobí ťah, ktorý zároveň vedie ku koncovej pozícii hry. Tu sa zmenené pozície hry ohodnotia (podľa poradia pri jednotlivých políčkach). Minimalizujúci hráč potom vyberie ťah, ktorý bude mať za následok pozíciu s čo najmenšou hodnotou. To je hodnota ''2'', ktorá sa presunie do ohodnotenia pozície o vrstvu vyššie. Maximalizujúci hráč potom urobí druhý svoj možný ťah a následne ťahá minimalizujúci hráč. Znova sa ohodnotí koncová pozícia (políčko č.''5''), ktorá má hodnotu ''-2''. Je jasné, že minimalizujúci hráč si vyberie pozíciu buď s touto hodnotou (''-2'') alebo ešte nižšou. Pre maximalizujúceho hráča je však podstatné, aby hodnota bola čo najvyššia a po prvom ťahu by pozícia mala hodnotu ''2'', čo je lepšie ako ''-2'' (prípadne ešte menej), takže ďalej už ťahy minimalizujúceho hráča skúmať netreba, pretože pre maximalizujúceho hráča je jasné, že jeho druhý ťah je nevýhodný. Rovnaká situácia nastane aj pri treťom možnom ťahu maximalizujúceho hráča, kedy znova minimalizujúci hráč môže urobiť ťah, ktorý bude mať za následok pozíciu s hodnotou menšou ako ''2''. Preto ani tu netreba uvažovať všetky ťahy minimalizujúceho hráča.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1764</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1764"/>
		<updated>2010-02-02T14:06:31Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. Algoritmus vyfarbovania je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry) [17].&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; [7]. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
Začína sa z nulovej (koreňovej) pozície a ako prvý je na ťahu hráč ''A'', ktorý podľa dohody ''maximalizuje'' (vyberá si také ťahy, ktoré budú mať za následok pozície s čo najvyšším ohodnotením). Vygeneruje sa prvý možný ťah – ''a''  hráča ''A'', následkom čoho vznikne pozícia označená číslom ''1''. Potom sa postupne podľa znázorneného číselného poradia generujú všetky možné ťahy hráča ''B''. Keďže pozície vytvorené následkom ťahov hráča ''B'' sú zároveň listovými vrcholmi, tak sa v minimaxovej funkcii ohodnotia. Po vygenerovaní všetkých ťahov hráča ''B'' (označených ''2'' až ''6'') sa funkcia naspäť vráti k vrcholu č.''1'' a ohodnotí ho najmenšou (pretože hráč ''B'' minimalizuje) hodnotou z hodnôt pozícií patriacich pod vrchol ''1''. Pridelí sa mu teda hodnota ''-1''. Rovnako sa postupuje aj pre ťahy ''b'' a ''c''. Keď už sú ohodnotené všetky vrcholy v druhej úrovni stromu (vrcholy č. ''1'',''7'',''13''), funkcia sa rekurzívne vráti ku koreňovému vrcholu a ohodnotí ho najvyššou (pretože hráč ''A'' maximalizuje) hodnotou z vrcholov o jednu úroveň nižších. Zistili sme teda, že z koreňovej pozície (vrchol ''0'') bude najlepšie urobiť ťah ''c'' , ktorý pri najlepšom ťahu hráča ''B'' vráti hodnotu ''1'', ktorá je výhodná pre hráča ''A''. Ak by hráč ''A'' urobil na začiatku ťah ''b'', bol by to pre neho najhorší ťah, pretože výsledná pozícia po dvoch polťahoch by mohla mať hodnotu až ''-2'', čo je veľmi výhodné pre hráča ''B''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png‎ | thumb | 400px | right | '''Obr. 14 – Princíp alfa-beta orezávania''']]&lt;br /&gt;
Ide o techniku, ktorej účelom je urýchliť prehľadávanie [[#Herné stromy | stromu]] v metóde [[#Algoritmus minimax | minimax]]. Dosahuje sa to zmenšením počtu vetiev, ktoré musí algoritmus prejsť. Výhodou použitia tejto techniky je, že nemení výslednú hodnotu (koreňovú) hodnotu nájdenú pomocou minimaxovej metódy. Použitie minimaxu s [http://en.wikipedia.org/wiki/Alpha-beta_pruning alfa-beta orezávaním] teda produkuje rovnaké výsledky ako samotný algoritmus [[#Algoritmus minimax | minimax]]. Názov alfa-beta orézavanie je odvodený od dvoch premenných, ktoré sa v tomto algoritme používajú. Premenná ''alfa'' predstavuje minimálne isté skóre maximalizujúceho hráča a ''beta'' maximálne isté skóre minimalizujúceho hráča. Inak povedané alfa je maximálna dolná hranica možných ťahov maximalizujúceho hráča a beta minimálna horná hranica možných ťahov minimalizujúceho hráča. Tieto dve premenné udávajú interval hodnôt prehľadávaných pozícií. Princíp algoritmu je zobrazený na obrázku 14.&lt;br /&gt;
&lt;br /&gt;
Prvý je na ťahu maximalizujúci hráč. Po ňom ide minimalizujúci hráč a urobí ťah, ktorý zároveň vedie ku koncovej pozícii hry. Tu sa zmenené pozície hry ohodnotia (podľa poradia pri jednotlivých políčkach). Minimalizujúci hráč potom vyberie ťah, ktorý bude mať za následok pozíciu s čo najmenšou hodnotou. To je hodnota ''2'', ktorá sa presunie do ohodnotenia pozície o vrstvu vyššie. Maximalizujúci hráč potom urobí druhý svoj možný ťah a následne ťahá minimalizujúci hráč. Znova sa ohodnotí koncová pozícia (políčko č.''5''), ktorá má hodnotu ''-2''. Je jasné, že minimalizujúci hráč si vyberie pozíciu buď s touto hodnotou (''-2'') alebo ešte nižšou. Pre maximalizujúceho hráča je však podstatné, aby hodnota bola čo najvyššia a po prvom ťahu by pozícia mala hodnotu ''2'', čo je lepšie ako ''-2'' (prípadne ešte menej), takže ďalej už ťahy minimalizujúceho hráča skúmať netreba, pretože pre maximalizujúceho hráča je jasné, že jeho druhý ťah je nevýhodný. Rovnaká situácia nastane aj pri treťom možnom ťahu maximalizujúceho hráča, kedy znova minimalizujúci hráč môže urobiť ťah, ktorý bude mať za následok pozíciu s hodnotou menšou ako ''2''. Preto ani tu netreba uvažovať všetky ťahy minimalizujúceho hráča.&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png&amp;diff=1763</id>
		<title>Súbor:Atgathvrp-obr14-princip alfa-beta orezavania.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr14-princip_alfa-beta_orezavania.png&amp;diff=1763"/>
		<updated>2010-02-02T14:00:20Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1762</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1762"/>
		<updated>2010-02-02T13:54:42Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. Algoritmus vyfarbovania je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry) [17].&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; [7]. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
Začína sa z nulovej (koreňovej) pozície a ako prvý je na ťahu hráč ''A'', ktorý podľa dohody ''maximalizuje'' (vyberá si také ťahy, ktoré budú mať za následok pozície s čo najvyšším ohodnotením). Vygeneruje sa prvý možný ťah – ''a''  hráča ''A'', následkom čoho vznikne pozícia označená číslom ''1''. Potom sa postupne podľa znázorneného číselného poradia generujú všetky možné ťahy hráča ''B''. Keďže pozície vytvorené následkom ťahov hráča ''B'' sú zároveň listovými vrcholmi, tak sa v minimaxovej funkcii ohodnotia. Po vygenerovaní všetkých ťahov hráča ''B'' (označených ''2'' až ''6'') sa funkcia naspäť vráti k vrcholu č.''1'' a ohodnotí ho najmenšou (pretože hráč ''B'' minimalizuje) hodnotou z hodnôt pozícií patriacich pod vrchol ''1''. Pridelí sa mu teda hodnota ''-1''. Rovnako sa postupuje aj pre ťahy ''b'' a ''c''. Keď už sú ohodnotené všetky vrcholy v druhej úrovni stromu (vrcholy č. ''1'',''7'',''13''), funkcia sa rekurzívne vráti ku koreňovému vrcholu a ohodnotí ho najvyššou (pretože hráč ''A'' maximalizuje) hodnotou z vrcholov o jednu úroveň nižších. Zistili sme teda, že z koreňovej pozície (vrchol ''0'') bude najlepšie urobiť ťah ''c'' , ktorý pri najlepšom ťahu hráča ''B'' vráti hodnotu ''1'', ktorá je výhodná pre hráča ''A''. Ak by hráč ''A'' urobil na začiatku ťah ''b'', bol by to pre neho najhorší ťah, pretože výsledná pozícia po dvoch polťahoch by mohla mať hodnotu až ''-2'', čo je veľmi výhodné pre hráča ''B''.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1761</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1761"/>
		<updated>2010-02-02T13:50:16Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. Algoritmus vyfarbovania je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry) [17].&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; [7]. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr13-princip_algoritmu_minimax.png‎ | thumb | 400px | right | '''Obr. 13 – Princíp algoritmu minimax''']]&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča ''A'' a následne všetkých možných polťahov hráča ''B''. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr13-princip_algoritmu_minimax.png&amp;diff=1760</id>
		<title>Súbor:Atgathvrp-obr13-princip algoritmu minimax.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Atgathvrp-obr13-princip_algoritmu_minimax.png&amp;diff=1760"/>
		<updated>2010-02-02T13:49:04Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1756</id>
		<title>Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Aplik%C3%A1cia_stromov_a_princ%C3%ADpov_z_te%C3%B3rie_hier_v_niektor%C3%BDch_%C5%A5ahov%C3%BDch_hr%C3%A1ch&amp;diff=1756"/>
		<updated>2010-02-02T12:48:42Z</updated>

		<summary type="html">&lt;p&gt;Defluo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Bakalárske práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
[[Kategória:Matematika]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H1_CSS chapter=&amp;quot;3&amp;quot; prefix=&amp;quot;Kapitola&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sideBox&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;&amp;quot; border=0 cellpadding=5&lt;br /&gt;
|+ Obsah práce&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch| Teória hier]]&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| [[Teória grafov]]&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| [[Aplikácia stromov a princípov z teórie hier v niektorých ťahových hrách]]&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| [[Implementácia algoritmov z teórie hier a teórie grafov do spoločenskej hry dáma]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Herné stromy==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr11-ukazka_herneho_stromu.png | thumb | 400px | right | '''Obr. 11 – Ukážka herného stromu pre hru piškvorky''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree Herné stromy] sú najčastejšie využívaným variantom reprezentácie väčšiny jednoduchších spoločenských hier. V [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Teória hier | teórii hier]] sa takýto popis označuje ako [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Rozšírená forma | rozšírená forma]]. Herný strom tvorí [[Teória grafov#Základné pojmy a charakteristika grafov | orientovaný graf]], ktorého vrcholy (uzly) predstavujú jednotlivé pozície v hre (rozloženie na hernej doske) a orientované hrany reprezentujú jednotlivé [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahy]] (polťahy). Pri hrách pre dvoch hráčov jeden ťah  pozostáva z dvoch polťahov, pričom '''polťah''' je ťah vykonaný jedným z hráčov. Strom potom pozostáva z vrstiev vrcholov (pozícií), ktoré sa postupne zväčšujú v závislosti od zložitosti hry. Jednotlivé vrcholy vznikajú ako následok všetkých možných polťahov striedavo vždy od jedného z hráčov. Na obr. 11 je ukážka časti herného stromu pre hru piškvorky. Tento strom má hĺbku dva polťahy. Kvôli jednoduchosti sú uvedené len varianty možných ťahov (stred okraja, vrchol, stred hracieho poľa). Inak by boli jednotlivé vrstvy pozícií podstatne rozsiahlejšie (už druhá vrstva by obsahovala 9 rôznych pozícií, pretože hráč môže v skutočnosti urobiť ťah na jedno z 9 políčok).&lt;br /&gt;
&lt;br /&gt;
'''Úplný herný strom''' predstavuje celý priebeh hry od začiatku až do konca. '''Východiskový (koreňový) vrchol''' úplného herného stromu teda reprezentuje počiatočnú pozíciu hry. Z neho potom vychádzajú orientované hrany jednotlivých polťahov, ktoré smerujú do vrcholov, ktoré potom predstavujú zmenené pozície po vykonaní ťahu. Koncové vrcholy, tzv. '''listové vrcholy''', sú v úplnom strome tvorené všetkými možnými koncovými pozíciami v hre. Tvoria ich teda všetky výherné (pre jedného alebo druhého hráča) a remízové pozície. Úlohou hráča je potom vykonať takú sekvenciu ťahov, ktorá povedie až k pre neho výhernému listovému vrcholu, prípadne k remíze.&lt;br /&gt;
&lt;br /&gt;
==Riešenie herných stromov==&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Atgathvrp-obr12-uplny_farebny_herny_strom.png | thumb | 400px | right | '''Obr. 12 – Úplný farebný herný strom''']]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Game_tree#Solving_Game_Trees Riešením herného stromu] je nájdenie postupnosti ťahov, ktoré určite povedú k výhre alebo remíze (každý hráč ma svoje riešenie herného stromu). Princíp nájdenia takejto sekvencie ťahov môžeme opísať pomocou úplného farebného herného stromu (Obr. 12). V hre, ktorú znázorňuje tento strom môže každý hráč vykonať vždy len dva ťahy.&lt;br /&gt;
&lt;br /&gt;
Postup vyfarbenia jednotlivých vrcholov je rekurzívny, pretože začína od listových vrcholov (uzlov), ktoré predstavujú konečné pozície hry. Algoritmus vyfarbovania je nasledujúci:&lt;br /&gt;
# Vyfarbi poslednú vrstvu pozícií (listové vrcholy). Čierna farba znamená výhru pre prvého hráča. Biela označuje výhru druhého hráča. Remíza je vyznačená šedou farbou.&lt;br /&gt;
# Prejdi do vyššej vrstvy. Ak je niektorý z vrcholov v najbližšej nižšej vrstve zafarbený opačne ako farba hráča, ktorý bol naposledy na ťahu, zafarbi aj aktuálny vrchol touto farbou protihráča. Nadradený vrchol potom bude rovnakej farby ako je farba hráča, ktorý je aktuálne na ťahu. Ak sú oba najbližšie nižšie vrcholy zafarbené rovnakou farbou jedného z hráčov, zafarbi aj aktuálny vrchol touto farbou. Inak vyfarbi aktuálny vrchol ako remízu.&lt;br /&gt;
# Rovnakým postupom ako v bode č. 2 vyfarbi všetky vrcholy smerom nahor. Koreňový vrchol potom predstavuje povahu hry (v našom prípade je hra neutrálna, teda obaja hráči majú možnosť výhry) [17].&lt;br /&gt;
&lt;br /&gt;
Každá zo sekvencie vrcholov, ktoré vedú k vyriešeniu hry (k víťazstvu alebo remíze) sa nazýva [[Teória grafov#Rozhodovacie stromy | rozhodovací strom]]. Veľkosť (rozmer) rozhodovacieho stromu je daná počtom listových vrcholov. Veľkosťou a tvarom rozhodovacích stromov sa určuje komplexnosť hier a ich vlastnosti.&lt;br /&gt;
&lt;br /&gt;
==Ohodnocovanie pozícií v hernom strome==&lt;br /&gt;
&lt;br /&gt;
Na určenie vhodnej postupnosti ťahov vedúcich k určitému víťazstvu (príp. remíze) nutne potrebujeme poznať úplný [[#Herné stromy | herný strom]]. Bez listových vrcholov s koncovými pozíciami hry totiž nevieme k akému konečnému stavu môže viesť určitý ťah. Vytvorenie úplného herného stromu je však, až na pár výnimiek, pre väčšinu hier príliš zdĺhavé a vo veľa prípadoch prakticky nemožné. V hre piškvorky (na 9 políčkach) napríklad môže vzniknúť 5478 rôznych legálnych pozícií. Po odčítaní otočených a zrkadlových pozícií ich však je len 765. Oproti tomu v dáme je legálny počet pozícií odhadovaný na 10&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;. Šach môže mať takýchto pozícií približne 10&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; [7]. Pri určení nasledujúceho optimálneho ťahu z danej pozície teda budeme musieť v drvivej väčšine prípadov vychádzať z neúplného herného stromu. Postup je principiálne rovnaký ako pri ukážkovej [[#Riešenie herných stromov | metóde vyfarbovania]], avšak [[#Herné stromy | listy stromu]] nie sú koncovými pozíciami hry a okrem rozhodovania úvodného ťahu, nesymbolizuje ani [[#Herné stromy | koreňový uzol]] počiatočnú pozíciu. Keďže teda nevieme či sa bude jednať o výhru jedného alebo druhého hráča alebo pôjde o remízu, musíme nejakým spôsobom zhodnotiť stav hry v listovom vrchole a z neho potom rekurzívne metódou principiálne zhodnou s vyfarbovaním určiť nasledujúci optimálny ťah z koreňového uzla. Najbežnejším spôsobom je ohodnotenie každej listovej pozície určitou číselnou hodnotou. Táto hodnota potom reprezentuje celkový stav hry v danej pozícii, pričom pre jedného z hráčov je výhodné ak je táto hodnota čo najvyššia a pre druhého zase opačne. '''Ohodnotenie''' potom vzniká tak, že sa najprv ohodnotí pozícia kladne len z hľadiska jedného hráča a potom záporne z hľadiska druhého hráča. Tieto ohodnotenia sa potom sčítajú a vznikne celkové ohodnotenie pozície. Z toho vyplýva, že nerozhodný stav hry je ohodnotený číslom nula. Ohodnotenie pozície je závislé na pravidlách hry. Pri dáme je napr. možné hodnotiť počty figúrok (napr. každá figúrka má hodnotu 10). &lt;br /&gt;
&lt;br /&gt;
==Algoritmus minimax==&lt;br /&gt;
&lt;br /&gt;
===Všeobecný popis===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Minimax Minimaxová metóda] je jednou z najčastejšie využívaných metód pri hľadaní optimálnych ťahov v ohodnotenom [[#Herné stromy | hernom strome]]. Minimax využíva hlavnú devízu počítačov a to ich rýchlosť a pamäť. Jedná sa teda o algoritmus, ktorý používa hrubú silu k nájdeniu optimálneho ťahu z danej pozície. Rôzne upravené a optimalizované formy tohto algoritmu sú použité v drvivej väčšine šachových a podobných programov. Existujú aj iné techniky, ktoré sa snažia viac napodobniť ľudské myslenie (neurónové siete, evolučné algoritmy), no minimaxová metóda je zatiaľ najúčinnejšia. Názov minimax vznikol podľa princípu ohodnocovania jednotlivých vrcholov v hernom strome, kde jeden hráč si volí tie pozície, ktoré sú ohodnotené čo najvyššie (tento hráč maximalizuje) a druhý hráč si volí pozície, ktoré majú ohodnotenie čo najnižšie (minimalizuje). Pri hrách s viacerými hráčmi je samozrejme situácia komplikovanejšia. Pritom sa predpokladá, že obaja hráči uskutočnia vždy pre nich ten najlepší možný ťah.&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu minimax===&lt;br /&gt;
&lt;br /&gt;
Algoritmus najprv prechádza od [[#Herné stromy | koreňového vrcholu]] [[#Herné stromy | herného stromu]] postupne až k [[#Herné stromy | listom]]listom (generuje sa herný strom), ktoré sa ohodnotia ohodnocovacou funkciou. Listové vrcholy sú určené hĺbkou prehľadávania, ktorá definuje počet vrstiev herného stromu (pri hĺbke 5 má herný strom 5 vrstiev, kde vrcholy poslednej vrstvy sú považované za listové). Ak je vygenerovaná pozícia (teda vrchol v hernom strome), ktorá znamená koniec hry ešte pred dosiahnutím danej hĺbky, je aj takýto vrchol považovaný za listový. Alternatívou k priamemu určeniu hĺbky prehľadávania je určenie časovej konštanty, ktorá určuje ako dlho môže herný strom zväčšovať počet svojich úrovní. &lt;br /&gt;
&lt;br /&gt;
Po ohodnotení listových vrcholov sa v hernom strome postupuje späť smerom ku koreňovému vrcholu (k počiatočnej pozícii) a ohodnocujú sa ostatné vrcholy stromu. Podľa toho, ktorý hráč je v hernom strome aktuálne na [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | ťahu]] (záleží, či maximalizuje alebo minimalizuje) každý uzol nadobúda maximálnu alebo minimálnu hodnotu zo svojich priamych “potomkov”. Takto sa postupuje až ku koreňovému vrcholu (ten obsahuje pozíciu, z ktorej hľadáme optimálny ťah), ktorý je potom ohodnotený najlepšou hodnotou, akú hráč môže z danej počiatočnej (koreňovej) pozície dosiahnuť. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu je ukázaný na Obr. 13. Pre väčšiu názornosť v spodnom obrázku nie sú znázornené pozície predstavované jednotlivými vrcholmi. Hĺbka prehľadávania je pre jednoduchosť len 2. Takže celý herný strom je zložený zo všetkých možných [[#Herné stromy | polťahov]] hráča A a následne všetkých možných polťahov hráča B. Strom teda znázorňuje jeden [[Aplikácie teórie grafov a teórie hier v rozhodovacích problémoch#Základné pojmy a charakteristika teórie hier | herný ťah]]. Čísla v jednotlivých vrcholoch predstavujú [[#Ohodnocovanie pozícií v hernom strome | ohodnotenie]] danej pozície a čísla pri každom vrchole znázorňujú poradie prechádzania (a vytvárania) vrcholov v hernom strome. Šípky znázorňujú jednotlivé ťahy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Alfa-Beta orezávanie===&lt;/div&gt;</summary>
		<author><name>Defluo</name></author>
		
	</entry>
</feed>