В Батуми, где я обитаю последние 2 года, очень популярен настольный теннис. Субтропический климат способствует тому, что теннисные столы стоят прямо на бульваре, являясь точкой привлечения как проходящих мимо туристов, так и местных.
Однако у массовости и популярности есть своя отрицательная сторона: в итоге становится сложно найти себе соперника «по руке», чтоб обоим было интересно играть. Мы пробовали разные способы: описывали свои навыки, использовали разные системы оценок, характеризуя свой уровень… Увы, начинающие склонны себя перехваливать, а опытные игроки – недооценивать.
В итоге возникла идея создания рейтингового бота, благо API Telegram предоставляет широкие возможности для этого.
В этой статье я не буду рассказывать про особенности технической реализации. Если появится интерес, потом могу отдельно расписать. Хочу рассказать про то, как пытался вначале «натянуть на глобус» рейтинговую систему Russian table tennis forum</p>" data-abbr="RTTF">RTTF (она же TTW, с минимальными отличиями), а в итоге взял на вооружение систему Эло, которая используется в шахматах.
Постановка задачи
Цель для бота была простая: сделать возможность расчёта рейтинга при регистрации обычных уличных игр, а не только официальных турниров. Т.е. договорился с кем-нибудь поиграть на рейтинг, зарегистрировал результат игры – получил рейтинг.
Первые попытки
Вначале не было сомнений в том, чтоб использовать популярные и проверенные временем формулы. Формула RTTF среди остальных вариантов (TTW, <a href="http://ttfr.ru/rus/rating/">Федерация настольного тенниса России</a></p>" data-abbr="ФНТР">ФНТР) показалась самой продуманной, поэтому именно её начал обкатывать на тестовых сценариях. И буквально сразу столкнулся с определённым сложностями, после которых едва не опустил руки:
Формула RTTF подразумевает турнирный формат. Т.е. серия матчей до 2-3 побед. Ничьей быть не может. В то время как «на улице» играют, как придётся. Могут и сериями, а могут и 15:3 выдать. Или ничью.
Начальный рейтинг новичкам выставляется вручную организатором турнира. Нам же нужна полная автономность.
Формула RTTF хорошо работает только для игроков примерно одного уровня. Если разница в рейтинге победителя и проигравшего составляет более 100 очков (один спортивный разряд), то рейтинг не меняется. В результате, если игроки разных уровней играют вместе, рейтинг может застрять на одном уровне.
В итоге пришлось отказаться от классического варианта и искать что-то другое. А именно -- рейтинг Эло, который давно и относительно успешно используется в шахматах. Относительно – потому что там тоже пришлось использовать определённые костыли для борьбы с накруткой. Тем не менее этот рейтинг больше приспособлен для расчёта рейтинга по парным встречам, нежели рейтинги RTTF-подобной формулы.
Ниже я приведу основные тестовые сценарии для понимания разницы между этими рейтинговыми системами. Если кто готов поверить мне на слово, можете сразу перейти к "Окончательному выводу" в конце статьи.
Ничья
В турнире такая ситуация невозможна, на улице же встречается нередко (когда играют, ограничиваясь доступным временем, или когда при почти равной игре предлагают сыграть «самую последнюю, самую решающую партию»).
Если бы мы использовали рейтинг RTTF, то разумнее всего было бы вернуть 0 прироста рейтинга, потому что эта формула вообще не учитывает подобные варианты. В то время как Эло легко справляется с подобными случаями без всяких дополнительных костылей.
Игрок 1, рейтинг 1400 (соответствует 3-му разряду)
Игрок 2, рейтинг 1800 (соответствует 1-му разряду)
Счёт 1:1
Результат:
Игрок 1, рейтинг 1416 [+16]
Игрок 2, рейтинг 1784 [-16]
Анализ
Обратите внимание на момент, который всегда возмущал (и будет возмущать) игроков, привыкших к RTTF-подобной рейтинговой системе: два игрока сыграли с равным результатом, однако один из них в итоге потерял очки рейтинга. Хуже того, забегая вперёд, скажу, что потерять очки рейтинга можно, даже выиграв. :)
Тем не менее в этом есть логика: если перворазрядник не смог уверенно обыграть третьеразрядника, то действительно ли он на своём месте в рейтинге? Эло корректирует рейтинг обоих игроков в зависимости от результата игры. За счёт этого рейтинг по Эло можно считать гораздо более точным, нежели RTTF-подобный рейтинг, где неважно, как именно ты выиграл, главное, что выиграл.
Вывод
На «улице» ничья – нередкий результат дружеских встреч. В отличие от Эло, RTTF такие результаты считать не умеет.
Одиночные игры, разница в 1 разряд
Проверять будем на игроках с рейтингом 1600 Эло (соответствует 450 RTTF) и 1400 Эло (350 RTTF). Это как раз границы третьего разряда, т.е. играет начинающий второй разряд с начинающим третьим.
Счёт | Эло | RTTF | Комментарий |
1:0 | 1602 (+2) : 1398 (-2) | 450 (0) : 350 (0) |
|
2:0 | 1605 (+5) : 1395 (-5) | 450 (0) : 350 (0) |
|
3:0 | 1607 (+7) : 1393 (-7) | 450 (0) : 350 (0) |
|
4:0 | 1609 (+9) : 1391 (-9) | 450 (0) : 350 (0) |
|
5:0 | 1612 (+12) : 1388 (-12) | 450 (0) : 350 (0) |
|
3:1 | 1600 (0) : 1400 (0) | 450 (0) : 350 (0) | Эло: ожидаемый результат встречи, нет изменения рейтинга |
3:2 | 1592 (-8) : 1408 (+8) | 450 (0) : 350 (0) | Эло: слабый игрок взял больше сетов, чем прогнозировалось – прирост рейтинга |
Анализ
В RTTF всё просто: разница между игроками составляет 100 очков, прироста рейтинга нет. К слову сказать, при 99 очках разницы никакого заметного изменения рейтинга тоже не будет.
В Эло, как можно видеть, есть изменение рейтинга в зависимости от счёта. Нужно ещё отметить два любопытных момента:
при счёте 3:1 изменения рейтинга нет, потому что это ожидаемый результат встречи игроков с такой разницей уровня;
при счёте 3:2 более сильный игрок, несмотря на итоговую победу, теряет рейтинг. Потому что либо он играл хуже, чем ожидалось, либо его соперник играл лучше, чем ожидалось от его уровня.
Вывод
При игре с заведомо сильным или слабым соперником RTTF-подобный рейтинг меняться не будет. Для него нужны игроки примерно равного уровня, что реально при организации турниров, но слабо применимо в обычных встречах.
В то же время как Эло не только откорректирует рейтинг по результатам встречи, но ещё и заставит более сильного игрока играть всерьёз, чтоб не потерять рейтинг из‑за самоуверенности в случае слива случайного сета.
Одиночные игры, разница в ½ разряда
Учитывая особенности RTTF формулы, попробуем сравнить игроков в пределах одного разряда. Пусть это будет рейтингом 1500 Эло (соответствует 400 RTTF) и 1400 Эло (350 RTTF), сильный третий разряд с начинающим третьим разрядом.
Счёт | Эло | RTTF | Комментарий |
1:0 | 1504 (+4) : 1396 (-4) | 401,2 (+1,2) : 349,4 (-0,6) |
|
2:0 | 1507 (+7) : 1393 (-7) | 401,5 (+1,5) : 349,25 (-0,75) |
|
3:0 | 1511 (+11) : 1389 (-11) | 401,8 (+1,8) : 349,1 (-0,9) | Максимальный прирост относительно разряда: 1,8% RTTF, 5,5% Эло |
4:0 | 1514 (+14) : 1386 (-14) | 401,8 (+1,8) : 349,1 (-0,9) |
|
5:0 | 1517 (+17) : 1383 (-17) | 401,8 (+1,8) : 349,1 (-0,9) |
|
3:1 | 1504 (+4) : 1396 (-4) | 401,5 (+1,5) : 349,25 (-0,75) |
|
3:2 | 1498 (-2) : 1402 (+2) | 401,2 (+1,2) : 349,4 (-0,6) |
|
0:1 | 1494 (-6) : 1406 (+6) | 398,2 (-1,8) : 353,6 (+3,6) |
|
0:2 | 1487 (-13) : 1413 (+13) | 397,75 (-2,25) : 354,5 (+4,5) |
|
0:3 | 1481 (-19) : 1419 (+19) | 397,3 (-2,7) : 355,4 (+5,4) | Максимальный прирост относительно разряда: 5,4% RTTF, 9,5% Эло |
Анализ
Преимущество RTTF формулы над ФНТР или TTW в том, что она учитывает разницу в сетах, что заметно по первым трём играм в таблице. Однако дальше рост не идёт, подразумевается, что вместо 4:0 должны регистрироваться две игры со счётом 2:0, 2:0. Как правильно сделать такое разбиение при регистрации «уличного» счёта – непонятно. К примеру, счёт 4:2 ведь можно разложить как 2:1, 2:1, так и 2:0, 2:0, 0:2.
Ещё можно отметить более активное изменение рейтинга Эло. Впрочем, непонятно, хорошо это или плохо, в любом случае это легко можно откорректировать коэффициентами.
Вывод
Сказать, что какая-то формула тут проявила себя лучше, нельзя. Каждая по-своему хороша.
Читер против обычного игрока
Пришла пора перейти к анализу ситуаций с возможным читерством. От этого никуда не деться и, хотя бот сейчас отказывается работать в чатах, где меньше 20 участников, тем не менее вполне реально возникновение игрока, который на фейковых аккаунтах накрутит себе рейтинг уровня мастера спорта.
Давайте проверим, что такой игрок сможет продемонстрировать при встрече с реальным соперником, который его обыграет со счётом, скажем, 3:0. Пусть у читера будет рейтинг 2000 Эло (750 RTTF), а у обычного игрока рейтинг 1200 (250).
Количество встреч | Эло | RTTF |
1 | 1955 (-45) : 1249 (+49) | 737,4 (-12,6) : 275,2 (+25,2) |
2 | 1910 (-90) : 1298 (+98) | 725,2 (-24,8) : 298,6 (+48,6) |
3 | 1865 (-135) : 1346 (+146) | 713,9 (-36,1) : 320,1 (+70,1) |
5 | 1776 (-224) : 1437 (+237) | 692,3 (-57,7) : 359,4 (+109,4) |
10 | 1613 (-387) : 1600 (+400) | 650 (-100) : 437 (+187) |
Аналогично посмотрим на результаты встреч с таким же уровнем: «КМС» против настоящего КМС.
Количество встреч | Эло | RTTF |
1 | 1985 (-15) : 2015 (+15) | 747,6 (-2,4) : 754,8 (+4,8) |
2 | 1972 (-28) : 2028 (+28) | 744,8 (-5,2) : 758,5 (+3,5) |
3 | 1960 (-40) : 2040 (+40) | 741,9 (-8,1) : 762,1 (+12,1) |
5 | 1938 (-62) : 2062 (+62) | 737,2 (-12,8) : 768,6 (+18,6) |
10 | 1896 (-104) : 2104 (+104) | 727,8 (-22,2) : 780,4 (+30,4) |
Анализ
В обоих случаях результаты почти идентичны. Да, Эло быстрее скорректировала рейтинг, но это легко меняется соответствующими коэффициентами.
Вывод
Обе формулы хорошо отработали варианты встречи читера и обычного игрока. Сколько бы фейковых побед ты не зарегистрировал, встреча с живыми игроками быстро всё поставит на место, буквально за один турнир.
Окончательный вывод
При одинаковых уровнях (в пределах одного спортивного разряда) обе формулы ведут себя хорошо, показывают схожие результаты. Однако дальше у RTTF начинаются минусы:
1. Строгая привязка к турнирному формату – необходимо место, время, люди.
2. Бесполезность при игре разных уровней (отличающихся на разряд и больше).
3. Затруднительно автоматически выставить начальный рейтинг (посев).
4. Сложности с пересчётом рейтинга по произвольному счёту, включая ничью (3:12, 5:5).
Вердикт: шахматисты победили теннисистов. :)
P. S. Бот для настольного тенниса: @tt_rating_bot, аббревиатура рейтинга Table tennis Amateur Rating</p>" data-abbr="TTAR">TTAR. За короткое время существования (меньше года в разработке) и без какого‑либо внятного продвижения в нём уже зарегистрировано больше 4000 игр.
Бот для тенниса (большого): @TennisRatingBot (Tennis Amateur Rating</p>" data-abbr="TAR">TAR), пока им никто не пользуется.
Бот для шахматного рейтинга: @chess_rating_bot. Необходимость сомнительна, делал по просьбе одного гроссмейстера.