Search
Podrobná specifikace toho, co musí hráč umět a jak musí vypadat, aby mohl hrát turnaj s ostatními.
Veškerý potřebný kód, který hráč potřebuje ke hraní musí být v souboru player.py. Tento soubor (a jen tento soubor) nahrajete do BRUTE. Hráč může importovat některé standardní moduly Pythonu (Python Standard Library), např. random nebo typing.
player.py
random
typing
Uvědomme si, že hráči spolu nekomunikují přímo, ale přes prostředníka, který bude hráče volat a archivovat jejich výsledky. Hráče (v souboru player.py) implementujete ve formě třídy MyPlayer, která bude poskytovat tyto metody:
MyPlayer
__init__
payoff_matrix
number_of_iterations
select_move
record_last_moves
(my_last_move, opponent_last_move)
Třída - hráč se bude identifikovat popisem ve formě doc-stringu. Maximální délka je 80 znaků. Popis by měl co nejlépe, ale stručně, vysvětlovat, jak hráč hraje. Příklad:
class MyPlayer: '''Hrac hraje, co ho napadne, vetsinou C''' # <--- Tento docstring změňte tak, aby popisoval základní princip vašeho hráče def __init__ #dale pak pokracuje standardni kod
Dvourozměrné pole dvojic. První řádek a sloupec, index 0, odpovídají COOPERATE, druhý řádek a sloupec pak volbě DEFECT.
COOPERATE
DEFECT
Zisk hráče A v případě že hraje COOPERATE a hráč B DEFECT je tedy
payoff_matrix[0][1][0]
payoff_matrix[COOPERATE][DEFECT][0]
V našich hrách a turnajích budeme uvažovat pouze “symetrickou” payoff matici. Hráč tedy nemusí vědět, zda je hráč A či B, mají rovné příležitosti i rizika. Příklad matice naleznete níže.
Zkrátka má pouze hrát.
Z tohoto důvodu je v BRUTE zakázán import mnoha standartních modulů, nejvýznamější z nich jsou os, sys, importlib a inspect. Stejně tak je zakázáno používat standardní funkci open().
os
sys
importlib
inspect
open()
Na konci budou hrát hráči několik turnajů. V každém turnaji je cílem maximalizovat svůj celkový zisk, tedy součet všech dílčích zisků v jednotlivých kolech mít co největší.
Jednu část hodnocení bude tvořit souboj vašeho hráče proti sobě samému. Hráč to ovšem nebude explicitně vědět, musí na to přijít sám. Bodový zisk se započítá oběma stranám - v případě souboje se sebou samým si tedy váš hráč přijde na součet zisku hráče A i B. Druhou částí hodnocení budou turnaje typu každý proti každému.
Turnajů bude několik. U základní varianty bude matice zisků známa dopředu. U další varianty turnaje se hráč dozví matice zisků až před začátkem hry. Informace o počtu iterací předána být může i nemusí (alespoň u jednoho turnaje předána bude). Hráč bude muset rozhodnout sám jakou strategii hrát. Hráč může svoji strategii během hry měnit jakkoli chce.
Jeden z turnajů bude zatížen šumem v komunikaci. S nějakou malou pravděpodobností se může váš či soupeřův tah obrátit. Hra se šumem dobře modeluje některé reálné situace, detailnější diskuse viz např. http://www-personal.umich.edu/~axe/research/PD_with_Noise.pdf Doufáme, že šumová varianta hry podnítí kreativitu a přinese nová zajímavá řešení.
Matice, která bude použita pro první turnaj:
tedy v Pythonu:
payoff_matrix = ( ((4,4),(1,6)) , ((6,1),(2,2)) )
Kromě klasických matic pro vězňovo dilema (jako je např. matice pro první turnaj a testování) mohou být použity i jiné typově odlišné matice (nejen v našich turnajích).
Matice, kde není dilema a dominantní strategie (D) je tedy jasná:
Jiný typ matice vedoucí na alternující strategii:
Doporučujeme pro testování vašich algoritmů vzít v úvahu rozličné typy payoff matic.
Pokud už máte implementovaného hráče, můžete si stáhnout a prohlédnout kódy pro velmi jednoduché otestování: game.py, který implementuje hru, a test_game.py, který umí postavit dva hráče proti sobě a nechá je zahrát hru. Pročtěte si tyto kódy, a komentáře v nich a zkuste je spustit se svým hráčem (test_game.py postaví proti sobě vaše dva identické hráče). Soubory si samozřejmě můžete libovolně upravit a dělat s nimi experimenty.
game.py
test_game.py