Zadanie

Mišo a Žaba hrajú hru Trojuholníková nerovnosť. Jej pravidlá sú nasledovné.

Zadaný je orientovaný graf na \(n\) vrcholoch taký, že medzi každými dvoma rôznymi vrcholmi vedie práve jedna hrana. Hra pozostáva z niekoľkých kôl. V každom kole si v tajnosti obaja hráči vyberú niektorý vrchol, a následne sa ich voľby odkryjú. \(1\) bod získa hráč, ktorý si vybral ten vrchol, do ktorého vedie hrana zo súperovho vrcholu. Ak si obaja hráči zvolili ten istý vrchol, obaja získavajú \(\frac{1}{2}\) bodu. Úlohou každého hráča je nazbierať čo najviac bodov.

Obaja spolu nahrali strašné množstvo kôl v ktorých má Žaba \(100\)-percentnú úspešnosť, no Mišo zatiaľ nezískal ani jeden bod. Ten dospel k záveru, že Žaba mu vie čítať myšlienky a prišiel s nasledovným plánom, ako konečne získať nejaké body.

  • Naučí sa generovať skutočne náhodné reálne čísla z intervalu \(\langle 0, 1)\).

  • Každému vrcholu grafu \(v\) pridelí pravdepodobnosť \(p_v\), že si ho v kole vyberie.

Keďže Žaba vie Mišovi naozaj čítať myšlienky1, Žaba o tomto pláne vie. A je mu jasné, že jeho \(100\)-percentná úspešnosť sa končí. Bude mať ale informáciu o tom, aké pravdepodobnosti si Mišo vyberie – na základe nich si zvolí najlepšiu možnú stratégiu.

Ako má Mišo prideliť vrcholom pravdepodobnosti, ak chce v očakávanom prípade získať najväčší možný podiel bodov?

Úloha

Zadaný je graf popisujúci hru. Každému vrcholu grafu \(v\) prideľte pravdepodobnosť \(p_v\), s akou si ho má Mišo vybrať.

Hodnotenie

V závislosti od toho, akú silnú stratégiu tvorí vaše pridelenie pravdepodobností, dostanete body. Konkrétne, Žaba pridelí vrcholom pravdepodobnosti \(q_v\), s ktorými ich bude hrať. Tieto zvolí tak, aby priemerný počet bodov, ktoré Mišo získa, bol čo najmenší.

Označme tento priemerný počet bodov \(x\). Potom za daný test získate \[\frac{1}{t} \cdot \frac{\log(\max(10^{-6}, 1 - 2x))}{\log 10^{-6}}\] bodov, kde \(t\) je počet testov vo vstupnom súbore.

Formát vstupu

Na prvom riadku vstupu je jedno celé číslo \(t = 100\) – počet testov. Nasleduje popis každého z \(t\) testov.

Každý test začína prázdnym riadkom. Na ďalšom riadku je celé číslo \(n = 9\) – počet vrcholov grafu. Nasleduje \(n - 1\) riadkov, v \(i\)-tom z nich sa nachádza \(i\)-čísel. Každé z týchto čísel bude z množiny \(\lbrace -1, 1 \rbrace\).

Číslo v \(i\)-tom riadku a \(j\)-tom stĺpci popisuje, ktorým smerom vedie hrana medzi vrcholmi \(i\) a \(j\). Ak je to \(1\), tak hrana vedie z \(j\) do \(i\) – teda \(i\) poráža \(j\). V druhom prípade vedie hrana opačným smerom.

Formát výstupu

Pre \(i\)-ty test vypíšte na \(i\)-ty riadok výstupu toľko medzerami oddelených čísel z intervalu \(\langle 0, 1 \rangle\), koľko je vrcholov v teste. Tieto čísla musia mať súčet \(1\).

Odporúčame čísla vypisovať s presnosťou \(10^{-9}\). Takisto si dávajte pozor, aby ste ich vypisovali vo formáte pevnej desatinnej čiarky (0.00314), a nie v pohyblivej desatinnej čiarke (3.14e-03).

Súbory na stiahnutie

Ku každej z prvých štyroch testovacích sád vám dáme nápovedu – ku každej vám ukážeme testovaciu sadu, ktorá je síce iná, ale bola vygenerovaná rovnakým spôsobom. Dá sa preto očakávať, že má podobné vlastnosti. Tieto sady môžete nájsť na http://media.ksp.sk/ulohy/34rocnik/1kolo/T2-na-stiahnutie.zip.

Príklady

Input:

2

3
1
1 1

3
1
-1 1

Output:

0.000000000 0.000000000 1.000000000
0.500000000 0.500000000 0.000000000

V prvom teste sme našli optimálne riešenie – vždy vyberieme tretí vrchol, ktorý poráža všetky ostatné vrcholy. Žabova stratégia bude rovnaká, a vždy nastane remíza. V priemere tak získame \(0.5\) bodov. V druhom teste si Žaba zvolí stratégiu, pri ktorej vždy zvolí druhý vrchol. S \(50\)-percentnou šancou zvolíme vrchol \(1\), a Žaba získa bod. Vo zvyšnej polovici prípadov nastane remíza. V priemere tak získame \(0.25\) bodov.


  1. To je tak, keď Mišo Anderle hrá proti Žabovi…

Pri pohľade na túto úlohu každému padne do oka jej netradičné bodovanie. Aj keď ste nenašli najlepšiu stratégiu pre Miša, mohli ste získať za úlohu body. Neznamená to ale, že je ťažké nájsť najlepšiu stratégiu – ide ju spočítať exaktne, a netreba sa uchýliť k heuristickým metódam, magickým konštantám, a podobným.

Ako hrá Žaba?

Máme maticu \(A\) rozmerov \(n \times n\), v ktorej sú hodnoty \(0\), \(\frac{1}{2}\) alebo \(1\) podľa zadaného grafu, pričom hodnotu \(\frac{1}{2}\) máme iba na diagonále. V každom kole si Mišo tajne vyberie riadok \(r\) a Žaba si tajne vyberie \(s\). Následne sa ich voľby odkryjú, a podľa hodnoty v riadku \(r\) a stĺpci \(s\) sa pridelia body. Mišo získa toľko bodov, koľko je tá hodnota. Žaba vždy získa taký počet bodov, aby celkový počet udelených bodov bol \(1\).

Mišo si zvolil pravdepodobnosti \(p_1, \ldots, p_n\)\(p_i\) reprezentuje pravdepodobnosť, s akou si zvolí \(i\)-ty riadok. Súčet pravdepodobností je \(1\). Predstavme si, že si Žaba zvolil stĺpec \(s\). Potom s pravdepodobnosťou \(p_1\) zvolil Mišo riadok \(1\), a v tom prípade by získal \(A_{1, s}\) bodov. S pravdepodobnosťou \(p_2\) zvolil riadok \(2\), a získal by vtedy \(A_{2, s}\) bodov. Podobne pre ostatné prípady. V priemere by tak získal toľkoto bodov:

\[p_1 \cdot A_{1, s} + p_2 \cdot A_{2, s} + \ldots + p_n \cdot A_{n, s} = (p_1, p_2, \ldots, p_n) \cdot (A_{1, s}, A_{2, s}, \ldots, A_{n, s})\]

Samozrejme, Žaba zvolí \(s\) tak, aby v priemere získal Mišo čo najmenej bodov. Môžeme sa na to pozerať tak, že Mišo priradil riadkom pravdepodobnosti, a následne každý riadok matice prenásobil pravdepodobnosťou, ktorú riadku priradil. Následne príde Žaba, a vyberie si stĺpec s najmenším súčtom. Tento súčet reprezentuje očakávaný počet bodov, ktoré získa Mišo.

(Napríklad Mišo si zvolil pravdepodobnosti \(0.3, 0.2, 0.4, 0.1\). Potom vie Žaba hrať tak, že Mišo získa v priemere \(0.25\) bodov – vždy zvolí sivý stĺpec.)

Nash equilibrium

Pod stratégiou hrania tejto hry budeme rozumieť pravdepodobnosti, s akými si zvolíme vrcholy grafu. Zoberme si dvoch hráčov, prvý nech má stratégiu \(P = (p_1, p_2, \ldots, p_n)\). Druhý nech má stratégiu \(Q = (q_1, q_2, \ldots, q_n)\).

Hovoríme, že \((P, Q)\) sú v Nashovom equilibriu, ak žiaden z hráčov nevie zlepšiť svoju stratégiu proti tomu druhému za predpokladu, že ten druhý svoju stratégiu nezmení. Inak povedané, žiadnemu z hráčov sa neoplatí meniť svoju stratégiu – nezlepší si tým priemerný počet získaných bodov.

Známa veta pána Nasha hovorí, že naša hra má Nashovo equilibrium – existujú teda dve stratégie \(P, Q\) také, že sa žiadnemu hráčovi neoplatí meniť stratégiu. Potom musia mať obaja hráči ale očakávaný počet získaných bodov \(0.5\) – každý z hráčov sa totižto môže rozhodnúť skopírovať súperovu stratégiu, a tým by dosiahol zisk presne \(0.5\). My ale vieme, že si týmto nemohol polepšiť (lebo to je Nashovo equilibrium) – takže už predtým musel mať zisk aspoň \(0.5\). Celkový zisk je ale \(1\) – musí to byť preto presne \(0.5\).

To ale znamená, že Mišo vie priradiť riadkom také pravdepodobnosti, aby mal zisk v najhoršom prípade \(0.5\).

Ako nájsť equilibrium?

Niektorí ste sa možno dopátrali ku komplikovaným algoritmom ako Simplex Algorithm alebo Lemke-Howson Algorithm. S našimi obmedzeniami (\(n \leq 9\)) vieme problém vyriešiť aj jednoduchšie.

Predpokladajme, že Mišova stratégia \(P\) je najlepšia – teda má v najhoršom prípade zisk \(0.5\). Potom musí tvoriť dvojica \((P, P)\) Nash equilibrium. Zafixujme stratégiu prvého hráča, a pozrime sa na to, ako by mohol druhý hráč zlepšiť svoj zisk odklonom od stratégie \(P\). Povedzme, že by si v kole vybral stĺpec \(s\). Potom očakávaný zisk je

\[(p_1, p_2, \ldots, p_n) \cdot (A_{1, s}, A_{2, s}, \ldots, A_{n, s})\]

a je nanajvýš \(0.5\), lebo \(P\) je najlepšia stratégia. Ak to nie je \(0.5\), musí to byť menej ako \(0.5\). Potom ale \(P\) nikdy nemôže hrať tento vrchol \(s\) – ak by ho hral, tak by mal celkový zisk menší ako \(0.5\). A to nemôže, lebo keď máme proti sebe dve identické stratégie, tak zisk oboch hráčov musí byť \(0.5\).

Dostávame tak kľúčové pozorovanie – pre každé \(s \in \lbrace 1, 2, \ldots, n \rbrace\) platí, že buď \(p_s = 0\), alebo

\[(p_1, p_2, \ldots, p_n) \cdot (A_{1, s}, A_{2, s}, \ldots, A_{n, s}) = 0.5\]

Môžeme preto postupovať takto: pre každý vrchol si tipneme, ktorá z týchto možností nastala. Dostaneme tak dve množiny vrcholov – prvá množina obsahuje vrcholy, ktorým priradíme pravdepodobnosť výberu \(0\). Druhá množina obsahuje tie vrcholy \(s\), ktoré spĺňajú

\[(p_1, p_2, \ldots, p_n) \cdot (A_{1, s}, A_{2, s}, \ldots, A_{n, s}) = 0.5\]

Týchto rovníc máme \(k\), kde \(k\) je počet vrcholov v druhej množine. Máme teda \(k\) rovníc o \(k\) neznámych (lebo pre \(n - k\) vrcholov z prvej množiny platí \(p_i = 0\)) – na vyriešenie použijeme Gaussovu elimináciu. Takto ale iba získame kandidáta, nemusí to byť ešte hľadaná najlepšia stratégia (vieme ale, že niektorá z nich bude najlepšia). Preto na záver musíme ešte overiť

  1. Či sú vypočítané hodnoty naozaj pravdepodobnosti, teda či sú aspoň \(0\) a najviac \(1\). (Môže sa nám totiž stať, že nám vyjdu hodnoty niektorých premenných záporné alebo väčšie ako \(1\).)

  2. Či to je naozaj najlepšia stratégia. To znamená, že nech si protivník zvolí ľubovoľný z vrcholov \(1, 2, \ldots, n\), v každom prípade máme zisk zisk aspoň \(0.5\).

Časová zložitosť je \(O(2^n \cdot n^3)\) – máme \(2^n\) tipov, a v každom robíme Gaussovu elimináciu na matici s \(k \leq n\) rovnicami a \(k\) neznámymi.

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.