Разработка новой рейтинговой системы #22
Notifications
Due Date
No due date set.
Blocks
#23 Реализация новой рейтинговой системы
NotBigGhost/ForbiddenStarsApp
Reference: NotBigGhost/ForbiddenStarsApp#22
Reference in New Issue
Block a user
Определение задачи:
Система рейтинга не учитывает множество важных элементов, и нуждается в доработке. Должна быть проведена исследовательская задача, результат которой - подготовка документа, описывающего новую рейтинговую систему, её правила и готовые цифры, формулы, коэффициенты и примеры расчётов. В данном документе также должны быть описаны причины принятия решений в рамках разработки этой системы, доказывающие их состоятельность и позволяющие оценить её качество.
Критерий готовности
Получение от владельца проекта утверждения новой системы после ознакомления с документом. По закрытии задачи документ должен быть загружен в комментарии к задаче #23.
Требования
1: количество раундов. 4 цели, собранные за 2 раунда, значительно ценнее, чем те же 4, но собранные под конец 8 раунда.
2: первое место всегда даёт максимальный бал, независимо от количества игроков за столом, что не совсем честно. Но если мы будем учитывать количество игроков, этот параметр должен иметь меньший вес, чем, например, количество раундов. Следовательно, для каждого значимого для рейтинга параметра необходимо ввести вес влияния, чтобы сделать возможным подсчёт рейтинга из множественных характеристик партии. Тогда будет возможно более объективно оценивать рейтинг, опираясь на ход партии.
3: при начислении баллов учитывается разница в рейтинге с оппонентами. Например, если человек с рейтингом 60 победил в дуэли человека с рейтингом 40, ему повышают рейтинг на меньшее число, и наоборот, победителю с 40 рейтинга его повышают сильнее.
4: добавить счётчик взятых за игру целей и занятых систем на поле на момент завершения игры, чтобы определить разброс между всеми игроками и соответствующе изменить начисление рейтинга.
5: учитывать тип победы. Например, победа по планетам это более близкая игра чем по целям а победа по пластику ещё ближе. Следовательно разброс между игроками уменьшается.
Контекст
Для победы в игре необходимо собрать количество целей, равное количеству игроков за столом. Так, если играют двое, нужно собрать 2 цели, если четверо - 4 цели и т.д.
Поле состоит из тайлов, каждый тайл делится на 4 сектора двух типов - система и космос. Количество тайлов определяется количеством игроков. Так, при игре вдвоём будет поле 2 на 2 (4 тайла), при игре втроём - 3 на 3 (9 тайлов), при игре вчетвером - 3 на 4 (12 тайлов), при игре впятером - 4 на 4 (16 тайлов). При этом количество систем на одном тайле варьируется от двух до трех, при этом если учесть частоту появления тайла с тремя системами, в среднем получается 2.2 системы на один тайл.
План выполнения
Модель — взвешенный многопользовательский Elo. Партия раскладывается на пары игроков; ожидаемый исход пары считается из разницы рейтингов (треб. 3). Изменение рейтинга:
ΔR_i = K_i · G(N) · 1/(N−1) · Σ_j M_ij · (S_ij − E_ij)— система сумма-ноль, без инфляции.Множитель отрыва
M_ij:(R_max − раунд)/(R_max − 1), треб. 1;R_max= 8, при хоумруле группы для 5–6 игроков — 9;/N) и миров (/ миров на поле / N), треб. 4;Вес размера стола
G(N)мягкий и меньше веса темпа (треб. 2). Для новичков — повышенныйK.Проверка на симуляции. Скрипт
docs/rating/simulate.py(только stdlib, фиксированный seed) создаёт синтетическую лигу со скрытой силой игроков и сравнивает текущий LP, чистый парный Elo и новую систему. Метрики: корреляция с истинной силой, Brier и log-loss прогноза, сходимость, волатильность. Коэффициенты подбираются перебором.Документ
docs/rating/rating-system.md:rounds/objectives/worlds, галочка группы «9 раундов на 5–6», снимокmax_roundsв партии, пересчёт истории, смена отображения;PR в
dev. Мёрж PR — утверждение. После мёржа документ выкладывается комментарием в #23.Критерии готовности
simulate.pyчерез assert.Термины: «системы» из текста задачи в документе называются мирами, как в справочнике (стр. 8, 16). Поле: 2p — 4 тайла, 3p — 9, 4p — 12, 5p — 16, 6p — 20 (4×5), в среднем 2.2 мира на тайл.
Ветка:
issue-22-rating-proposalотdevИсследование завершено, результат: PR #65 — документ
docs/rating/rating-system.mdи эталонная реализация с симуляциейdocs/rating/simulate.py.Вывод: многопользовательский Elo со шкалой вокруг 50. Размер изменения рейтинга зависит от множителя отрыва: темп победы (с учётом хоумрула 9 раундов), отрыв по целям и мирам, тип победы. Размер стола тоже учитывается, но весит слабее темпа. Разница рейтингов с соперниками учитывается через ожидаемый результат. Старая история пересчитывается по тем же формулам: у партий без новых полей признаки нейтральны.
На чём основано:
assert.Открытые вопросы (раздел 9 документа):
last_standing;MIN_GAMES.Какой признак отрыва информативнее, покажут только реальные данные после #23 — план калибровки есть в разделе 8.
Статус:
Status/In Review— жду вашего утверждения; мёрж PR закроет задачу. После мёржа документ будет выложен комментарием в #23, как требует критерий готовности.Уточнение, при дуэли (игра на 2-х игроков), поле не 2x2, а 2x3.
План доработки по замечаниям
Основание: уточнение про поле 2×3 в этой задаче и решения по разделу 9 в комментарии к PR #65.
simulate.py.assert— в новой шкале.last_standing⇔ ровно один невыбывший: автоматически в форме и админской правке, в списке выбора причины нет, сервер проверяет правило при завершении и правке.last_standingстарым партиям, где невыбывший ровно один.HelpPage.tsx.Status/In Review.Критерии готовности
assertпримеров проходят.Ветка:
issue-22-rating-proposalотdev(существующая, PR #65)Доработка по замечаниям завершена, PR обновлён: #65 — документ
docs/rating/rating-system.md.Вывод: предложение согласовано с вашими решениями, открытых вопросов не осталось.
last_standing: ставится автоматически при одном невыбывшем, вручную не выбирается, сервер проверяет правило, для истории нужен бэкфилл;На чём основано:
python docs/rating/simulate.py— exit 0, все 15 примеров и проверка шкалы проходят; таблицы 7.3 взяты из этого прогона.python docs/rating/simulate.py --grid --grid-seasons 40— exit 0; таблицы 7.4 взяты из этого прогона.docs/rating/.Открытые вопросы: нет. Стоит глянуть два места, которые вывел я сам, а не вы:
last_standingдля старых партий: у них вырастет вес победы, так как отрыв по целям = 1;last_standing» проверяется и на сервере, а не только в интерфейсе.Статус:
Status/In Review— жду вашего утверждения; мёрж PR закроет задачу. После мёржа документ будет выложен комментарием в #23.