...

пятница, 2 сентября 2016 г.

Рейтинг ELO в играх для двух игроков

Раньше наш рабочий процесс прерывался из-за ряда неразрешенных вопросов:
  • А кто из нас лучше всех играет в настольный футбол?
  • С кем бы мне сейчас пойти поиграть?
  • Кого надо уволить, потому что он не работает а только играет?

Наш опыт решения данных вопросов с помощью системы рейтинга ELO будет рассмотрен в статье. А также ссылка на репозиторий и на сайт будут разбросаны по статье.

Когда компания маленькая, а игроков еще меньше, то вопрос лучшего решается простым проведением турнира в пятницу вечером раз в пару месяцев. <совет>Шикарнейший повод выпить за счет компании.</совет>(Мы по неопытности это не сразу поняли. И сначала просто так играли.) Но компания растет, лига тоже увеличивается, и вот уже отыграть турнир, даже с учетом предварительного разбиения на группы, становится очень сложно. Это просто физически тяжело на большом футбольном столе провести 15 партий за вечер.

На данном этапе опытные игроки в онлайн игры шахматисты подсказывают, что существует метод расчета относительной силы игроков ELO, которая как раз используется для оценки уровня шахматистов.

Про ELO


Разработал систему американский профессор физики и шахматист Арпад Эло.

Каждый новый игрок обычно получает рейтинг 1400. На самом деле не принципиально сколько. По итогам каждого матча часть рейтинга переходит от одного игрока к другому. И чтобы не уходить в минус берется изначально с запасом.

Будем считать, что игрок A в случае выигрыша получает 1 очко, в случае поражения — 0, а при ничьей — 0.5. Назовем эту переменную Sa.

Введем ожидаемое количество очков(Ea), которое игрок A получит за игру:

Ea = 1 / (1 + 10^((Rb-Ra)/400))

где Rb и Ra — это текущий рейтинг игроков B и A соответственно. Ea принадлежит интервалу (0, 1).

Коэффициенты подобраны таким образом, чтобы при разнице в рейтинге в 200 пунктов, ожидаемое количество очков равнялось приблизительно 0.75. Новый рейтинг игрока A считаем по формуле:

Ra’ = Ra + K * (Sa — Ea)

где K — коэффициент. Это максимальное количество пунктов рейтинга, который игрок может получить/потерять за одну игру. Обычно равняется 16. В ФИДЕ зависит от уровня игроков и варьируется от 10 до 30.

Аналогично считается рейтинг второго игрока Rb'.

Очевидно, что Ea + Eb = 1, Sa + Sb = 1 и следовательно Ra’ — Ra + Rb’ — Rb = 0, то есть у нас игра с нулевой суммой. Из формул видно, что сильный игрок за победу над слабым игроком получает меньше рейтинга, чем если слабый выиграет у сильного.

Мы рейтингом пользуемся уже около года. Отыграли более тысячи матчей. По моему субъективному мнению рейтинг отображает достаточно точно расстановку игроков в текущий момент времени. Как только кто-то в компании начинает играть лучше, например освоив удар, в течение недели занимает соответствующее место в рейтинге.

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

После введения рейтинга сильно изменилось поведение во время игры. Матчи стали зрелищней. Если раньше, пропустив пару мячей в начале, проще было уже слить этот матч и начать новый, то теперь есть стимул биться до конца, чтобы не потерять (или не подарить сопернику) очки рейтинга! Автор статьи недавно проигрывал 1:6. А выиграл 7:6. Это был жаркий матч.

Естественно, когда мы решили попробовать рейтинг, первым делом поискали готовые реализации. И хотя многие онлайн игры используют Elo, не нашли ничего толкового, где бы мы могли просто заносить результаты наших игр. Поэтому в пятницу вечером был накидан google-скрипт для google-доков.

Пол года назад захотелось посмотреть на Asp.Net Core в действии(тогда RC1 был). И объективно google-скрипта уже давно не хватало. А там как раз выходные были. В итоге появилась система рейтинга, которой мы успешно пользуемся до сих пор. Нам нравится. Мне точно, а остальные может боятся сознаться, что нет.

Я думаю будет правильным поделиться со всеми. Исходники доступны здесь.

Получилось что-то явно большее чем просто MVP. В том числе сейчас реализовано:

  • Подсчет рейтинга ELO;
  • Дополнительная статистика: соотношение побед, забито/пропущено, победы и поражения подряд;
  • Подсчет очков получаемых/теряемых в случае победы/поражения при игре с конкретным игроком в следующем матче. Надо же как-то планировать с кем лучше сейчас играть;
  • Импорт результатов матчей из csv. Это мы с google-скриптов переезжали;
  • Аутентификация с поддержкой OAuth. Пока только google, так как нам хватает. Но добавить еще какую систему несложно;
  • Упрощенная система прав доступа. Существует админ лиги с возможностью управлять лигой и просто игроки;
  • Приглашение новых пользователей. С уведомлением по емеил;
  • Раздельные лиги. Каждый пользователь может создать свою приватную лигу, которая будет видна только игрокам лиги;
  • Поддержка двух языков: английского и русского. У меня давнишние счеты с локализацией приложений. И сильно хотелось посмотреть как это реализовано в Asp.Net Core;
  • Адаптивный дизайн. Ничего сверх естественного. Просто Bootstrap. Чтобы удобно было заносить результаты с телефона;
  • Должно работать с выключенным JavaScript. Удобнее конечно с включенным. Но так как было желание посмотреть на некоторые фичи именно MVC, то получилось многостраничное приложение.

Во время разработки для хостинга я использовал Azure. Будучи уверенным, что потом спокойно перееду на какой-нибудь хостинг. Так уж и быть, даже оплачу его. И попытался переехать… Даже был морально готов заплатить баксов 50 в год за самый скромный вариант. Но когда я провозился сначала день с миграцией базы, а потом еще и не завелся проект, потому что хостер не очень-то готов к Asp.Net Core, вынужден был остаться на Azure. Но ценник там большой. А с другой стороны есть с чем сравнивать, Azure значительно удобнее.

Вспомнилась реклама на Хабре про хостинг Azure для стартапов. Почитал условия. Написал жалобное письмо на указанный емеил. И проект добавили в программу поддержки стартапов. Надеюсь, после статьи не исключат. Хотя я считаю, что проект всем требованиям удовлетворяет. В итоге, вопрос с хостингом теперь решен на 3 года! Так что если кто не хочет разворачивать проект локально, присоединяйтесь к нам, создавайте свою лигу. Экспериментально было установлено, что название не очень запоминающееся. Поэтому мы общим голосованием решили использовать learningstreet.ru.

Захватывающая история почему именно LearningStreet
Давным давно один наш коллега, верстая подпись к письму, написал в шутку адрес офиса как learning street 79 (Учебная улица). Мы посмеялись. А буквально день спустя я назвал ряд ребят «пацанами с которыми мы работаем»(в негативном контексте), а не друзьями. Слово за слово и вспомнилась цитата героя фильма Волк с Уолл-стрит: «это Уолл-стрит. Здесь нет друзей». Которая была модифицирована в «это Лёнинг-стрит. Здесь нет друзей». С тех пор, если кому-то кажется что мир к нему неоправданно жесток в пределах нашего офиса, мы вспоминаем про Лёнинг-стрит. То есть каждый день. Собственно в рейтинге по футболу у нас друзей тоже нет и пощады ждать не стоит.

Теоретически, если у кого есть идеи доменных имен подходящих для сайта, можно прикрутить. У меня как раз есть бонусы у одного из хостеров.

Ах да, чуть не забыл. Кого надо уволить? Судя по всему меня:

Комментарии (0)

    Let's block ads! (Why?)

    Комментариев нет:

    Отправить комментарий