Luokitusten säätäminen korottamalla kerhonsa pelaajia ei ole aivan yksinkertaista. Kun pelaajamäärä on vähänkään suurempi, ongelmia tuottaa se, että sillä, jolla korotusvastuu on, ei ole riittävää omakohtaista tietoa kaikkien korotustarpeessa olevien pelaajien nykyisestä pelitaidosta.
Markku Jantunen ja minä kävimme sekä täällä wikissä että offlinenä hieman keskustelua asian tiimoilta. Markku esitti, että pelaajien välisten keskinäisten tasoituskivien määrän taulukoimalla voidaan ainakin suuntaa-antavasti arvioida korotustarpeessa olevia pelaajia ja korotusten suuruutta. Itse olin aikaisemmin käyttänyt samankaltaista menetelmää Oulun Goonpellaajien alkuaikoina, kohtalaisin tuloksin. Esitän seuraavassa hieman viritetyn version algoritmista luokitusten arvioimiseen siitä, minkä kukin pelaaja luulee olevan oikea tasoitus suhteessa muihin.
Alla olevat esimerkit on kirjoitettu myös matlab (octave) -koodina, joka toivottavasti auttaa insinöörejäkin ymmärtämään, mitä tarkoitan.
Jokaiselta pelaajalta kysytään, mikä hänen mielestään on sopiva tasoitus kunkin muun pelaajan kanssa, ja tulokset laitetaan neliömatriisiin siten, että jokaisella rivillä on pelaajan näkemys tasoituskivista sen sarakkeen kohdalla, jonka kanssa samannumeroinen rivi vastaa k.o. pelaajan mielipiteitä. Mikäli arvausta ei ole saatavissa, laitetaan arvoksi pelaajien luokitusero. Valkoisen antama tasoitus on negatiivinen luku, mustan vastaanottama positiivinen.
Alla matriisiin H on kirjoitettu neljän täysin fiktiivisen pelaajan näkemykset siitä, mikä on tasaväkisen pelin aikaansaava tasoituskivien määrä keskinäisissä peleissään. Huomataan, että pelaajat 1 ja 2 pelaavat keskenään tasa-avauksella ja pelaajat 3 ja 4 ovat ensiksimainittuja joitakin kiviä heikompia.
>> H = [ 0 0 -8 -5; 0 0 -8 -4; 8 7 0 2; 5 5 -2 0] H = 0 0 -8 -5 0 0 -8 -4 8 7 0 2 5 5 -2 0
Tarkoituksena on seuraavaksi laskea kunkin pelaajan antama tai saama keskimääräinen tasoitus. Tämän laskemiseksi matriisista H vähennetään sen transpoosi, jonka jälkeen rivit lasketaan yhteen ja tulos jaetaan pelaajien määrällä kertaa kaksi. (Koska vähennettäessä transpoosi luvut kaksinkertaistuvat.)
>> D = H - H' D = 0 0 -16 -10 0 0 -15 -9 16 15 0 4 10 9 -4 0 >> h_rel = D * ones(length(D),1) / (2*length(D)) ( ones(length(D),1) = [1 1 ... 1 1]' ) h_rel = -3.2500 -3.0000 4.3750 1.8750
Nyt vektorissa h_rel on jokaisen pelaajan antama keskimääräinen tasoitus. Miten tämä liittyy pelaajien luokituksiin? Kun lasketaan pelaajien keskimääräinen luokitus, on keskimääräinen tasoituskivien määrä suoraan suhteessa tähän. Kirjoitetaan pelaajien nimelliset luokitukset vektoriin r ja lisätään sen keskiarvo vektoriin h_rel.
>> r = [2 3 11 8]' r = 2 3 11 8 >> r_est = h_rel + mean(r) r_est = 2.7500 3.0000 10.3750 7.8750
Nyt vektorissa r_est on estimaatti kunkin pelaajan luokituksesta. Vektori r_est on minimietäisyydellä nimellisistä luokituksista. Mikäli nimelliset ja arvioidut luokitukset poikkeavat toisistaan, on syytä harkita korotuksia. Korotusmääriä voi kokeilla muuttamalla nimellisten luokitusten arvoja vektorissa r ja esim. laskemalla keskimääräisen neliövirheen.
>> r_mse = sum((r_est - r).^2 ) / length(r_est) r_mse = 0.2422
Edellisestä menetelmästä täytyy huomata, että se perustuu kahteen oletukseen:
- Pelaajien luokitusero ja käytetty tasoituskivien määrä ovat toisiansa vastaavia, mikäli luokitukset ovat oikein.
- Pelaajat osaavat arvioida oikean tasoituskivien määrän suurinpiirtein oikein
--Paavo Pietarila 12-01-03
Tietenkin tämä herättää kysymyksen siitä miten arvioida tasoituskivien määrä uudelle pelaajalle. Tasoituskivien tarkoituksena on luoda tilanne, jossa voittotodennäkyisyys p=0.5 kun pelataan oikeilla tasoituksilla. KGS:n, ELO-järjestelmän ja GOR-järjestelmän pohjana on oletus, jonka mukaan pelaajan X voittotodennäkyisyys voidaan arvioida seuraavalla kaavalla:
p=1/(1+A^((rank(Y)-rank(X)+tasoitus)*K))
jossa A ja K ovat eri vakioita. ELO-järjestelmässä A=10 ja K=1/400, kun taas kgs-järjestelmässä A=e ja K~1, luokituksesta riippuen. ELO- ja GOR-järjestelmissä luokitukset vaihtelevat välillä 100-3000, kun taas KGS-järjestelmä pyrkii käyttämään luokituksia, jotka vastaavat kyu ja dan-arvoja.
Pelaajan luokitus arvioidaan täten tilastollisesti pitämällä lukua pelatuista peleistä sekä valitsemalla se luokitus, jonka avulla yhteenkerrottu todennäköisyys tuloksille on mahdollisimman pieni.
Käyttäkäämme esimerkkiä.
Yllämainittuun go-kerhoon, jossa pelaajilla on luokitukset 3k, 3k, 8k ja 10k liittyy uusi pelaaja jonka nimellinen vahvuus on tuntematon.
Hän ottaa 3k-pelaajalta 9 kiveä ja häviää kaksi peliä. 10k-pelaajaa vastaan hän pelaa ilman komia ja voittaa yhden pelin, häviten toisen. 8k-pelaajaa vastaan hän pelaa yhden pelin kahden kiven tasoituksella ja voittaa pelin.
Mikä on todennäköisin luokitus?
Annetaan muuttujan x kuvata pelaajan luokitusta.
Todennäköisyys kahdelle tappiolle 3k-pelaajaa vastaan on (1-(1/(1+e^(12-x))))^2. Todennäköisyys yhdelle voitolle 8k-pelaajaa vastaan on (1/(1+e^(10-x))). Todennäköisyys yhdelle voitolle 10k-pelaajaa vastaan on (1/(1+e^(11-x)). Todennäköisyys yhdelle tappiolle 10k-pelaajaa vastaan on 1-(1/(1+e^(11-x)).
Kertomalla nämä toisillaan saadan funktio, jonka maksimiarvo sijaitsee todennäköisimmän luokituksen kohdalla. Tässä tapauksessa maximiarvo saadaan luokitukselle 11k.
Tätä menetelmää voidaan käyttää myös silloin, kun kaksi pelaajaa pelaavat useampia pelejä toisiaan vastaan eri tasoituksille.
--Markus Koivisto 13-04-2005
Add new attachment
Here's a short reminder on the most common formatting rules you have at your disposal. A complete list is available in TextFormattingRules.
(empty line) Make a paragraph break. ---- Horizontal ruler [link] Create hyperlink to "link", where "link" can be either an internal WikiName or an external link (http://) [text|link] Create a hyperlink where the link text is different from the actual hyperlink link. [text|wiki:link] Create a hyperlink where the link text is different from the actual hyperlink link, and the hyperlink points to a named Wiki. This supports interWiki linking. * Make a bulleted list (must be in first column). Use more (**) for deeper indentations. # Make a numbered list (must be in first column). Use more (##, ###) for deeper indentations. !, !!, !!! Start a line with an exclamation mark (!) to make a heading. More exclamation marks mean bigger headings. __text__ Makes text bold. ''text'' Makes text in italics (notice that these are single quotes (')) {{text}} Makes text in monospaced font. ;term:def Defines 'term' with 'def'. Use this with empty 'term' to make short comments. \\ Forced line break (please use sparingly). |text|more text| Makes a table. Double bars for a table heading.
Don't try to use HTML, since it just won't work.
To embed images just put them available on the web using one of the approved formats, and they will get inlined automatically. To see the list of approved formats, go check SystemInfo.
To make a code block, use triple {'s to open, and triple }'s to close.
(Wondering where this text comes from? It's on a page called Edit Page Help, which you can edit too!)