Elo rating – nový hráč, balance bodů a rozdílů

Kcko
Člen | 468
+
0
-

Ahoj,
je to zcela mimo Nette, ale jsou tu chytré hlavy, třeba se dočkám odpovědi.

Mám nějakou virtuální ligu, kde hráči používají sportovní týmy ve hrách (fotbal, hokej) a hraje se vždy 1 vs 1 (člověk vs člověk).

Po odeslání výsledku, oba aktéři dostanou body dle ELO ratingu https://www.eloratings.net/about

Když soutěž vznikne, tak se přihlásí X lidí a všichni dostanou shodný koeficient do začátku (1000 bodů).

Pak už záleží na nich, jak moc vyhrávají / prohrávají a s jakým soupeřem (jaké jsou mezi nimi bodové rozdíly) a dle toho ELO vypočte a přidělí.

Potud v pořádku.

Nicméně i do zaběhlé soutěže, kdy jsou už odehrány stovky zápasů, může přihlásit nový člen. V tuto dobu je tabulka už nějakým způsobem vybalancovaná a dobří hráči jsou nahoře s koficientem (1100–1300), na spodku hráči s koeficientem 800/900.

Teď se tedy připojí nový hráč, dostane 1000 bodů a nastává velký problém. Nikdo nezná jeho sílu ani kvalitu a může snadno obrat velmi dobré hráče, což sice dává jistou logiku, ale díky propastnému bodovému rozdílu dostane hodně bodů v případě výhry a jeho protivník přijde o hodně bodů. A to smysl už nedává. ELO výpočet funguje dobře, ale třeba v šachách nováček těžko může vyzvat skutečného mistra, u mě to prostě lze (hráčů není zas tolik, abych dělal takové omezení).

Nenapadně někoho rozumný způsob jak to udržet nějak v rovnováze? Pomocí ELA lze vypočítat % odhad vítěze a poraženého, tak kdyby to bylo obráceně (nový hráč porazí velmi silného hráče, tak by nedostal třeba +40 bodů, ale jen 20).

Něco ve smyslu, testovací období na 20 zapasů a v tuto dobu dostaneš v případě neočekáváných výher jen zlomek (1/3 – 1/2) bodů.
Nejsem žádný matematik a nic lepšího mě v tuto chvíli nenapadá.

Napadne někoho nějaký lepší model?

mystik
Člen | 308
+
0
-

No asi idealni by bylo koeficient presunu bodu pocitat podle pomeru poctu zapasu obou hracu.

Pokid hraji hraci se stejnym poctem zapasu bude to jako dosud. Pomud hraje nekdo s 1 zapasem s nekym s 10 zapasy bude koeficient 1/10. Pokud novacek bude hrat uz 5 zapas s nekym kdo ma 10 zapasu bude to 1/2. Pokud 9 vs 10 tak 90%.

Pokud bys to chtel nejak rozvolnit tak bych dal nejaky zakladni koeficient ktery prictes obema hracum.

Treba s koeficientem 5 by to pak bylo

1 vs 10 → 6/15 → 40%
5 vs 10 → 10/15 → 66%
9 vs 10 → 14/15 → 93%

Kcko
Člen | 468
+
0
-

Ahoj,
myslíš rozdělit body dle procent? Tj. zápas nějak skončil a má se rozdělit 40 bodů. Koeficient bude 66% (tj. 5 zápasů vs 10 zápasů)

takže místo 40 bodů to bude ~ 26 bodů?

Zajímá idea, alě něco mi na tom ještě neštymuje ;-) , třeba 2 veteráni 500 a 600 zápasů (což prostě je v tomto objemu už jedno ⇒ 83%) a to je taky škoda. Možná toto pravidlo zavést proste pro nováčky (do třeba 20/30 zápasů) a pak toto pravidlo zrušit.

Ještě si zkusím pohrát s $We což je očekávaný výsledek a to první je originální přepsaný údaj ELA a to druhé je moje doplnění o sílů týmů (ještě jsem tam zohlědnoval sílu vybraného týmu, je přeci jen rozdíl když člověk hraje za nějakou vesnici nebo FC Barcelonu a taky to nějakým způsobem koriguje body).

<?php
		// Ocekavany vysledek
		$We = (1 / ( Pow(10, (-$dr/400)) +1 ));

		$We = (1 / (pow(10, (-$dr / (400 * ($s1 / $s2)))) + 1));

?>

Editoval Kcko (20. 5. 2023 22:24)

Marek Bartoš
Nette Blogger | 1260
+
0
-

Můžeš počet zápasů udělat méně relevantní v závislosti na absolutním počtu odehraných.

Nevím zda ti to pomůže, ale můžeš se inspirovat u vysoce kompetetivních her, jak je ranking řešen u nich
https://liquipedia.net/….net_Leagues

mystik
Člen | 308
+
0
-

Pak by mozna bylo reseni zavest logaritmickou skalu. Aby se to

Koeficient = log($zapasy1 + 5) / log(zapasy2 + 5)

Tim u vysokych poctu zapasu rozdil zmensis

mystik
Člen | 308
+
0
-

Hrac1 Hrac2 Koeficient
1 1 100%
1 10 66%
1 50 45%
1 100 38%
1 500 29%
10 10 100%
10 50 68%
10 100 58%
10 500 44%
50 50 100%
50 100 86%
50 500 64%
100 100 100%
100 500 75%
500 500 100%
500 600 97%

Kcko
Člen | 468
+
0
-

mystik napsal(a):

Pak by mozna bylo reseni zavest logaritmickou skalu. Aby se to

Koeficient = log($zapasy1 + 5) / log(zapasy2 + 5)

Tim u vysokych poctu zapasu rozdil zmensis

V tom prvním případě, kdyby hráč A měl 1 zápas, hráč B 40 zápasů a měli by si rozdělit 40 bodů, tak by si reálně dělili 1 bod.
1/40*40. To by kvůli 1 bodu nikdo nehrál, resp nový A hráč by se v ratingu ani nikam neposunul :-)
Je to docela prekérka to vyřešit, s log fcí to už vypadá výrazně lépe.

0 zápasů (nový hráč)
80 zápasů (veterán)

vychází na 36%, takže v případě překvápka to nebude třeba 50 bodů, ale „jen“ 17 to je hezké už.

Těch +5 přičtených má nějaký hlubší vyznam?

Kcko
Člen | 468
+
0
-

Marek Bartoš napsal(a):

Můžeš počet zápasů udělat méně relevantní v závislosti na absolutním počtu odehraných.

Nevím zda ti to pomůže, ale můžeš se inspirovat u vysoce kompetetivních her, jak je ranking řešen u nich
https://liquipedia.net/….net_Leagues

Určitě se mrknu, díky.

mystik
Člen | 308
+
0
-

Tech 5 prictenych ti prave omezi ze 1 vs 40 neni 1/40 = 1 bod a ale 6/46 = 5 bodu. Kdybych pricital 10 tak 11/50 = 9 bodu.

Zmensi to extremni rozdily u prvnich zapasu.

stepos2
Člen | 53
+
0
-

U nových hráčů je cílem, aby se co nejrychleji dostali na svoji úroveň. To co píšete nedává smysl, protože když hráč s malým počtem zápasů bude dostávat málo bodů, potrvá mu to věčnost.

Dělá se to přesně naopak. Nováčci mají koeficient např. 40, zavedení hráči 20, ti nejlepší 10. Viz tady. Tedy v jednom zápasu jeden hráč může ztratit jiný počet bodů, než druhý získá.

Tohle a další věci řeší systém Glicko, který pracuje se spolehlivostí skóre pro daného hráče. Tedy nováček skóre spolehlivé nemá a soupeři proti němu získají a ztrácí míň bodů, naopak on sám jich získává víc. Ale výpočetně je to o dost složitější než ELO.

Kcko
Člen | 468
+
0
-

stepos2 napsal(a):

U nových hráčů je cílem, aby se co nejrychleji dostali na svoji úroveň. To co píšete nedává smysl, protože když hráč s malým počtem zápasů bude dostávat málo bodů, potrvá mu to věčnost.

Dělá se to přesně naopak. Nováčci mají koeficient např. 40, zavedení hráči 20, ti nejlepší 10. Viz tady. Tedy v jednom zápasu jeden hráč může ztratit jiný počet bodů, než druhý získá.

Tohle a další věci řeší systém Glicko, který pracuje se spolehlivostí skóre pro daného hráče. Tedy nováček skóre spolehlivé nemá a soupeři proti němu získají a ztrácí míň bodů, naopak on sám jich získává víc. Ale výpočetně je to o dost složitější než ELO.

@stepos2

Ahoj,
Já jsem o dynamickém K faktoru slyšel a četl, používám ho pro důležitost turnaje (ale ted vidím, že je to blbost, protože do každého turnaje se může přihlásit kdokoliv). Nicméně četl jsem taky o tom, že nový hráč má K faktor mnohem vyšší než zavedený hráč.
Těžím ze zkušenosti a vím, že hráč, který je někde v TOP 10 a nemusí mít nutně stovky zápasů, bude velmi naštvaný a přijde mu nefér, když přijde nováček a jedním zápasem ho obere o tolik bodů, které pracně získal třeba v 10 – 15 stabilních zápasech a to jen proto, že to je hra a nelze nijak ověřit jak je nováček dobrý.

Asi jako kdyby Brazílie jako fotbalová velmoc dostala bůra v zápase od zcela nového týmu, který nikdy nehrál, nikdo ho nikdy neviděl hrát, nikdo nezná jeho fotbalisty … což se v reálném fotbale na 99% nemůže stát, ale tady poměrně často a proto je ELO docela vyvážené, ale tady by to slušně nabořilo eko systém.
Toť můj názor.

@mystik

Díky, zavedu to pro testovací období (určitý počet zápasů), pak už to zohleďnovat nebude.

stepos2
Člen | 53
+
0
-

Kcko napsal(a):
Těžím ze zkušenosti a vím, že hráč, který je někde v TOP 10 a nemusí mít nutně stovky zápasů, bude velmi naštvaný a přijde mu nefér, když přijde nováček a jedním zápasem ho obere o tolik bodů, které pracně získal třeba v 10 – 15 stabilních zápasech a to jen proto, že to je hra a nelze nijak ověřit jak je nováček dobrý.

Právě že neobere. Vítežný nováček získá max. 40, rychleji se dostane na svou úroveň, ale zavedený hráč ztratí za stejný zápas jen max. 10. Každý má prostě svůj vlastní koeficient.

Editoval stepos2 (21. 5. 2023 8:20)

Kcko
Člen | 468
+
0
-

stepos2 napsal(a):

Kcko napsal(a):
Těžím ze zkušenosti a vím, že hráč, který je někde v TOP 10 a nemusí mít nutně stovky zápasů, bude velmi naštvaný a přijde mu nefér, když přijde nováček a jedním zápasem ho obere o tolik bodů, které pracně získal třeba v 10 – 15 stabilních zápasech a to jen proto, že to je hra a nelze nijak ověřit jak je nováček dobrý.

Právě že neobere. Vítežný nováček získá max. 40, rychleji se dostane na svou úroveň, ale zavedený hráč ztratí za stejný zápas jen max. 10. Každý má prostě svůj vlastní koeficient.

Aha, tak možná tedy v Glicko2 ratingu, který neznám. v ELO se vždy rozděluje stejný počet bodů, jinak by došlo k inflaci/deflaci, tam není možné aby jeden získal +40 a jeho souper –10.

Našel jsem nějakou starší implementaci, vyzkouším a uvidím co to bude házet za výsledky https://github.com/zelenin/glicko2

stepos2
Člen | 53
+
0
-

To záleží na implementaci, klidně může jeden získat 40, druhý –10 v ELO. V šachách se to tak dělá. K inflaci dochází, ale je to menší problém než ten, který řešíš.

Editoval stepos2 (21. 5. 2023 8:35)

Kcko
Člen | 468
+
0
-

Dobře, děkuju.

Zkusím dohledat, protože standardní ELO se tak nepočítá a ten vzorec je tedy nějakým způsobem odkloněn nebo má jiné parametry nebo tam vstupuje ještě nějaký nový, aby se to takhle chovalo, pokud víš, jak se to liší tak budu rád, jinak zkusim pogooglit.

Knihoven na Githubu ohledně ELA je víc, všechny dělají ale to samé jako moje funkce na ELO, vstupními parametry jsou 2 ratingy hráčů, skóre a faktor a výstupem jsou nové ratingy, nebo body které jeden dostane a druhému se strhnou.

stepos2
Člen | 53
+
0
-

Knihovnu ti úplně neporadím, ale vzorečky jsou tady a do toho posledního si jenom za K dosadíš koeficient daného hráče. Ten si nějak musíš stanovit sám. V „čistém“ ELO je koeficient vždy pro oba stejný, proto to ty knihovny asi tak používají. Ale právě kvůli takovýhle problémům se od toho v některých implemetacích ustoupilo.

Editoval stepos2 (21. 5. 2023 9:06)

Kcko
Člen | 468
+
0
-

stepos2 napsal(a):

Knihovnu ti úplně neporadím, ale vzorečky jsou tady a do toho posledního si jenom za K dosadíš koeficient daného hráče. Ten si nějak musíš stanovit sám. V „čistém“ ELO je koeficient vždy pro oba stejný, proto to ty knihovny asi tak používají. Ale právě kvůli takovýhle problémům se od toho v některých implemetacích ustoupilo.

Tak teď sem pochopil tvojí ideu ze začátku. Pořád jsem žil v domnění, že body se musí rozdělit stejně a není možné dát nováčkovi vysoký koeficient protože skilled hráč by přišel o hodně.

Stačí tedy dát nováčkovi vysoký koeficient a dobrému hráči nechat nižší.

Tím pádem se body rozdělí jinak (třeba pro nováčka +50, pro poraženého skilled hráče –15).

Ale ještě si musím přečíst znovu něco o inflaci / deflaci. Řesil jsem tohle téma už dřive někde jinde a byl jsem na to upozorněn:
https://diskuse.jakpsatweb.cz/?…

stepos2
Člen | 53
+
0
-

V těch vzorcích se vždy počítá s rozdílem ve skóre. Takže jestli má jeden hráč 1500, druhý 1300, nebo s inflací jeden 1800 a druhý 1600, tak je to fuk, rozdíl je pořád 200. Jako moc se mi to nelíbí, ale říkám si používá to tak FIDE v šachách a funguje to, tak proč vymýšlet něco jiného.

Kcko
Člen | 468
+
0
-

stepos2 napsal(a):

V těch vzorcích se vždy počítá s rozdílem ve skóre. Takže jestli má jeden hráč 1500, druhý 1300, nebo s inflací jeden 1800 a druhý 1600, tak je to fuk, rozdíl je pořád 200. Jako moc se mi to nelíbí, ale říkám si používá to tak FIDE v šachách a funguje to, tak proč vymýšlet něco jiného.

No to souhlasí jen za předpokladu, že dostanou oba stejné body at už plusové či minusové.

Teď sem si to zkoušel

<?php

require './vendor/Grt/Grt.class.php';


$Ra = 1000;
$Rb = 1200;
$Sa = 1;
$Sb = 0;

$s1 = 100; // sila tymu, v tuhle chvili se nezohlednuje, vypnuto
$s2 = 100;



print_r(Grt::elo($Ra, $Rb, 40, $Sa, $Sb, $s1, $s2));
print_r(Grt::elo($Ra, $Rb, 16, $Sa, $Sb, $s1, $s2));
?>

Což znamená, nováček bez zápasu nebo s nizkým počtem (tj. Testovaci období) porazil silného a zkušeného hráče a dostává 34 bodů, poražený silný hráč dostává –13 bodů.

Jenže dle mě tohle po nějaké době silně naruší přirozenost ELO tabulky a inflace/deflace a rozhodně to nebude 200 bodů jako v tvé domněnce.

<?php
Array
(
    [0] => 34.250082403926
    [1] => -34.250082403926
)
Array
(
    [0] => 13.70003296157
    [1] => -13.70003296157
)

?>
stepos2
Člen | 53
+
+1
-

Kcko napsal(a):

No to souhlasí jen za předpokladu, že dostanou oba stejné body at už plusové či minusové.

Inflací se rozumí růst průměrného skóre napříč všemi hráči v soutěži. Když dostávají oba stejné body, k žádné inflaci nedochází.

Zkus to aplikovat na všechny zápasy a uvidíš. V některých soutěžích to takhle vyhovuje a tvůj problém to podle mě vyřeší. Jestli se objeví nějaký jiný, to záleží na charakteru soutěže.

Editoval stepos2 (21. 5. 2023 14:41)

Kcko
Člen | 468
+
0
-

Když je dostávají oba stejné body, k žádné inflaci nedochází.
No právě, stejne body oba souperi dostávat nebudou. Ale vyzkousis, je to snadné na upravu a mohlo by to být funkční. Díky za myšlenku i @mystik

Kcko
Člen | 468
+
0
-

*vyzkousim :)