Блог пользователя MikeMirzayanov

Автор MikeMirzayanov, история, 8 лет назад, По-русски

Привет!

Последние недели как и вы я был обеспокоен аномальным ростом рейтинга у наших лидеров. Конечно, в первую очередь речь идет о 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, то в истории рейтингов изменение подменялось на правильное.

Оказалось, что практически на всех пользователей этот баг никак не повлиял. Баг задел только самый топ — и чем выше участник к топу, тем сильней оказалось влияние.

Я приношу извинения тем, кого пришлось опустить с небес на землю — но оставлять как есть, конечно, было нельзя. Топам же я желаю поднажать и вернуть те рейтинги, что были у вас до исправления формул.

М.

  • Проголосовать: нравится
  • +878
  • Проголосовать: не нравится

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +70 Проголосовать: не нравится

когда узнал, что MikeMirzayanov тоже ошибается!

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +37 Проголосовать: не нравится

    Всем свойственно ошибаться, тем более код был в свободном доступе, баг мог найти любой)

»
8 лет назад, # |
  Проголосовать: нравится +131 Проголосовать: не нравится

Мне сейчас никто не поверит, но мы обсуждали это место, когда делали расширение. Решили не менять, так как цель была предсказать, что выдаст оригинальный алгоритм :)

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +112 Проголосовать: не нравится

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.

»
8 лет назад, # |
  Проголосовать: нравится +20 Проголосовать: не нравится

This can also be easily fixed by initializing result = 0.5

TopCoder rating formulas

»
8 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

I wonder something was wrong ...
Now tourist challenges is more interesting.

»
8 лет назад, # |
  Проголосовать: нравится +182 Проголосовать: не нравится

So tourist was Chuck Norris of programming, who can beat himself.

»
8 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Пересчитать, конечно, надо было. Но вот несколько смущает эта строка у Гены: 117 Чемпионат КРОК 2016 — Отборочный Раунд 2 6 -48 3534

Нормально, что за второе место -48?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    У него разница в рейтинге с первым местом 370. Поэтому, вполне нормально.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится

      Вроде же новый рейтинг зависит только от занятого места, а не распределения участников по местам?

»
8 лет назад, # |
  Проголосовать: нравится +54 Проголосовать: не нравится

Just wondering, why is it 3, not 2 or 4?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +63 Проголосовать: не нравится

    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"

»
8 лет назад, # |
Rev. 3   Проголосовать: нравится +25 Проголосовать: не нравится

It seems it effected my contribution, today I woke up and it was decreased by 2 =)) (just kidding)

»
8 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Тем временем какой-то чувак опечален тем, что по формулам с багом у него рейтинг 1898, а по формулам правильным — 1901.
P.S. Почему именно не более 3?:D

»
8 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

The rating value that appeared for some time yesterday (mentioned here) was the rating calculated by the corrected formulas?

»
8 лет назад, # |
  Проголосовать: нравится -17 Проголосовать: не нравится

за 10 часов 500 плюсов , вы что все радуйтесь ?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +66 Проголосовать: не нравится

    Ну а почему не радоваться, ты же когда исправляешь баги в программе, наверно, тоже радуешься)

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +18 Проголосовать: не нравится

    Думаю многие заметили проблемы с инфляцией в топе и хорошо, что ситуация исправлена. А то было бы как на Codechef: 1. uwi — 28726.1079, 20. karolis_kusas — 5772.0529, стартовый рейтинг — 1000.0.

    P.S.: Хорошо если инфляции не будет вообще нигде, ведь граница красных на CF сначала была 2000, потом стала 2200, теперь 2400.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      Зато на Codechef есть прекрасный формат контестов на 10 дней каждый месяц)

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится +20 Проголосовать: не нравится

        Я ничего не имею против Codechef. Раньше я там регулярно решал short-контесты и там очень хорошие задачи были (+ACM формат). Но по-моему рейтинг там выглядит очень странно.

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится

          У них есть странная "система бонусов" — помимо основных формул пересчета, после контеста участник получает дополнительно Number_of_contestants/Your_final_place баллов. Получается, что если участник более-менее топового уровня — для него именно эти бонусы выходят на первое место. И для хорошего места в рейтинге надо стабильно писать контесты без пропусков и фармить бонусы :)

          • »
            »
            »
            »
            »
            »
            8 лет назад, # ^ |
              Проголосовать: нравится +10 Проголосовать: не нравится

            Забавно не знал про это. Звучит очень странно. Это сделано для привлечения к регулярному участию?

            • »
              »
              »
              »
              »
              »
              »
              8 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится

              Не знаю, надо у них спросить :) Наверное, большинство участников конкретно эта фича почти не затрагивает — если за первое место прилетает, допустим, 2к бонуса, то это заметно; а за какое-то 100ое в таком случае уже только 20 баллов.

              Там в целом и у них, и у HackerRank — весь рейтинг это какая-то сплошная программа лояльности; он работает так, что в минус уйти сложно :) Контесты пишешь без тотальных сливов — рейтинг растет. Хотя в норме хотелось бы, чтобы рейтинг отображал результаты, а не активность/опыт. CodeChef вроде уже давно работают над новой системой рейтинга, но все никак ее не введут.

»
8 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

Представляю эмоции топов, когда они увидели изменения в своём рейтинге.

»
8 лет назад, # |
  Проголосовать: нравится +59 Проголосовать: не нравится