Как выбирать совпадения в системе рейтингов ELO по мере накопления совпадений - PullRequest
1 голос
/ 29 марта 2019

Я работаю над краудсорсинговым приложением, которое будет сопоставлять около 64 вымышленных сильных / сильных женщин из разных франшиз друг с другом и пытаться определить, кто самый сильный. (Думайте, "Бэтмен против Человека-Паука", написанный большой). Пользователи будут выбирать победителя любого данного матча между двумя за раз.

После исследования многих алгоритмов сортировки я обнаружил этот фантастический SO post с изложением системы рейтинга ELO, которая кажется абсолютно идеальной. Я ознакомился с системой и понимаю, как начислять / вычитать очки в матче и как рассчитывать оценку производительности между любыми двумя персонажами на основе прошлых результатов.

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

Итак, представьте, что вы пришли к этой функции после того, как было подано 50 000 голосов. Учитывая то, что мы можем ожидать всевозможных нетранзитивных результатов под капотом и значительного отклонения от оценок производительности, есть ли способ рассчитать, для каких матчей мне больше всего нужно больше данных? Это не так просто, как выбрать два соседних символа в отсортированном списке с самыми близкими значениями или просто сфокусироваться на верхней части списка.

С 64 участниками (и да, я действительно рассмотрел и отклонил скобки!), Я не беспокоюсь о пересчете рейтингов производительности после каждого матча. Я просто не знаю, как выбрать следующий, потому что мы не будем знать о предвзятости каждого избирателя и его любимых персонажах.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Удивительная разница, которую вы испытываете в многопользовательских играх, состоит в том, что разные люди с разными рейтингами «встают в очередь» в разное время.

По системе ELO в идеале все игроки должны быть сопоставлены с доступным игроком ссамый близкий счет им.Поскольку, если я правильно понимаю, 64 «игрока» в вашей игре всегда доступны, эта комбинация приводит к отсутствию разнообразия, поскольку оптимальные совпадения всегда будут, ну, в общем, оптимальными.

Чтобы решить эту проблему, яПредложить приоритетную очередь, основанную на том, когда вашим «игрокам» хочется снова играть.Например, если кто-то хочет сделать длинный перерыв, он может получить низкий приоритет и быть размещенным ближе к концу очереди, то есть пройдет некоторое время, прежде чем вы снова увидите их.Если кто-то хочет сделать небольшой перерыв, возможно, после примерно 10 матчей, вы снова увидите их в матче.

Это «желание» может быть выполнено случайным образом, и вы можете назначить разные характеристики каждому персонажуискажите это поведение, например, «победа над игроком с более высоким ELO увеличит вероятность того, что этот игрок снова сыграет раньше».С точки зрения игрового дизайна, эти личности делают персонажей более интересными для меня, заставляя меня хотеть остаться.

Итак, у вас есть упорядоченный список игроков, которые хотят играть.Я могу подумать о трех подходах, которые вы могли бы предпринять для фактического создания матча:

  1. Посмотрите на первых 5 игроков в очереди и выберите лучший матч
  2. Подберите первого игрока с еголучший матч в следующих 4 игроках в очереди (по-видимому, дольше всех ждал, поэтому должен быть поставлен в очередь немедленно, независимо от честности матча)
  3. комбинация обоих, где, если человек во главесписок не выбирается, он увеличивается в «энтропии», что влияет на вычисление ELO, делая их более вероятными для сопоставления

Edit С точки зрения реализации,Я бы рекомендовал использовать дельта-список вместо фактической очереди приоритетов, поскольку игроки должны «повышаться» в ожидании.

0 голосов
/ 15 апреля 2019

Чтобы избежать очевидного выигрыша против более слабой ситуации, вы группируете игроков по уровням. Очевидно, что изначально все будут в одном и том же уровне [0 - N1]. Затем в рамках уровня вы создаете график ротации, чтобы каждая из двух сторон могла «совпадать» хотя бы один раз.

Однако, если вы не хотите поддерживать расписание ... тогда всегда совпадайте с партией, которая участвовала в наименьшем количестве «матчей». Если их несколько, сделайте случайный выбор.

Таким образом вы гарантируете, что все участвуют в одинаковом количестве «матчей».

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