Wstęp
Poniżej opisujemy podstawowe założenia dotyczące rankingu i jego zachowania, a w następnej części znajdują się szczegółowe równania pomocne przy jego obliczaniu.
Założenia
Nasz system rankingowy ma opierać swoje wartości na wynikach osiąganych przez graczy w przeszłości a jednocześnie umożliwiać w pewnym stopniu przewidywanie ich przyszłych wyników. Do obliczania rankingu używamy metod statystycznych, lecz chcieliśmy także dostosować obliczenia w ten sposób, aby ich wyniki były dopasowane do potrzeb społeczności graczy w najlepszy możliwy sposób.
Poniżej przedstawiamy założenia leżące u podstaw obliczania rankingu:
- to, czy ktoś gra z dobrym czy słabym graczem, początkującym czy doświadczonym nie powinno mieć decydującego wpływu na ranking;
- im więcej grasz, tym bardziej stabilny jest twój ranking;
- nowi gracze otrzymują średni ranking, ponieważ nie wiadomo jaki powinien on być w ich przypadku. Po kilku grach niektórzy gracze będą mieli ranking wyższy lub niższy od tej średniej wartości;
- gracz o wyższym rankingu wygrywając z graczem o niższym rankingu może otrzymać mniej punktów rankingowych niż może ich stracić przegrywając z nim;
- wyższy ranking nie oznacza, że gracz który go ma zawsze osiągnie lepszy wynik niż gracz, który znajduje się niżej, oznacza tylko, że im większa jest jego różnica, tym większe prawdopodobieństwo wygranej gracza o wyższym rankingu;
- rankingi graczy nie są sztywne, analiza danych statystycznych wykazuje, że zmieniają się w czasie (w przypadku naszego systemu, dla dłużej grających osób wahania nie powinny być większe niż +/- 150 punktów). Dlaczego wahania te występują? Ponieważ ludzie nie zawsze grają na tym samym poziomie, czasem są zmęczeni, a czasem nie mają nastroju.
- chcemy karać graczy którzy oszukują, potrzebujemy waszych opinii aby lepiej zabezpieczyć was przed ludźmi którzy nie grają fair.
Reguły matematyczne
Poszukując właściwego rozwiązania dla systemu rankingowego mieliśmy na uwadze to, aby miał on mocne podstawy matematyczne i jednocześnie generował akceptowalne wyniki. Prawdopodobnie najbardziej popularny system rankingowy (zwany ELO) został wymyślony przez dr Arpada Elo dla rozgrywek szachowych. System ten został przyjęty przez FIDE (Federation Internationale des Echecs) w 1970 i od tej pory przyjęło go wiele federacji szachowych na całym świecie, jest także używany do obliczania rankingu w innych grach. System ELO jest bardzo dobry, jednak przy jego używaniu występują także problemy.
W 2001 roku prof. Mark E. Glickman opracował nowy system, zwany "Glicko". W podstawowych założeniach przypomina on system ELO, natomiast podstawowa różnica polega na tym, ze wprowadził on tzw. "odchylenie" które opisuje niepewność rankingu. System "Glicko" zapobiega pewnym nieprawidłowościom jakie występują, gdy doświadczeni gracze grają z nowymi graczami o niepewnym rankingu. Zdecydowaliśmy się użyć tego właśnie systemu, wprowadzając do niego niewielkie modyfikacje:
- Gracze którzy oszukują mają obniżany ranking.
Ranking w naszych grach jest obliczany w następujący sposób:
GR: Ranking Glinko używany w naszych grach.
Krok a) dla każdego gracza konwertujemy ranking "Glicko" do wewnętrznego formatu o zakresie od 0 do 3000 (w naszych grach używamy dwóch zakresów rankingu, niektóre gry mają zakres rankingu od 0 do 10000, inne od 0 do 3000, przedstawiamy tutaj przykład obliczeń dla zakresu od 0 do 10000, równania dla zakresu od 0 do 3000 są analogiczne).
IGR: wewnętrzny ranking Glicko
IGR = 1500 + 1500 * (GR-5000)/10000
Krok b) obliczamy początkowe odchylenie w rankingu Glicko:
IGRA: wewnętrzne odchylenie rankingu Glicko
Jeśli do tej pory nie rozegrano żadnych gier:
IGRD = 150 (w oryginalnym Glicko wartość ta wynosiła 350, uznaliśmy ją jednak za nieodpowiednią w niektórych przypadkach).
Jeśli rozegrano już gry:
T: czas od ostatniej gry (w dniach)
IGRD = min(150,sqrt(IGRD* IGRD+63.2*T)
Krok c) Obliczamy nowy wewnętrzny rankign Glicko:
NIGRA: nowy wewnętrzny ranking Glicko
NIGRDA: nowe wewnętrzne odchylenie rankignu Glicko
NIGRB: nowy wewnętrzny ranking Glicko
NIGRDB: nowe wewnętrzne odchylenie rankignu Glicko
NIGRA = IGRA + QA/(1/ IGRDA2 + 1/DA2) * QRDB * (SA,B - EA,B)
NIGRDA = sqrt(1/(1/ IGRDA2 + 1/DA2))
NIGRB = IGRB + QB/(1/ IGRDB2 + 1/DB2) * QRDA * (SB,A - EB,A)
NIGRDB = sqrt(1/(1/ IGRDB2 + 1/DB2))
Gdzie:
PI: liczba Pi (3.14..)
SX,Y: rezultat gry: 1 kiedy X wygrywa, 0 kiedy Y wygrywa, 0.5 w przypadku remisu
Q = ln(10) / 400
QRD = 1/sqrt(1+3*(Q*IGRD/PI)2)
EX,Y = 1/(1+10-QRDy*(IGRx-IGRy)/400)
DX = 1/sqrt(QX*QX*QRD Y *QRD Y * EX,Y * (1-EX,Y))
Krok d) Konwertujemy wewnętrzny ranking Glicko na postać zewnętrzną:
NGR = 5000 + 5000 * (NIGR-1500)/3000
Wartość wynikowa jest wyświetlana w grze.
Oszukiwanie
Co uważamy za oszukiwanie? Jeśli ktoś nie ukończy gry rankingowej (celowo lub z powodu problemów z połączeniem), jest karany. Niestety w ten sposób ludzie używający łącz złej jakości są karani dodatkowo, ale nie mamy sposobu na to aby odróżnić rozłączenie spowodowane przez awarię łącz od celowego przerwania połączenia przez gracza, który wolałby z pewnych względów nie skończyć danej gry. Aby zminimalizować wpływ jakości połączenia na ranking, nie każde rozłączenie podczas gry rankingowej jest traktowane jako oszustwo, jeśli jednak zdarza się to często, gracz zaczyna być karany zmniejszaniem rankingu. Osiągamy to w ten sposób, że przechowujemy w bazie czas ostatniego rozłączenia oraz przyznajemy za każde rozłączenie tzw. bomby, czyli punkty, które po przekroczeniu pewnej wartości mają wpływ na obniżenie rankingu.
Szczegółowe zasady:
- Jeśli gracz nie rozegrał jeszcze żadnych gier, wartość B (bomby) jest równa 0.
- Jeśli gracz nie kończy gry na skutek rozłączenia, i wartość B jest większa od 20, ranking gracza jest modyfikowany w ten sposób, jakby przegrał grę z graczem który ma najniższy możliwy ranking.
- Jeśli gracz nie kończy gry na skutek rozłączenia, wartość B jest zwiększana o 10 pkt., lecz B nie może być większe niż 50.
- Jeśli gracz ukończy grę, wartość B jest zmniejszana o 1. Jeśli więc ktoś nie ukończy gry (B jest wtedy zwiększane o 10), a następnie rozegra 10 gier bez rozłączenia (B zmniejszone 10 razy o 1), B wróci do swojej początkowej wartości.