Autor Zpráva
Kcko
Profil
Ahoj,

na starším projektu jsem pro výpočet síly hráčů (hráli počítačové sportovní hry), používal ELO vzorec; viz. eloratings.net/about
Funguje to hezky a nyní se k tomu chci v jiném projektu vrátit, ale vadí mi tam jedna věc.

Když přišel do tabulky nějaký nový hráč, dostal ELO koeficient 1000 (s tím začíná každý a pak už jen na něm jak bude tabulkou díky výkonům klesat či stoupat).

Může se ovšem stát, že ten nový hráč bude extrémně dobrý nebo extrémně špatný a narazí-li v prvních zápasech na opět velmi dobré či špatné hráče, zbytečně mu to sežere body nebo je naopak tak trošku neprávem získá.

Přemýšlím jak to trošku upravit (nemyslím asi konkrétní vzorec), ale obecně to chování, než se vyprofiluje do podoby dobrého či horšího hráče, aby ty body na začátku tak neskákaly.

Napadají mě taková samá humpolácká nematematická řešení (nastavit si něco jako "testovací období hráče" třeba na 10-15 zápasů a ty body mu odečítat/přičítat v nějakém definovaném rozsahu mimo ELO vzorec a spíše v nějakém menším rozsahu (třeba 1-15 bodů dle toho s jak špatným/dobrým hráčem hraje).

Nemá někdo lepší ideu? ;-)
Kajman
Profil
Udělal bych si testovací období - hranice např. těch 10 odehraných zápasů s hráči, co už mají rank. V tomto období by rank neměl a vypočítal se až po dosáhnutí hranice podle průměrného ranku soupeřů a vyhraných zápasů. Když vyhraje půlku zápasů, necháš mu ten průměrný rank. Když víc, něco mu za každý navíc přičteš, když míň než 5, něco odečteč. Starým hráčům se tedy nebude měnit rank, když hrají s novým, protože se neví, jak je silný. Zápasy mezi novými hráči se do výpočtů nezahrnou vůbec.

Edit: druhá varianta - neco si těch 10 soupeřů, se kterými hrál seřadíš podle ranku a použiješ pořadí řádku podle toho, kolik jich vyhrál. Když žádný tak menší z čísel (nejmenší rank soupeře, nějaká konstantní nízká hodnota). Takže při 5 výhrách, 5 prohrách by dostal 6. nejlepší rank, se kterým se utkal.
juriad
Profil
Pozor na inflaci/deflaci. ELO dodržuje invariant, že celkový součet ELO všech hráčů je vždy 1000 * #hráčů. Pokud budeš nesymetricky měnit distribuci bodů, tak se ti může stát, že průměrné ELO vzroste nebo klesne pod 1000 (což klasický algoritmus nedovoluje), a tedy celkově nebude stabilní.

Pokud se podíváš na ten vzorec, můžeš si celkem nezávisle hrát s parametrem K. Já bych zvolil asi nějakou variantu sigmoidy (funkce, která konverguje k 1) závislé na počtu odehraných her: min(#herHráče1, #herHráče2); například: www.wolframalpha.com/input?i=1%2F%281%2B2*e%5E%28-x%2F4%29%29%5E3+from+0+to+30 (můžeš si volně hrát s těmi konstantami 2, 3, 4 podle toho, jaký chceš mít náběh).
Kcko
Profil
juriad:
S parametrem K si hraji. Parametr K se určuje dle důležitosti turnaje juriad a tak to tam mám i já zahrnuto viz:

K is the weight constant for the tournament played:
60 for World Cup finals;
50 for continental championship finals and major intercontinental tournaments;
40 for World Cup and continental qualifiers and major tournaments;
30 for all other tournaments;
20 for friendly matches.


Pozor na inflaci/deflaci. ELO dodržuje invariant, že celkový součet ELO všech hráčů je vždy 1000 * #hráčů.
Mno, to je snad ošetřeno tím vzorcem ne? Kecám, tady se to řeší Elo rating system: start value when players can join the game constantly

Sigmoid neznám, ale přijde mi to už nějaké zbytečně složité. Budu ještě přemýšlet.
Díky.


Kajman:
Díky za oba návrhy, leč nebudou průchozí.

Hráči si jednak chtějí zahrát a za druhé o něco hrají (o body do koeficient nebo do ranku = obojí je to samé).
Bude hodně hráčů, kteří s nováčkem hrát nebude, protože za to nic nedostane. Tím padá tvoje první varianta a té druhé jsem ne zcela rozuměl.

Rank není pořadí v tabulce, ale celkový koeficient (body) jednotlivého hráče, dle kterého je umístěn v tabulce.
juriad
Profil
Kcko:
Pozor na inflaci/deflaci. ELO dodržuje invariant, že celkový součet ELO všech hráčů je vždy 1000 * #hráčů.
Mno, to je snad ošetřeno tím vzorcem ne?
Ano, pokud budeš ten vzorec dodržovat. Pokud bys například prvních 10 zápasů našemu začínajícímu hráči ELO neměnil, ale hráčům, kteří s ním hrají bys ho upravoval (podle výhry/prohry), tak bys narušil ten invariant. Stačí si dát pozor, abys vždy jednomu hráči přičetl ten samý počet bodů jako odečetl jeho protihráči. Kolik bodů to bude je záleží na nějaké strategii - například prvních 10 zápasů bude "trénovacích" a tedy jejich koeficient bude poloviční, nebo ten koeficient bude v prvních 10 zápasech růst lineárně. Sigmoida byla jen další možná funkce převádějící počet odehraných kol na koeficient v rozsahu [0,1].

Kajmanovy nápady právě trpí tím, že po deseti odehraných zápasech (za které se ELO žádného hráče nezměnilo) vznikne nový hráč, který začíná s ELO, které není 1000. Takže se nezachová průměr a dojde k inflaci. Pokud nový hráč by měl ELO větší než 1000, tak celkový průměr malinko vzrostl, v systému je víc bodů, a tedy být dobý je jednodušší.

Ono to ELO funguje na principu, že každý začíná s 1000 a hráč se stává lepším, že ELO krade horším protihráčům a horším tím, že je o body okraden. Pokud chceš umět spočítat ELO po každém zápase, máš vlastně jen dvě možnosti jak to ovlivnit:
1) počet bodů, o které se hraje - kolik bodů má náš nový hráč dostat za výhru
2) výběr hráče, se kterým bude nový hráč hrát - toto může a nemusí být proveditelné - nevím, jak máš turnaj nastavený

Jinak bys třeba mohl odehrát 10 zápasů bez bodového ohodnocení, a po těch 10 zápasech podle odhadnutého ELA zpětně přerozdělit body.

Jakýkoli systém zvolíš bude mít nevýhodu, že je nespravedlivý vůči někomu. Pokud budeš nového hráče hájit a zmenšovat mu koeficient K, tak protihráč, který s ním vyhrál dostane méně bodů a může si připadat ukřivděný. A naopak, pokud víš, že je dobrý a zvolíš slabé protihráče, aby se rychle doslat na své přirozené ELO, tak ti slabí hráči se stanou obětními beránky a jejich ELO bude horší než by mělo být. (Opak také platí: zvolíš silné hráče aby jej obrali o příliš velké ELO, se kterým začínal; pak tito hráči získali body příliš snadno.)
Kcko
Profil
juriad:
To já dodržuji celou dobu, je mi jasné, že co strhnu jednomu, musí získat druhý :-).
To co navrhl Kajman jsem označil za neprůchozí, přesto mu děkuju za snahu pomoci.

Jinak je mi jasné, že do toho úplně nevidíte, nebo to vysvětluji jak tatar.

Jakýkoli systém zvolíš bude mít nevýhodu, že je nespravedlivý vůči někomu. Pokud budeš nového hráče hájit a zmenšovat mu koeficient K, tak protihráč, který s ním vyhrál dostane méně bodů a může si připadat ukřivděný. A naopak, pokud víš, že je dobrý a zvolíš slabé protihráče, aby se rychle doslat na své přirozené ELO, tak ti slabí hráči se stanou obětními beránky a jejich ELO bude horší než by mělo být. (Opak také platí: zvolíš silné hráče aby jej obrali o příliš velké ELO, se kterým začínal; pak tito hráči získali body příliš snadno.)

Mno takto:

- Elo odpovídá většinou odpovídá tomu jak je hráč silný, když se začíná, tak tam jsou menší výkyvy, ale to pak během několika odehraných zápasech srovná a silní hráči jsou nahore, slabší dole, to je v pořádku a takto to funguje "in real"; mj. i na eloratings.net (fotbalová / hokejová sekce, jsou to reálné výpočty zaznamenananých utkání.)

Jediné o co mi šlo, aby se v případě nového hráče nestal skutečně nějaký nesmysl, a neobral vysoce hodnoceného hráče protože je dobrý, ale zatím nic neodehrál nebo toho odehrál velmi málo a má nízký (defaultní ELO koeficient), jen já defaultně nastavuji na 1000.
Pak se stane, že velmi dobrý hráč má cca 1200-1300, slabší hráči mají kole 800-900.

Když tam naskočí nováček, u kterého nikdo neví jak hrát bude (může to být prank a naskočit tam profík), který dostane ELO 1000, vysekne ve 3 zápasech první tři ze špičky, tak by je hrozně obral o body.

Chtěl jsem tohle rozevření nůžek eliminovat a proto mě celé tohle vlákno utvrdilo v té mojí "tupé" myšlence, že pro prvních X zápasů u nového hráče to nebudu počítat podle ELO vzorce, ale nastavím si min-max rozsah, o které se bude hrát (třeba 1 - 15 bodů), které si odstupňuji rozdílem, proti komu hraje (na to bude stačit nějaká jednoduchá matematika, jen pro představu)

Hraje proti někomu kdo má
===
- 1200 bodů (max 15)
- 1100 (max 12)
- 1050 (max 10)
.
.
.
méně něž 1000 (1.2 body)

a tyhle body dostane jak on tak jeho již prověřený soupeř, který dle ELA hraje. (Stačí tahle jednoduchost s maximální hranicí www.matematica.pt/en/faq/direct-proportionality.php)

Tím nedojde k výkývům, pozná se jeho úroveň a po X zápasech mu už ELO výpočet dovolím.

Díky Juriade.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0