1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<div class="page-header">
<h1>Prowadzenie turnieju "do wirtualnego stolika" w JFR Pary</h1>
<a href="2018/02/04/jfr-pary-virtual-table-tournament/">
<time class="text-muted" title="2018-02-04 18:00" datetime="2018-02-04T18:00">Sunday, February 04, 2018</time>
</a>
</div>
<div class="panel panel-default">
<div class="panel-body">
<p>Poniższa instrukcja ma za zadanie opisać sposób poprowadzenia w oprogramowaniu JFR Pary turnieju na IMP obliczanego w porównaniu do wyniku innego niż wynikający z zapisów na sali gry.</p>
<p>Takie turnieje, rozgrywane "do wirtualnego stolika", porównują zapisy uzyskane przez uczestników do "średniej" ustalonej w sposób sztuczny, np. jako minimaks teoretyczny, jako wynik wzorcowy albo jako średnią w innym turnieju (w tym - butlerze turnieju teamów).</p>
<p>Przykład turnieju obliczanego w ten sposób można zaobserwować w <a href="https://emkael.info/brydz/wyniki/2017/szczyrk/el_minimax.html">wynikach XVI Młodzieżowego Festiwalu Brydżowego</a>, obliczanych jako zbitka turniejów eliminacyjnych do minimaksa teoretycznego.</p>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2>Zakładamy turniej</h2>
</div>
<div class="panel-body">
<p>W poniższych rozważaniach zakładamy, że nasz turniej liczy <code>N</code> stołów grających, czyli gra w nim <code>2N</code> par. Przy nieparzystej liczbie par, ewentualną pauzę liczymy jako parę grającą, chodzi nam o liczbę stołów, przy których pary uzyskują wyniki.</p>
<p>Zakładamy turniej na <code>2N+1</code> stołów (<code>4N+2</code> pary).</p>
<p>Jako sposób liczenia wyników turnieju wybieramy <code>butler,odrzucamy</code> i wybieramy odrzucanie <code>N</code> zapisów z każdej strony.</p>
<p>Tak zdefiniowane warunki gwarantują, że wynik w każdym protokole będzie obliczany do środkowego zapisu (mediany). Za chwilę zadbamy o to, żeby ta mediana była taka, jak chcemy.</p>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2>Monitor turnieju</h2>
</div>
<div class="panel-body">
<p>Pierwsze <code>N</code> stołów rozstawiamy tak, jak rozstawilibyśmy normalnie turniej. To są nasze stoły grające, siedzi przy nich pierwsze <code>2N</code> par naszej listy startowej.</p>
<p>Pozostałe <code>2N+2</code> par usadzamy w każdej rundzie przy pozostałych <code>N+1</code> stołach. W przypadku małego turnieju można to zrobić ręcznie, sadzając w każdej rundzie kolejne pary przy stołach o wysokich numerach. W przypadku większego turnieju - można wygenerować turniej dla dwóch sektorów (drugiego o 1 stół większego niż pierwszy) - dokładne rozstawienie przy nadmiarowych stołach nie ma żadnego znaczenia, dopóki przy każdym takim stole w każdej rundzie "siedzą" nadmiarowe pary.</p>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2>Ustawiamy wirtualne zapisy</h2>
</div>
<div class="panel-body">
<p>Aby zagwarantować, że w każdym protokole środkowym wynikiem (czyli tym, do którego porównywane będą pozostałe) będzie nasz, z góry określony, wynik, wystarczy wpisać do protokołu <code>N+1</code> identycznych wyników, równych naszemu. W ten sposób niezależnie od pozostałych (uzyskanych w żywej grze) zapisów, jeden z naszych wyników będzie w protokole medianą.</p>
<p>
W tym celu najpierw ustawiamy na stole nr <code>N+1</code> (czyli pierwszym nadmiarowym) nasz wynik:
<ul>
<li>jeśli jest to "pełny" wynik (kontrakt, rozgrywający, liczba lew), możemy zrobić to przy pomocy dodatkowego "pierniczka" (lub narzędzia równoważnego, jak <a href="https://michzimny.pl/fillbws">FillBWS</a>)</li>
<li>jeśli jest to wynik liczbowy (np. średnia z protokołu innego turnieju), musimy wpisać go ręcznie do odpowiedniego wiersza tabeli <code>zapisy</code> w bazie danych turnieju (w kolumnie <code>zapi</code>, pozostałe mogą pozostać puste)</li>
</ul>
</p>
<p>
Następnie należy "rozmnożyć" ten zapis na wszystkie pozostałe nadmiarowe stoły. W tym celu wykonujemy w bazie danych turnieju następujące zapytanie SQL:
<pre>
UPDATE zapisy z1 JOIN zapisy z2 ON z2.stol = <kbd>N+1</kbd> AND z1.stol > <kbd>N+1</kbd> AND z1.nrr = z2.nrr
SET z1.kont = z2.kont, z1.rozg = z2.rozg, z1.wist = z2.wist, z1.wyni = z2.wyni, z1.zapi = z2.zapi;</pre>
<code>N+1</code> to numer naszego pierwszego nadmiarowego stołu (tego, w którym ustawiliśmy nasz ustalony wynik).
</p>
<p>Taki turniej następnie możemy poprowadzić i obliczyć - średnia w każdym protokole będzie naszym, z góry ustalonym, wynikiem.</p>
<p>Należy pamiętać o ustawieniu nadmiarowym parom odpowiednio dużych ujemnych wyrównań - każda z tych par uzyskałaby w przeciwnym razie wynik <code>0 IMP</code> w turnieju, więc podzieliłaby prawdziwą listę par.</p>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2>Ukrywamy wirtualne stoły na stronie wyników turnieju</h2>
</div>
<div class="panel-body">
<p>Do zaprezentowania wyników takiego turnieju bez zbędnego mieszania w głowach bardzo długimi protokołami i jeszcze dłuższą listą startową można użyć narzędzia <a href="https://github.com/emkael/jfrpary-virtual-table">JFRPary Virtual Table</a>.</p>
<p>Następnie uruchamiamy je, w wierszu poleceń, zgodnie <a href="https://github.com/emkael/jfrpary-virtual-table#u%C5%BCycie">z instrukcją użycia</a>, podając główny plik turnieju jako parametr.</p>
<p>
Po takim wywołaniu staną się następujące rzeczy:
<ul>
<li>z listy wyników i listy historii znikną nadmiarowe pary</li>
<li>z protokołów znikną wszystkie zapisy przy stołach, przy których obie pary były parami nadmiarowymi</li>
<li>dodany zostanie z powrotem jeden (pierwszy) z takich zapisów, wraz z opisującym go nagłówkiem</li>
</ul>
</p>
<p>Parametrem <code>-t OPIS_STOLIKA</code> sterujemy opisem, jaki pojawi się nad naszym ustalonym zapisem (np. "średnia butlera ligowego" itp.).</p>
<p>Program wykrywa jako nadmiarowe pary takie pary, w których oboje zawodniku ma puste imiona i nazwiska. Jeśli te imiona i nazwiska były zmieniane na liście startowej, numery par, które program ma traktować jako nadmiarowe, można podać wprost, jako kolejne argumenty wywołania programu.</p>
<p>Tak przerobione strony z wynikami należy następnie ręcznie wrzucić na stronę wyników (program <em>jeszcze</em> nie obsługuje wysyłania plików Gońcem).</p>
<p>Każdorazowe wygenerowanie protokołów lub stron z wynikami - przez Kolektor lub "globusik" w Parach - powoduje konieczność ponownego przerobienia stron z wynikami: ukrywanie stołów w wynikach na bieżąco nie jest obsługiwane.</p>
</div>
</div>
<div class="well">
<p>Opracował: <a href="https://emkael.info/">Michał Klichowicz</a>, Komisja IT PZBS</p>
</div>
|