Привет!
Последние недели как и вы я был обеспокоен аномальным ростом рейтинга у наших лидеров. Конечно, в первую очередь речь идет о tourist, рейтинг которого устремился просто в небеса.
Были даже комментарии из серии "я же говорил, что так и будет"
После первого раунда VK Cup 2016 я внимательно изучил причины подобного роста и обнаружил простой и банальный баг в формулах подсчета рейтинга. Забавно, что даже будучи опубликованным этот код не вызвал скепсиса. Посмотрите в эту функцию:
private double getSeed(List<Contestant> contestants, Contestant contestant, int rating) {
Contestant extraContestant = new Contestant(null, 0, 0, rating);
double result = 1;
for (Contestant other : contestants) {
result += getEloWinProbability(other, extraContestant);
}
return result;
}
Напомню, что эта функция вычисляла ожидаемое место участника, если бы его рейтинг был равен rating. Конечно, она не должна учитывать самого участника, кому мы в данный момент присвоили гипотетической значение рейтинга. Правильный код должен содержать проверку:
for (Contestant other : contestants) {
if (other != contestant) {
result += getEloWinProbability(other, extraContestant);
}
}
Этот баг приводил к тому, что занимая первое место tourist фактически побеждал одного очень серьезного противника. Себя самого. Это приводило к значительному росту его рейтинга, даже если первое место было довольно ожидаемым.
Хорошая новость состоит в том, что этот баг оказывал статистически значимый эффект лишь в очень редких случаях: когда победитель (или близкий к победителю участник) и так имел очень большой рейтинг (да-да, обратное для "антигероев" тоже верно). Если взять произвольный раунд и пересчитать рейтинг по исправленным формулам, то практически все участники получат в точности (или очень близкое) изменение рейтинга.
Посоветовавшись с tourist и Petr, я пришел с следующему плану действий:
- сегодня были хронологически пересчитаны все рейтинги от революции 2015-го года,
- если в изменение рейтинга по исправленным формулам отличалось от исторического изменения (по формулам с багом) не более чем на 3, то продолжало использоваться историческое изменение,
- если в изменение рейтинга по исправленным формулам отличалось от исторического изменения (по формулам с багом) более чем на 3, то в истории рейтингов изменение подменялось на правильное.
Оказалось, что практически на всех пользователей этот баг никак не повлиял. Баг задел только самый топ — и чем выше участник к топу, тем сильней оказалось влияние.
Я приношу извинения тем, кого пришлось опустить с небес на землю — но оставлять как есть, конечно, было нельзя. Топам же я желаю поднажать и вернуть те рейтинги, что были у вас до исправления формул.
М.
когда узнал, что MikeMirzayanov тоже ошибается!
Всем свойственно ошибаться, тем более код был в свободном доступе, баг мог найти любой)
Мне сейчас никто не поверит, но мы обсуждали это место, когда делали расширение. Решили не менять, так как цель была предсказать, что выдаст оригинальный алгоритм :)
"Работает — не трогай", верно? :)
:р
Haha, some time ago I thought about exactly such a hypothetical reason of why tourist rating is skyrocketing — "maybe tourist is gaining so much, because he is winning against tourist?". However my estimation of that being true times my laziness led me not to investigate it in more details :<.
Btw that "Yay :)" from my depicted comment above was my reaction to not allowing two person teams in online mirror of VK Cup :P.
This can also be easily fixed by initializing result = 0.5
TopCoder rating formulas
I wonder something was wrong ...
Now tourist challenges is more interesting.
So tourist was Chuck Norris of programming, who can beat himself.
In fact, every user defeated himself in every contest :P
As well as lost to himself in every contest.
Actually no :). Expected position was by 0.5 larger than it should be which corresponds to adding our virtual ghost and winning with it and fact that our ghost lost with us doesn't count for the real competitor as losing :).
So we all had a moment of Chuck Norris.
Interesting. How? If my contest standing is 3000, but I am expected to be near 1000, then I did not defeat myself, or did I? Wait, do I even understand any of this...
Apparently you don't understand.
We can both agree on that
Пересчитать, конечно, надо было. Но вот несколько смущает эта строка у Гены: 117 Чемпионат КРОК 2016 — Отборочный Раунд 2 6 -48 3534
Нормально, что за второе место -48?
У него разница в рейтинге с первым местом 370. Поэтому, вполне нормально.
Вроде же новый рейтинг зависит только от занятого места, а не распределения участников по местам?
Нет.
Just wondering, why is it 3, not 2 or 4?
And the LORD spake, saying, "First shalt thou take out the difference, then shalt thou compare the difference to three, no more, no less. Three shall be the number thou shalt use to compare, and the number for comparison shall be three. Four shalt thou not use, neither use thou two, excepting that thou then proceed to three. Five is right out"
It seems it effected my contribution, today I woke up and it was decreased by 2 =)) (just kidding)
affected*
^That's how you decrease your contribution points
By correcting a red coder
Тем временем какой-то чувак опечален тем, что по формулам с багом у него рейтинг 1898, а по формулам правильным — 1901.
P.S. Почему именно не более 3?:D
The rating value that appeared for some time yesterday (mentioned here) was the rating calculated by the corrected formulas?
No. Rating calculated by corrected formulas are current ratings :).
за 10 часов 500 плюсов , вы что все радуйтесь ?
Ну а почему не радоваться, ты же когда исправляешь баги в программе, наверно, тоже радуешься)
Думаю многие заметили проблемы с инфляцией в топе и хорошо, что ситуация исправлена. А то было бы как на Codechef: 1. uwi — 28726.1079, 20. karolis_kusas — 5772.0529, стартовый рейтинг — 1000.0.
P.S.: Хорошо если инфляции не будет вообще нигде, ведь граница красных на CF сначала была 2000, потом стала 2200, теперь 2400.
Зато на Codechef есть прекрасный формат контестов на 10 дней каждый месяц)
Я ничего не имею против Codechef. Раньше я там регулярно решал short-контесты и там очень хорошие задачи были (+ACM формат). Но по-моему рейтинг там выглядит очень странно.
У них есть странная "система бонусов" — помимо основных формул пересчета, после контеста участник получает дополнительно Number_of_contestants/Your_final_place баллов. Получается, что если участник более-менее топового уровня — для него именно эти бонусы выходят на первое место. И для хорошего места в рейтинге надо стабильно писать контесты без пропусков и фармить бонусы :)
Забавно не знал про это. Звучит очень странно. Это сделано для привлечения к регулярному участию?
Не знаю, надо у них спросить :) Наверное, большинство участников конкретно эта фича почти не затрагивает — если за первое место прилетает, допустим, 2к бонуса, то это заметно; а за какое-то 100ое в таком случае уже только 20 баллов.
Там в целом и у них, и у HackerRank — весь рейтинг это какая-то сплошная программа лояльности; он работает так, что в минус уйти сложно :) Контесты пишешь без тотальных сливов — рейтинг растет. Хотя в норме хотелось бы, чтобы рейтинг отображал результаты, а не активность/опыт. CodeChef вроде уже давно работают над новой системой рейтинга, но все никак ее не введут.
Представляю эмоции топов, когда они увидели изменения в своём рейтинге.