Исследование рейтингов
Введение
Скачать имитатор.
Данное исследование посвящено сравнительному анализу 6 рейтинговых систем, 4 из которых в настоящее время используются в Лиге. В это число входят рейтинги Лиги, Соло-Зерга (СЗ), R2, КД, и 2 новинки (для нас) – шахматный рейтинг Эло и вне зачёта его модификация – Глико (подробнее о том, почему вне зачёта, позже).
Чтобы не терять время, запустите сначала программу imitator.exe, а потом программу imitator4.exe (на P4 3GHz расчёт первой программой занимает 8 минут, второй – 26, до конца работы программа должна вывести на экран 80 точек). Во время работы программ читайте эту статью (по завершении работы программа подаст звуковой сигнал). Не обращайте внимание на сообщения «Не найден файл…», просто программы вначале своей работы пытаются удалить файлы с результатами предыдущих запусков. Программы используют датчик случайных чисел, поэтому результаты разных запусков будут незначительно различаться, но тенденция и картина в целом всегда будут хорошо видны, а выводы из результатов моделирования можно будет сделать всегда одни и те же. Это доказывает корректность построенной модели и собственно процесса моделирования. Так что позапускайте программы несколько раз, результаты будут немножко разные, но зрелище будет всегда неизменно завораживающее.
Как проводилось исследование? Очевидно, что не путём программирования обсчёта рейтингов по разным системам с последующим натравливанием этого зверинца на базу боёв Лиги. Результаты такого исследования невозможно было бы вразумительно интерпретировать (в том числе и из-за малого числа боёв). Действительно, что нам с того, что у Петрова (пусть даже всеми уважаемого и всем известного игрока) получилось Х очков по системе S, а у не менее уважаемого игрока Иванова получилось Y очков по той же системе? Означает ли это, что рассматриваемая рейтинговая система S адекватна? Ответа у меня нет, потому как абсолютно точную силу игры Иванова и Петрова мы не знаем, а следовательно и не можем сравнить её с полученной по системе для проверки её адекватности. Более того, мало просто отмерить силу каждого в неких попугаях, важно ещё иметь механизм, который сможет в каждом конкретном случае выводить из разницы в попугаях вероятность выигрыша/проигрыша, соответствующую этой разнице (при встрече этих игроков).
Для работы с исходными текстами программы и собственноручной проверки результатов и ли модификации программы воспользуйтесь усечённой консольной версией компилятора Visual C++ 5.0. В архиве меньше 10 мегабайт. Скачать можно по ссылке http://stream.ifolder.ru/1136848 .
Описание модели
Для проведения исследования была построена имитационная модель. Программа-имитатор моделирует игры между игроками некоторой замкнутой группы и обсчитывает результаты игр по всем рейтинговым системам. Каждый игрок обладает следующими характеристиками:
- «помнит» свои рейтинги и значения вспомогательных коэффициентов (например, Kусп для R2 или RD для Глико) по всем системам;
- «помнит» общее число своих игр, побед, поражений;
- имеет силу игры;
- имеет частоту «играния»;
- обладает условным именем вида сила_игры-частота_игры (для удобства отображения в расчетных таблицах).
Каждый игрок в терминах данных – это структура, а все игроки модели – массив структур.
Сила игрока может принимать 7 дискретных значений: 10, 20, 40, 80, 160, 320, 640. Большой диапазон добавляет реализма и позволяет проверить реальную способность рейтингов сортировать игроков по их силе. Естественно, мы исходим из того, что сила наших «игроков» на протяжении всего эксперимента не меняется. Если брать силу игроков не кратную степеням двойки, то процесс упорядочивания занимает больше времени (это справедливо для всех рейтингов).
Частота игры игрока может принимать 5 дискретных значений: 10, 20, 40, 80, 160.
Таким образом у нас возможно 7*5=35 различных сочетаний основных характеристик игроков. 35 игроков с разными сочетаниями силы и частоты игры назовём группой. Для массовости и реализма в нашем исследовании примут участие 4 таких группы игроков, то есть 140 «человек». Количество вполне адекватное, не 5 человек, но и не миллионы, нам нет нужды моделировать такие толпы, тем более что это потребует либо очень больших вычислительных ресурсов, либо очень много времени.
Как же происходит само моделирование? Моделирование состоит из последовательного обсчёта по всем рейтингам и обработки результатов игр между игроками. В каждой игре случайным образом отбираем первого партнёра из всего массива. Если частота игры игрока, предположим 40, то берём случайное число в интервале от 0 до 160 (максимальное значения частоты игры) и смотрим, попало ли оно в интервал от 0 до 40. Если да, то отобранный первый партнёр примет участие в поединке. Не попало, аналогичным образом выбираем другого. Таким способом мы моделируем частоту «играния». Выбор любого из толпы равновероятен, а вот принятие участия в поединке зависит от частоты игры. Второй партнёр подбирается аналогично первому, дополнительным условием является лишь то, чтобы он и первый партнёр не были одним и тем же «лицом».
Далее сама игра. Необходимо определить победителя и проигравшего. Для этого сначала складываем значения силы игры партнёров. Например, 80+160=240 (суммарная сила). После этого берём случайное число в интервале от 0 до значения суммарной силы, в нашем случае от 0 до 240, и смотрим, в чей подинтервал оно попало. Если от 0 до 80, то победил первый игрок, если от 80 до 240, то второй. Надеюсь, принцип понятен. Потом обсчитываем результаты по всем системам и, отсортировав всех по всем рейтингам, делаем, при необходимости, нормализацию (для СЗ и R2). Пишем обсчёт каждого боя в лог-файл, а отсортированные по рейтингу таблицы игроков после каждой тысячи игр в отдельные файлы (для каждой рейтинговой системы).
Описание рейтингов
Для краткости привожу кусочки псевдокода, они просты и понятны любому и позволят избежать много ненужных слов. Также приводятся примеры расчёта результатов нескольких поединков (в формате: рейтинг победителя, проигравшего, и соответственно, изменения рейтингов). Для незнакомых с синтаксисом c++ поясняю, что «a+=b;» эквивалентно «a=a+b;» (аналогично с вычитанием, делением и умножением).
Расчёты в примерах производились вручную, могут быть опечатки и ошибки. Проверка правильности работы программы может быть выполнена путём просмотра и анализа лога, там подробные расчеты каждого боя по всем системам. Также следует учитывать, что описания систем на сайте Лиги в некоторых моментах неточны. Иногда я допускал непринципиальные отступления от описания, которые, безусловно, не могут в целом повлиять на оценку системы. Лион не даст соврать, некоторые неточности в исследовании он уже выявил и указал мне на них.
Описание Лиги
r1-рейтинг проигравшего, r2-рейтинг победителя, реализован как целочисленный рейтинг, начальное значение 750.
bonus=r1-r2;
if(bonus>500) bonus=500;
if(bonus<-500) bonus=-500;
bonus=bonus/25+30;
r1-=bonus;
r2+=bonus+10;
Примеры расчёта (слева победитель, результат приведён в виде дельты):
1500vs2500=>+60,-50;
1500vs2000=>+60,-50;
1500vs1500=>+40,-30;
2000vs1500=>+20,-10;
2500vs1500=>+20,-10;
В качестве особенностей системы надо отметить поощрение побед слабых над сильными (соответственно большие штрафы за проигрыш сильного слабому), довольно большое вознаграждение за победу над слабым и умеренное поощрение боёв равных. Значения может колебаться в практически неограниченном диапазоне (при большом числе игр), то есть рейтинг расходящийся (подробнее поговорим об этом позже).
Описание Соло-Зерга
r1-рейтинг проигравшего, r2-рейтинг победителя, рейтинг с плавающей точкой, начальное значение 1000.
bonus=100-pow(abs(r1-r2),0.6652);
if(bonus<0) bonus=0;
r1-=bonus;
if(r1<1000.0) r1=1000.0;
r2+=bonus;
При превышении одним из игроков 3000 происходит нормализация, то есть рейтинг каждого игрока умножается на 0.75, при этом учитывается, что рейтинг не может стать меньше 1000.
Примеры расчёта (слева победитель, результат приведён в виде дельты):
1500vs2500=>+1.0,-1.0;
1500vs2000=>+37.5,-37.5;
1500vs1500=>+100.0,-100.0;
2000vs1500=>+37.5,-37.5;
2500vs1500=>+1.0,-1.0;
В качестве особенности системы отмечу максимальное поощрение боёв равных. При разнице более чем в тысячу очков бонус становится нулевым, а бой соответственно – «учебным».
Описание R2
r1-рейтинг проигравшего, r2-рейтинг победителя, Kusp1-коэффициент успешности проигравшего, Kusp2-коэффициент успешности победителя, рейтинг с плавающей точкой, начальное значение рейтинга 1000, Kusp=1.0. Убрана визуальность, то есть значение рейтинга колеблется в диапазоне 1000-3000.
delta=abs(r1*Kusp1-r2*Kusp2)/10.0;
if(delta>99.0)
delta=99.0;
bonus=100.0-delta;
if(r2*Kusp2>r1*Kusp1)
Kres=1+bonus/(2.0*1000.0);
else
Kres=1+(100+delta)/(2.0*1000.0);
r2+=bonus;
r1-=bonus;
Kusp2*=Kres;
if(Kusp2>1.27)
{
r2*=(Kusp2-0.27);
Kusp2=1.27;
}
Kusp1/=Kres;
if(Kusp1<0.79)
{
r1/=(1.79-Kusp1);
Kusp1=0.79;
}
if(r1<1000.0)
r1=1000.0;
При превышении одним из игроков 3000 происходит нормализация, то есть рейтинг каждого игрока умножается на 0.8, при этом учитывается, что рейтинг не может стать меньше 1000.
Примеры расчёта (слева победитель, формат: r2 (Kusp2) vs r1 (Kusp1) => delta r2 (Kusp2) vs delta r1 (Kusp1)) (точность до 4-го знака):
1500(1.0000)vs2500(1.0000)=>+1.0000(1.0995)vs-1.0000(0.9095);
1500(1.2000)vs2000(0.8000)=>+80.0000(1.2480)vs-119.0656(0.7900);
1500(1.0000)vs1500(1.0000)=>+100.0000(1.0500)vs-100.0000(0.9524);
2000(1.0000)vs1500(1.0000)=>+50.0000(1.0250)vs-50.0000(0.9756);
2500(1.0000)vs1500(1.0000)=>+1.0000(1.0005)vs-1.0000(0.9995);
Система является доработанным СЗ. Доработка свелась к добавлению механизма, позволяющего во многих случаях увеличить (по сравнению с СЗ) бонус за поединок. Это достигается за счёт учёта тенденции (не)успешности серии последних игр игрока.
Описание КД
r1-рейтинг проигравшего, r2-рейтинг победителя, рейтинг с плавающей точкой, начальное значение 15.0, так как рейтинг не в очках, а в процентах.
sb=2.0;
s=sb*(r1+sb)/(r2+sb);
for(i=0;i<1000;i++)
{
r1-=(r1/100.0)*s/1000.0;
r2+=(1-(r2/100.0))*s/1000.0;
}
Система гарантирует, что рейтинг не может превысить 100.0.
Примеры расчёта (слева победитель, результат приведён в виде дельты):
15vs15=>+1.68,-0.29;
35vs35=>+1.28,-0.69;
60vs60=>+0.79,-1.19;
80v80s=>+0.39,-1.59;
10vs80=>+11.49,-10.22;
10vs60=>+8.83,-5.90;
20vs40=>+2.99,-1.50;
70vs30=>+0.26,-0.26;
60vs20=>+0.28,-0.15;
Честно говоря, я не уловил физического смысла и стройной теории в порядке начисления рейтинга в данной системе. Математический аппарат есть, а для чего он нужен, я не понял, подскажите, если знаете. В качестве особенности системы отмечу, что это не расходящийся рейтинг, то есть он не требует нормализации. Значения рейтинга гарантированно лежат в пределах 0-100.
Описание Эло
Ниже, курсивом, моя редакция описания рейтинга Эло, начальный текст которого я скачал из Интернета.
Арпад Эло был квалифицированным, на уровне мастера, шахматистом и активно работал в Шахматной Федерации США со времени её основания в 1939 году. Шахматная Федерация США применяла цифровую систему для обсчёта рейтингов, которые позволяли следить за прогрессом шахматистов. Но эта система была несовершенной и иногда приводила к необоснованному росту рейтингов. По поручению Шахматной Федерации США, профессор Эло разработал новую систему на статистической основе.
Система рейтингов Эло была предложена шахматной федерацией США в 1960 году и была принята ФИДЕ в 1970 году.
В шахматах рейтинг Эло вычисляется по результатам игр шахматистов друг с другом. Система рейтингов Эло делит шахматистов на девять классов; высший класс начинается с рейтинга 2600, низший класс соответствует рейтингу 1200 и меньше.
Примерное соответствие рейтингов Эло и шахматных званий и разрядов:
более 2.700=(международный) Гроссмейстер, претендующий на звание «Чемпион мира по шахматам»;
2.500-2.699=Гроссмейстер;
2.400-2.499=Международный мастер;
2.200-2.399=Национальный мастер;
2.000-2.199=Кандидат в мастера;
1.800-1.999=1-й разряд;
1.600-1.799=2-й разряд;
1.400-1.599=3-ий разряд;
1.200-1.399=Средний любитель (4-й разряд);
1.000-1.199=Слабый любитель (5-й разряд);
менее 1.000=Новичок.
В системе рейтингов Эло принято, что переход от одного класса игры к следующему происходит примерно через 200 пунктов рейтинга. Если различие между двумя игроками составляет 200 пунктов, то сильнейший игрок выигрывает с вероятностью 75%, если различие составляет 400 пунктов, то та же вероятность будет 91%. Различие в 600 пунктов, означает, что сильнейший игрок выигрывает, практически, всегда, а именно в 97% случаев. В случае, когда рейтинги обоих игроков равны, вероятность победы одного из них равна 50%. Хотя, сила игрока, конечно, зависит и от состояния игрока, а именно, его физических кондиций, настроения, мотивации и его спортивной формы.
Важно, если шахматист может подтвердить свой рейтинг в играх с более сильными игроками. Чем меньше проигрывает шахматист, тем точнее можно оценить его рейтинг. Наиболее точно рейтинг можно получить на основе турниров, в которых играют примерно равные по силам игроки. В основе системы рейтингов Эло лежит допущение, что сила каждого шахматиста, в каждой игре, есть вероятностная переменная, подчиняющаяся нормальному распределению. Хотя сила игрока может изменяться от игры к игре, в системе Эло предполагается, что сила игрока с течением времени изменяется медленно. Шахматная сила игрока - величина неабсолютная, она оценивается относительно, только по результатам его игр с другими шахматистами.
Теперь описание реализации Эло в имитаторе.
r1-рейтинг проигравшего, r2-рейтинг победителя, рейтинг с плавающей точкой (я так реализовал специально, отличие непринципиально), K1-коэффициент проигравшего, K2-коэффициент победителя (зависят от рейтингов игроков до поединка), начальное значение 1000.
e1-ожидаемое количество очков, которое игрок1 наберёт против игрока2, или если домножить e1 на 100%, то получим вероятность победы игрока1 над игроком2.
e2-ожидаемое количество очков, которое игрок2 наберёт против игрока1, или если домножить e2 на 100%, то получим вероятность победы игрока2 над игроком1.
e1=1.0/(1.0+pow(10.0,(r2-r1)/400.0));
e2=1.0/(1.0+pow(10.0,(r1-r2)/400.0));
//pow(p1,p2) – это функция возведения p1 в степень p2.
K1=GetK(r1);
K2=GetK(r2);
r1=r1+K1*(0.0-e1);
//«0.0»-это количество фактически набранных очков (r1-рейтинг проигравшего!)
r2=r2+K2*(1.0-e2);
//«1.0»-это количество фактически набранных очков (r2-рейтинг победителя!)
//дальше функция вычисления коэффициента
GetK(r)
{
if(r<1000)
return(25);
if(r>=1000&&r<2400)
return(15);
return(10);
}
Примеры расчёта (слева победитель, формат: r2,r1=e2,e1=K2,K1=>delta r2,delta r1) (обращайте внимание на K):
750,750=0.50,0.50=25,25=>+12.50,-12.50;
1000,1000=0.50,0.50=15,15=>+7.50,-7.50;
1500,1500=0.50,0.50=15,15=>+7.50,-7.50;
2500,2500=0.50,0.50=10,10=>+5.00,-5.00;
700,1100=0.09,0.91=25,15=>+22.73,-13.64
1100,700=0.91,0.09=15,25=>+1.36,-2.27;
1200,1400=0.24,0.76=15,15=>+11.40,-11.40;
1400,1200=0.76,0.24=15,15=>+3.60,-3.60;
1000,1600=0.03,0.97=15,15=>+14.54,-14.54;
1600,1000=0.97,0.03=15,15=>+0.46,-0.46;
2100,2200=0.36,0.64=15,15=>+9.60,-9.60;
2200,2100=0.64,0.36=15,15=>+5.40,-5.40;
900,2500=0.00,1.00=25,10=>+25.00,-10.00;
2500,900=1.00,0.00=10,25=>+0.0010,-0.0025;
Это не расходящийся рейтинг, то есть он не требует нормализации.
Обратите внимание, что в получаемых имитатором таблицах Эло разница в рейтинге игроков прекрасно кореллирует с их силой относительно друг друга, в соответствии с принципами самого рейтинга Эло.
Описание Глико
Ниже, курсивом, моя редакция описания рейтинга Глико, начальный текст которого я скачал из Интернета.
В 1995 году, с целью исправления недостатков рейтинга Эло, была создана система ранжирования Глико. Система получена путем рассмотрения статистической модели исходов шахматных игр, и принятия затем ряда математических приближений. Система Эло является одним из специальных случаев системы Глико. Математические детали могут быть найдены в статье под названием «Оценка параметра в больших экспериментах попарных сравнений», выдержки из которой были опубликованы в статистическом журнале «Прикладная Статистика», или по адресу http://math.bu.edu/people/mg/research.html. Система Глико применяется в настоящий момент на свободном интернетовском шахматном сервере (FICS), а вариации системы Глико были приспособлены для нескольких коммерческих интернетовских игровых организаций, таких как ChronX, Case's Ladder и других.
Проблема системы Эло, которую исправляет система Глико, это достоверность рейтинга игрока. Предположим, что два игрока, оба с коэффициентом Эло в 1700, встречаются. По версии Американской Шахматной Федерации системы Эло один игрок получит в этом случае 16 рейтинговых очков, а другой игрок потеряет те же 16 очков. Но предположим, что один из игроков только что вернулся к играм на турнирах после многих лет «отдыха», а другой игрок режется в шахматы каждый выходной. В этой ситуации рейтинг первого игрока в 1700 очков является не совсем достоверным отражением его силы, в то время как рейтинг второго игрока в 1700 является вполне реальным отображением его игрового мастерства.
Итак, (1) рейтинг первого игрока должен измениться намного (больше 16-ти очков), поскольку его рейтинг не совсем реален, и (2) рейтинг второго игрока должен немного измениться (менее 16-ти очков), поскольку про его рейтинг и так уже известно, что: а) он находится в районе 1700; б) он сыграл с игроком, чей рейтинг не заслуживает доверия, и потому о его собственной игровой силе могут быть сделаны лишь небольшие догадки.
Потому-то система Глико и превосходит систему Эло, что вычисляет не только рейтинг R, который может быть представлен, как "наилучшая догадка" о чьей-либо игровой силе, но и "рейтинговое отклонение" (RD) (в статистической терминологии, стандартное отклонение), которое измеряет неопределенность рейтинга. Высокие RD отвечают ненадежным рейтингам, указывая, что игрок выступает не часто или что игрок участвовал лишь в небольшом количестве игр. Низкий RD указывает на то, что игрок постоянно играет.
В системе Глико игровой рейтинг изменяется только по прошествии игр, но его RD изменяется и после окончания игры, и по прошествии времени, в течение которого игрок не принимал участия в турнирах. Одним из свойств Глико является то, что сыгранные матчи всегда уменьшают RD игрока, а время, проведенное вне турниров, всегда его увеличивает. Смысл этого заключается в том, что чем больше сыграно игр, тем больше информации о способностях игрока получено, и тем точнее становится рейтинг. С прошествием времени мы начинаем сомневаться в силе игрока, и это находит свое отражение в возрастании RD.
Обратите внимание, что в системе Глико изменения в рейтинге не столь сбалансированы, как это есть в системе Эло. Если рейтинг одного игрока возрос на x очков, то совсем необязательно, что рейтинг его соперника уменьшится на те же x очков. Фактически в системе Глико количество очков, на которое изменяется рейтинг, регулируется значениями RD обоих игроков.
Поскольку игрок в системе Глико имеет и рейтинг, и RD, то обычно более информативно описать силу игрока в виде интервала (нежели просто указать его значение). Одним из путей является создание 95% доверительного интервала. Наименьшим значением интервала является рейтинг игрока минус двойной RD, а наивысшим значением является рейтинг игрока плюс двойной RD. Так, например, если чей-либо рейтинг равен 1850 и RD равно 50, то интервал будет простираться между 1750 и 1950. Мы можем сказать тогда, что мы на 95% уверены, что реальная сила игрока лежит находится между 1750 и 1950. Если у игрока низкий RD, то интервал будет уже, и мы будем на 95% уверены в реальной силе игрока в меньшем интервале значений.
Определим рейтинг и RD игрока перед игрой. Игрок еще не включенный в рейтинг получает 1000 очков рейтинга и RD, равный 350. В противном случае, используется наипоследнейший рейтинг, и новый RD, вычисленный из старого RD (RDold) по формуле, где t – число рейтинговых периодов, в которых со дня последней игры игрока им не было сыграно ни одной игры, исключая текущий (т.е. если ранжируемый играл в последнем (не текущем) рейтинговом периоде, то t=0), а c является константой, регулирующей увеличение неопределенности со временем. Вышеописанная формула гарантирует, что RD никогда не будет больше 350, то есть значения RD для «необсчитанного» игрока.
Значение c может быть определено либо путем анализа данных (но это может потребовать значительных вычислительных затрат), либо определяя – сколько времени (в единицах рейтинговых периодов) потребуется, чтобы рейтинг типичного игрока стал таким же неопределенным, как у игрока, не включенного в рейтинг. Для демонстрации вычислений, которые могут случиться в результате этого подхода, предположим, что типичный игрок имеет RD, равное 50, рейтинговый период в две недели, и предполагается, что полтора года (78 недель или 39 2-недельных периодов) потребуется для того, чтобы рейтинг типичного игрока стал таким же неопределенным, как и «рейтинг» неранжируемого игрока. Необходимое время будет равняться t=39 рейтинговых периодов. Мы хотим найти такое c, чтобы 350*350=50*50+c*с(39). В данном случае должно быть использовано с=55.5.
Для упрощения процесса имитирования было взято c=0.
Предположим, что рейтинг проигравшего игрока перед игрой равен r1, и отклонение рейтинга равно RD1. Допустим, что рейтинг победителя перед игрой равен r2 и рейтинговое отклонение RD2.
Тогда формулы обновления рейтинга и рейтинговых отклонений примут следующий вид:
Рейтинг с плавающей точкой. Программный псевдокод приводить нет смысла, ибо он писался по формулам.
Примеры расчёта (спасибо Лиону):
RD1=150;
r1 |
r2 |
RD2 |
E12 |
r1 |
RD1 |
r2 |
RD2 |
1500 |
1400 |
150 |
0.627 |
1435.8 |
140 |
1464 |
140 |
1500 |
1500 |
150 |
0.5 |
1449.2 |
140 |
1550.8 |
140 |
1500 |
1700 |
150 |
0.261 |
1472.7 |
142 |
1727.3 |
142 |
1500 |
1500 |
300 |
0.5 |
1457.3 |
143 |
1645.5 |
237 |
1500 |
1500 |
75 |
0.5 |
1446.4 |
138 |
1514.1 |
73.6 |
1500 |
2500 |
100 |
0.004 |
1499.5 |
150 |
2500.3 |
100 |
1500 |
500 |
100 |
0.996 |
1377.4 |
150 |
551.6 |
100 |
Это не расходящийся рейтинг, то есть он не требует нормализации.
Выглядит, может быть, и красиво, но почему это не подойдёт нам в Лиге – читайте в разделе с оценками рейтингов.
Методика оценки рейтингов
А теперь самое интересное. Ну хорошо, скажете вы, получили мы описание рейтингов и какие-то непонятные таблички, а дальше то что, как понять, что хорошо, а что дрова?
Оценка рейтингов производилась по нескольким параметрам. Также необходимо уметь правильно интерпретировать построенные программой графики (при просмотре их можно во много раз увеличивать!). Что же на них? Рассмотрим сверху вниз первые шесть графиков. Это графики рейтингов Лиги, СЗ, R2, КД, Эло и Глико. Каждый пиксел по оси Х – это срез рейтинга через каждые 10 игр. Так как ширина графика 1000 пикселов, то это значит, что он отображает динамику рейтинга на 10000 игр. То есть через каждые 10 игр по каждому рейтингу таблица игроков сортируется по убыванию значения рейтинга и далее в соответствующем масштабе по осу Y рейтинг каждого игрока в виде точки наносится на график. При этом:
- если сила игрока i равна или больше в 2 раза силы игрока i+1 (помните, что у нас силы игроков кратны степеням двойки?), то это нормально, игрок i упорядочен. Рейтинг такого игрока наносится зелёным цветом;
- если сила игрока i больше в 4 раза (или более число раз) силы игрока i+1, то это свидетельствует о небольшой неупорядоченности, значит те, кто должен быть под ним, где-то затерялись. Рейтинг такого игрока наносится тёмно-зелёным цветом;
- если сила игрока i меньше в 2 раза силы игрока i+1, то это свидетельствует о локальной неупорядоченности рейтинга. Рейтинг такого игрока наносится красным цветом;
- если сила игрока i меньше в 4 или более раз силы игрока i+1, то это свидетельствует о сильной локальной неупорядоченности рейтинга. Рейтинг такого игрока наносится тёмно-красным цветом.
Также уточню, что при нанесении точек на график может возникнуть и возникает ситуация, когда рейтинги настолько близко, что при выбранном масштабе они соответствуют одному пикселу, но сами точки имеют разный цвет. В этом случае действует правило, по которому точка с «плохим» цветом не может перезаписать точку с «хорошим», а наоборот можно. Так что все грехи на графике будут прекрасно видны и из нескольких претендентов на пиксел «отпечается» в нём самый «плохой».
Горизонтальные пунктирные линии идут через 500 очков. Горизонтальная чёрная линия соответствует отметке 0 по оси Y. Графики, в зависимости от максимально возможного значения рейтинга для каждой системы, нарисованы в наиболее удобных для восприятия каждой системы вертикальных масштабах. Лига 10К, Соло-Зерг и R2 3100, КД 100, Эло и Глико 1600.
Если значение рейтинга меньше -500 или больше максимального значения вертикального масштаба, то точка не отображается, так что уходящие «в космос» прямые прикидывайте сами.
Вторые шесть графиков представляют собой графики тех же систем в том же порядке и вертикальных масштабах, но на диапазоне игр 1-100000 (сто тысяч). Это позволяет точнее оценить динамику и поведение рейтинга на большом отрезке. Я запускал на 200 тысяч, и даже на 500, принципиально ничего не меняется. Таким образом во второй шестёрке графиков каждый пиксел по оси X есть срез рейтинга в каждой сотой игре.
Теперь о штрафных очках. На диапазоне 1-10K игр считается средний индекс неупорядоченности рейтинга (для всех рейтингов он отображается в файле «(*)_index_»). То есть после каждой сотой игры проходимся по отсортированному списку игроков и накопительно считаем штрафные очки (каждый зелёный рейтинг – 0 очков, темно-зелёный рейтинг – 1 очко, красный – 2, тёмно-красный - 3). При завершении работы программы выдаём средний индекс неупорядоченности для каждого рейтинга на диапазоне 1-10К игр, то есть накопленную сумму делим на 10K игр / 100 = 100.
На диапазоне 10K-100K игр считается свой, отличный от предыдущего средний индекс неупорядоченности рейтинга (для оценки поведения рейтинга на длительном отрезке, когда он уже прошёл фазу начального распределения игроков). То есть после каждой сотой игры проходимся по отсортированному списку игроков и накопительно считаем штрафные очки. При завершении работы программы выдаём средний индекс неупорядоченности для каждого рейтинга на диапазоне 10K-100K игр, то есть накопленную сумму делим на (100K игр - 10K игр) / 100 = 900.
Для оценки динамики индекса неупорядоченности считается также отдельный индекс на всём исследуемом диапазоне (1-100K игр). Он подсчитывается заново каждые 100 игр и отражается на 13-м (последнем) графике. После обнуляется и через сто игр считается заново с занесением на график. Очень наглядно и хорошо видно в динамике. Цвета распределены на нём следующим образом: Лига (зелёный), СЗ (тёмно-зелёный), R2 (красный), КД (тёмно-красный), Эло (чёрный) и Глико (серый).
Сразу могу сказать, что если все виды штрафов уменьшить на 1 очко (то есть попытаться убрать тёмно-зелёное влияние), то картина принципиально не изменится, всё останется практически абсолютно таким же. В любом случае исходники есть, попробуйте, если разберётесь, «покрутить» гайки сами.
Надеюсь, не нужно объяснять, что чем индекс неупорядоченности ниже, тем лучше рейтинговая система, и что чем быстрее он убывает, тем быстрее и качественнее рейтинговая система сортирует игроков в соответствии с их силой. На 13-м графике горизонтальный пунктир через 20 очков. Визуальная интерпретация такая, что чем темнее и краснее график, тем рейтинговая системы хуже. Идеальным является график целиком из зелёного цвета (без тёмно-зелёного!).
Программа imitator4.exe при расчёте через каждые 22К игр к игрокам будет добавлять ещё по одной группе, то есть 35 «человек», что приведёт к удвоению числа игроков в конце (относительно исходного количества в 140). Это весьма полезный и информативный тест на способность систем абсорбировать (поглощать) дополнительные «тиражи» «игроков». На графиках это выглядит довольно красиво, более того, все нижеследующие выводы сохраняют свою актуальность. Файлы с выходными результатами программы imitator4.exe имеют префикс «(4)».
Оценка Лиги
Ужас, летящий на крыльях ночи. Достаточно взглянуть на графики в обоих масштабах (по Х) и можно увидеть, как «табор уходит в небо». У кого рейтинг в плюс бесконечность, у кого в минус. Чем больше играете, тем больше у вас по модулю рейтинг. Как он связан с силой, мне выяснить не удалось, однако забавно, что индекс неупорядоченности в малом диапазоне занимает второе место, а в большом – третье. Видимо, что возможно можно он пытается вначале упорядочить, но потом силы иссякают, рейтинги начинают неумолимо разбегаться и всё застывает в космосе в состоянии на момент замерзания. Убирание пресловутых «+10» абсолютно ничего не меняет.
Вывод: очень плохо, рейтинг абсолютно непригоден.
Оценка СЗ
Как это не обидно, но попытка придумать собственную рейтинговую систему не удалась, по крайней мере на этот раз. В конце концов, в результате данного исследования был создан чрезвычайно удобный механизм, который может помочь повторить попытку. Если для примерно первой десятки, то есть топ-игроков, он ещё как-то справляется с ситуацией, то дальше идёт что-то типа каши. Нормализация абсолютно не помогает. Связи между значением рейтинга и силой тоже установить не удалось. Индекс неупорядоченности даже, как ни странно, хуже Лиги. На это повлияло лишь абсолютное постоянство силы игроков модели, и замкнутость самой модели. В «реальных» условиях, то есть при притоке «свежей крови» и постоянной объективной коррекции силы игроков, Лига ещё более выпукло продемонстрировала бы свою «накопительность».
Вывод: плохо, рейтинг непригоден.
Оценка R2
Клон СЗ, в целом ничем не лучше и не хуже, но «по конструкции» заметно сложнее. Механизм с коэффициентом успешности резко увеличил бонусы, и, следовательно, общее количество «впитываемых» всей системой очков, что привело к очень частой нормализации (что хорошо видно на графиках). Индекс неупорядоченности, как и у СЗ, самый большой на втором диапазоне. Игры с увеличением порога нормализации до 4-5K (в СЗ и R2) позволяют добиться уменьшения индекса до ~60 единиц (и обойти Лигу), но это есть чистейшее «цифровое надувательство и подгонка», ибо растягивание диапазона рейтинга с 1-3K до 1-5K в системе, где бой игроков с разницей в 1K не даёт бонуса, приведёт лишь к тому, что процент «нулевых» боёв резко возрастёт. Это убедительно доказывает бесполезность подобных манипуляций.
Вывод: плохо, рейтинг непригоден.
Оценка КД
Как ни странно, но именно эта система заняла второе место. Удивительно, как рейтинг, дающий четыре абсолютно разных бонуса для четырёх пар равносильных игроков из разных частей таблицы (то есть силы в парах равны, но между парами разные, см. пример), смог продемонстрировать такой относительно низкий индекс неупорядоченности. Однако в целом график визуально «грязноват», причём равномерно по всей глубине таблицы игроков. Стройной теории у системы нет, следовательно, как оценивать вероятность выигрыша одного игрока против другого в зависимости от их рейтинга – не ясно. Также невозможно решить обратную задачу (сравнить силу по рейтингу). Попытки поиграться со значением базовой ставки ничего принципиально лучшего не дали.
Вывод: весьма посредственно, очень ограниченно годен.
Оценка Эло
Чистый график, рекордно низкий индекс неупорядоченности во всех диапазонах. Прекрасно продуманная теория. Если бы в нём были вопиющие и неустранимые недостатки, то такая армия умных людей, как лучшие шахматисты мира, давно бы уже возмутилась. Единственная особенность, это как бы раздвоение рейтинга около начального значения в 1000 очков. Видимо, это обусловлено замкнутостью модели в имитаторе. Наверное, дело в том, что в имитаторе рейтинги обсчитываются у всех, а в реальной жизни новички-неудачники бесчисленных дворцов пионеров не проигрывают турниры из года в год на протяжении десятилетий, а просто уходят в небытие, но успев при этом напитать очками тех, кто пойдёт выше и станет чемпионом мира. Другими словами, видим мы только Карпова, Фишера и Леко, но если насильно заставить всё население Земли играть на рейтинг в шахматы и постоянно анализировать распределение, то наверное будет тоже самое, раздвоение вокруг значения начального рейтинга, просто в реальной жизни «болото» никому не интересно, всех интересует только вершина многомиллионной пирамиды. В целом, рейтинг работает нормально.
Обсчёт с помощью Эло базы Лиги не должен никого смущать. Разницу между лидерами и отстающими в рейтинге следует по таблице (см. описание Эло) преобразовать в вероятность выигрыша. В шахматах новичок практически никогда не имеет шансов против Карпова (если не рассматривать внеигровые факторы, как то: опьянение, подкуп и т.д.). А вот в Гене есть и фактор игровой случайности, как, например злобные компы, ведь Гена, в отличие от шахмат, игра с неполной информацией. Поэтому Дир, например, или Проф, никогда не смогут дать зуб, что обыграют новичка 200:0, всегда может приключиться случайность. А вот в шахматах Карпов гарантированно выиграет у новичка 100000:0 (циры 200 и 100000 взяты приблизительно, для демонстрации тенденции). Вот от этого и такой относительно небольшой разброс Эло будет в Лиге (максимум в 2700 как в шахматах в Лиге не будет, будет гораздо меньше). Но это нормально, такова специфика Гены как игры.
Очевидно, что при применении Эло в Лиге необходим некий механизм подтверждения рейтинга. То есть новичок, получает на старте свою тысячу, но в общей таблице он не фигурирует (или фигурирует, но его рейтинг отображается специальным «испытательным» цветом), пока не сыграет 30 игр (мне это число кажется оптимальным). То есть он проходит испытательный срок. По сути, вначале его оценивают немного завышено, авансом, так как среди массы игроков с подтвержденными рейтингами есть те, у кого он выше тысячи, и те, у кого он ниже. У всех появляется стимул играть с новичками, и у сильных, и у слабых. Новичок в этих условиях попадает к лиговцам как к стае голодных пираний на обед. Таким образом, к концу испытательного срока его начальный рейтинг должен скорректироваться к его настоящему. Уменьшать/увеличивать начальный рейтинг смысла нет, я пробовал, всё начинает раздваиваться вокруг этого нового значения. То есть рейтинг действительно отражает силу игрока с высокой точностью. Теперь я убеждён, что задача рейтинга не просто определить место игрока в таблице, а максимально точно измерить его силу. Почему любой шахматист может сравнить свой Эло с Эло Фишера к примеру, хотя Фишер бросил играть когда этот шахматист ещё даже не родился? Мы, генеральцы, тоже так хотим.
Вывод: очень хорошо, рейтинг годен, безусловный лидер нашего теста по совокупности всех характеристик.
Оценка Глико
Итак, в чём же блеск и нищета Глико? При нулевом c (т.е. при идеальных, не меняющих силу игроках, как их и оценивают остальные рейтинги) Глико творит чудеса – чистейший график, индекс неупорядоченности не просто лучший, он в 4 раза меньше, чем Эло и в 10 раз меньше, чем в Лиге. Однако заметьте, за счёт чего это достигается. Начиная с какого-то, довольно раннего момента (5-10-15 тысяч боёв), динамика перемещения игроков по таблице просто угасает, то есть почти все играют за _доли_ очка в каждом бою. В этом собственно сама идея Глико, в начале, пока отклонение у всех большое, бонус за игру может достигать 2-3 сотен очков, то есть рейтинг практически мгновенно разбрасывает игроков по таблице с приемлемой точностью, а далее отклонение уменьшается, бонусы падают и стремятся к долям очка, но за время этого падения происходит окончательное, точное ранжирование игроков. А далее, далее долгая, вернее вечная «атомная зима». Все рассортированы, всё идеально, сила игры не меняется, рейтинг у всех абсолютно достоверен, и все играют за доли очка, вследствие чего не могут существенно стронуться со своих мест в таблице и графики рейтинга вместе с индексом продолжают оставаться идеальными.
Но реально, это – коллапс. Для борьбы с ним в Глико есть введён механизм увеличения отклонения со временем. Я в различных режимах пытался его имитировать. Но ничего заслуживающего внимания не получилось (интересно, почему ФИДЕ до сих пор не принимает Глико?). Вообще, механизм этот с отклонениями очень сложная и нелинейная вещь. Простое изменение с с 0 на 55.5 ничего не даёт, график превращается в тёмно-красную змею, а индекс неупорядоченности улетает в космос. То есть налицо отсутствие баланса между механизмом быстрого начального ранжирования и последующим «тепловым шумом» от постоянного подтягивания отклонения вверх (увеличение отклонения ведёт к возрастанию бонусов, но так же и перемешивает таблицу, страгивая игроков с их «правильных» насиженных мест, а это увеличение индекса неупорядоченности). Одним словом, относительно данной системы справедливо правило рычага: «выигрываем в силе – проигрываем в расстоянии, и наоборот». Система берёт крутой старт, но потом гибнет от невозможности справиться с ворохом проблем вследствие этого самого крутого старта. Это как аквалангист без декомпрессии первым всплывший со дна на поверхность. Что толку, что он первый, если всплыл мёртвым?
Поэтому главная проблема Глико с ненулевым с – несбалансированность и высокая неупорядоченность, а с нулевым – быстрое сведение бонусов за игру к жалким крохам и плюс абсолютная неспособность к учёту изменения со временем силы игрока (все мы в конце концов, пусть и медленно, усиливаемся, или наоборот, теряем силу игры). Вам охота, например, обыграть Профа трижды за выходные и получить за это в сумме аж 0.64 очка?
Применение системы на сайте какого-нибудь жуперкрафта не есть аргумент, ибо народ там поверит в любой рейтинг, какой ему ни выведут, ибо проверить его мало кто сможет.
Вывод: плохо, но в какой-то мере перспективно, рейтинг в настоящем его виде непригоден, требуются обширные дополнительные исследования.
Выводы
Ну вот, теперь, опираясь на результаты настоящего исследования, можно выбирать новый официальный рейтинг. Также был создан удобный и точный механизм для исследования рейтингов. Вам кажется, что у вас есть новая гениальная система ранжирования? Дайте её мне, уж я её проверю!
Приложение 1, список выдаваемых программой файлов
«(*)graph.bmp» - графики
«(*)_fights_» - расчёты всех боёв
«(*)_index_» - средние значения индексов неупорядоченности
«(*)Elo» - тут и далее таблицы игроков после каждой тысячи игр
«(*)KD»
«(*)League»
«(*)R2»
«(*)Solo-Zerg»
«(*)Glico»
(c) 2004-3004 Zerg[ea]