časť 08
Koľko stojí nastavenie? Obtiažnosť, ktorú meria AI
Veľká mapa, osem súperov alebo mlha vojny. Čo z toho je ťažšie a o koľko? Namiesto odhadu hrá tisíce partií AI a výsledok je v bodoch.
Audamir sa dá nastaviť na desiatky spôsobov: veľkosť mapy, tvar políčok, počet súperov, sila umelej inteligencie, limit kociek na políčko, pevnosti, jazerá, tímy, hmla vojny. Každá kombinácia je iná hra. A hráč, ktorý vyhrá, chce vedieť, čo vlastne vyhral.
Víťazstvo v hre pre dvoch na malej mape nie je to isté ako víťazstvo proti siedmim na obrovskej. Rebríček, ktorý ich počíta rovnako, je nezmysel. Rebríček, ktorý ich počíta podľa môjho odhadu, je len názor. Preto je skóre za výhru odmerané.
Princíp: AI za človeka, jedna zmena naraz
Obtiažnosť nastavenia sa dá definovať ako to, o koľko klesne šanca na výhru, keď sa nastavenie zmení. Namiesto človeka, ktorý by musel odohrať tisíce partií, hrá AI. Používame AI na dvoch úrovniach: úroveň 2, Normálna („priemerný hráč“), a úroveň 3, Silná („dobrý hráč“). Protivníkov hrá umelá inteligencia podľa nastavenia.
Postup má tri kroky:
- Základná konfigurácia. Stredná mapa, šesťuholníky, traja súperi, silná AI. Je zvolená tak, aby AI na mieste hráča mala rozumnú šancu (okolo 12 % pre úroveň 2 a 37 % pre úroveň 3). Pri hre, ktorá je príliš ľahká alebo príliš ťažká, by sa výhry „nasýtili“ na 0 alebo 100 % a rozdiely by sa nedali zmerať.
- Zmena jediného nastavenia. Každá hodnota každého nastavenia sa meria zvlášť, vždy 2 400 partií na jednu úroveň AI. Jedno meranie je napríklad
reserve=false@2. - Prepočet na body. Podiel výhier sa prevedie na šance (logaritmus pomeru výhra : prehra, log-odds) a rozdiel oproti najľahšej hodnote nastavenia sa vynásobí ôsmimi. Najľahšia hodnota má preto vždy 0 bodov. Jeden bod zodpovedá poklesu o 0,125 v log-šanciach, čo je pri šanci okolo 50 % zhruba tri percentuálne body. Rozdiely pod 0,12 sa berú ako šum a rátajú sa ako nula.
Skutočný výstup nástroja na rýchle porovnanie, spustený dnes (tools/experiment.js): bonus obrancu +4 oproti hre bez neho.
A: {"defBonus":4}
AI 2: 4.4 % (±1.6) z 600 partií · výhra trvá priemerne 32.3 kola
AI 3: 18.3 % (±3.1) z 600 partií · výhra trvá priemerne 24.5 kola
B: {}
AI 2: 13.9 % (±2.8) z 600 partií · výhra trvá priemerne 36.3 kola
AI 3: 35.2 % (±3.8) z 600 partií · výhra trvá priemerne 37.7 kola
Rozdiel (priemer cez AI): Δ log-odds 1.07 → A je ťažšie než B o ≈ 8.6 b.
Výstup nástroja je anglický a s bodkou ako desatinným znakom, tu je len preložený; slovo „bot“ z výstupu je tu nahradené slovom „AI“. Bonus obrancu +4 je teda približne 8 až 9 bodov obtiažnosti. Tabuľka kalibrácie pre neho eviduje 8 bodov.
Rovnaké číslo po troch dňoch
Všimni si, že tieto čísla (4,4 %, 18,3 %, 13,9 %, 35,2 %, 8,6 bodu) sú presne tie isté, aké stoja v dokumentácii napísanej 17. októbra, hneď prvého rána projektu. Dnes je 20. a medzitým sa v kóde zmenilo veľa vecí.
Nie je to náhoda a nie je to chyba. Meranie je deterministické: seed každej partie sa odvodzuje z jej poradového čísla a názvu merania. Rovnaký kód a rovnaké parametre dajú presne rovnaké čísla, bez ohľadu na počet procesorových jadier. Odtiaľ plynie užitočná vlastnosť: nástroj calibrate.js --verify prehrá 18 kontrolných meraní (9 oblastí hry krát dve úrovne AI, približne dve minúty) a povie jednu z troch viet:
| Verdikt | Čo znamená |
|---|---|
| identické | partie dopadli presne ako pri meraní, správanie hry sa nezmenilo |
| v rámci šumu | rozdiel je malý (z-skóre pod 3), merania sa dajú používať |
| ZMENA (kód návratu 1) | rozdiel nie je náhodný, treba zmerať celé nanovo |
Je to testovanie rovnováhy. Bežný test overí, že funkcia vráti správnu hodnotu. Tento overí, že hra je rovnako ťažká ako včera. V bežnom softvéri sa podobný trik volá golden master alebo snapshot test.
Čo meranie priznáva
Toto nie je presná veda a dokumentácia to hovorí otvorene. Tri hlavné obmedzenia:
Body sa nesčítavajú presne. Skóre hry je súčet bodov zvolených nastavení, čo predpokladá, že sa ich vplyvy sčítajú v log-šanciach. V skutočnosti sa ovplyvňujú. Kontrola tromi kombináciami:
| Kombinácia | Predpoveď z tabuľky | Zmerané |
|---|---|---|
| bonus obrancu +4 a 6 súperov | +16 b. | +13,8 b. |
| bonus obrancu +2 a agresia „Len proti mne“ | +17 b. | +14,7 b. |
| slabá AI a bonus obrancu +4 | −15 b. | −21,3 b. |
Skóre je teda orientačné, mýli sa typicky o 15 až 40 % rozdielu od základu. Hodí sa na porovnanie nastavení, nie na predpoveď šance.
AI nie je človek. Nepoužíva nápovedu a nehrá „po ľudsky“. Najnázornejšia ukážka: bonus Taktik (hráč sám rozmiestňuje kocky) je pri AI podhodnotený, lebo AI na mieste hráča rozmiestňuje rovnako ako súperi, a človek vie viac. Podobne Prehodenie: AI ho minie ihneď, človek si šetrí na dôležitý útok.
Nasýtenie. Keď AI vyhráva menej než 2 % alebo viac než 98 % partií, podiel sa orezáva a body sa podhodnotia. Hmla vojny sa takto zmerať nedá vôbec, AI vidí celú mapu, takže má ručný odhad +3 body. V tabuľke je označená ako odhad, nie ako meranie.
K tomu patrí jedna daň: každá zmena AI zmení všetky namerané podiely výhier, lebo AI je súper pri každom meraní. Po úprave AI treba zmerať všetko znova (26 minút).
Jedna mena obtiažnosti pre všetko
Keď už existuje mena („bod = pokles log-šance o 0,125“), dá sa v nej oceniť čokoľvek. Po nastaveniach sa takto zmerali bonusy hráča, vlastnosti bossov, spoločníci a celé misie kampane. Dizajn kampane je vďaka tomu vecou tabuľky, nie citu. Niekoľko riadkov z nej (priemerné body, plus znamená, že bonus pomáha):
| Bonus | stupeň I | II | III | IV | V |
|---|---|---|---|---|---|
| Zásoby (+N kociek za ťah) | +4,0 | +9,4 | +13,5 | +20,0 | +22,3 |
| Korisť (prvé dobytie ťahu +N kociek) | +8,7 | +16,4 | |||
| Pancier (malé stohy +N obrany) | +0,8 | +1,9 | +3,2 |
Z takejto tabuľky sa dá čítať dizajn. Pancier je slabá, „bezpečná“ voľba. Zásoby rastú skoro lineárne a Korisť je silná hneď od prvého stupňa. A tabuľka bola užitočná aj negatívne: obranné bonusy vedú k patu, lebo mapy sa nasýtia, a preto je Pancier len pre malé stohy.
AI ako zlomyseľný tester
Najpoučnejšie sú prípady, keď meranie ukázalo, že pravidlo je rozbité. Spoločníci hry majú schopnosti, a jedna z nich, Priechod, dovoľuje presunúť kocky z jedného vlastného políčka na druhé. V prvej verzii sa dalo presunúť všetko okrem jednej kocky. Meranie: +19 bodov pri najnižšom stupni. AI totiž neustále sťahovala stohy z vnútra mapy k frontu a útočila plným stohom, takže v druhej misii vyhrávala 97 až 100 % partií. Ani presun dvoch alebo troch kociek nepomohol (+13, +17).
Po obmedzení na jednu kocku na presun vyšli tri stupne na +5,7, +11,9 a +14,7 bodu, čo je zhruba ako bonus Zásoby (+4,1, +9,6, +14,5 v inom meraní, docs/TUNING.md §14.2). Pravidlo sa dalo vyvážiť, lebo sa dalo zmerať.
Opačný príklad: slabina spoločníka „Opatrný postup“ mala pôvodne znieť po výhre sa presunie len polovica kociek. Pre AI bola zničujúca, −11 bodov (Brynja[1] sama vyhrávala v niektorých misiách 7 až 20 %), lebo AI stavia na reťazových útokoch plným stohom. Dnes je mierna (−3,5): stoh aspoň ôsmich kociek nechá doma jednu kocku navyše.
Dve veci z toho plynú. AI nájde dieru v pravidle rýchlejšie, než ju nájde človek. A pri novom pravidle sa oplatí merať súčasti zvlášť, nielen celok, lebo celok často skrýva jednu silnú a jednu slabú časť.
Bežná hra sa nesmie zmeniť
Pri tomto všetkom je jedno pravidlo nad ostatnými: čokoľvek nové sa smie diať len za príznakom (game.special, game.puzzle). Bežná hra tú vetvu nikdy nenavštívi. Overuje sa to dvoma strážcami:
tools/baseline.jszahrá 172 bežných partií a porovná „odtlačok“ každej. Zmena v pravidlách, AI alebo hráčskych úpravách ho musí nechať rovnaký.calibrate.js --verifymusí hlásiť „identické“.
Je to disciplína, ktorú by si programátor často odpustil („veď sa toho netýka“). Meranie ju nedovolí vynechať, lebo trvá minúty a výsledok je binárny.
Čo si z toho odnášam
- Odhad bez merania je názor. Názor je v poriadku, kým si ho nepomýliš s faktom.
- Dobré meranie je deterministické. Keď tie isté vstupy dajú tie isté čísla, meranie sa stane testom.
- Priznaj si hranice. Tri riadky v tabuľke, kde predpoveď a skutočnosť nesedia, sú cennejšie než dvadsať, kde sedia.
- Ručný odhad označ ako ručný. Hmla vojny má +3 body a nikto sa nedozvie, že je to odhad z hlavy, ak to nestojí v zdroji.
Šachové programy sa dnes testujú podobne. Stockfish používa od roku 2013 distribuovaný systém Fishtest, v ktorom dobrovoľníci púšťajú desaťtisíce partií novej verzie proti starej a sekvenčný test pravdepodobnostného pomeru (SPRT) rozhodne, či je zmena lepšia. Poučenie je rovnaké: kto hrá sám proti sebe dosť dlho, dozvie sa o sebe pravdu.
Zdroje a poznámky
- Postup:
docs/TUNING.md§3 (princíp, výpočet bodov, presnosť a limity) a §8.1 (rýchle pokusy A/B). Merania:node tools/experiment.js '{"defBonus":4}' --vs '{}' --games 600anode tools/calibrate.js --listz 20. 10. 2026. - Tabuľka bonusov a misií:
docs/TUNING.md§13.2 (merané 17. 10. 2026, 500 partií). Priechod a Opatrný postup:docs/TUNING.md§14.2, nástrojnode tools/missions.js --heroes. - Stockfish, Fishtest a SPRT: Fishtest FAQ a Chess Programming Wiki o SPRT.
Poznámky
- Do verzie 0.115.1 z 5. novembra 2026 sa volala Bronka. ↩︎