Распределение среди пользователей по алгоритму совместного голосования - PullRequest
6 голосов
/ 22 декабря 2011

Пользователи моего приложения (на самом деле это игра) отвечают на вопросы, чтобы получить очки. Вопросы предоставляются другими пользователями. Из-за громкости я не могу сам все проверить, поэтому я решил собрать процесс фильтрации для пользователей (игроков). Правила просты:

  • каждому пользователю задается вопрос, чтобы оценить его как хороший / плохой / неуверенный
  • когда вопрос оценен 5 раз как "плохой", он удаляется из пула
  • когда вопрос оценен 5 раз как "хороший", он удаляется из опроса и помечается для воспроизведения другими игроками, которые его не видели

Если бы все могли видеть все, это было бы легко. Однако на более позднем этапе игры пользователи не должны получать вопросы, которые они уже видели. Это означает, что пользователи не должны видеть все вопросы, и именно те, которые они не видят, получат возможность играть (ответить) позже в игре.

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

Я ищу какой-нибудь алгоритм, который бы максимально увеличивал количество оцениваемых игровых (то есть невидимых) вопросов для всех игроков.

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

Соотношение хороших и плохих вопросов составляет 1: 3, т.е. 25% вопросов оцениваются как хорошие. Количество уже отправленных без ответов вопросов превышает 10000. Количество активных пользователей с правом голоса составляет около 150.

В настоящее время я рассматриваю возможность разделения пула вопросов и базы пользователей на 2 части. Одна часть базы пользователей будет проверять вопрос для другой части, и наоборот. Разделить вопросы легко (например, нечетное или четное). Тем не менее, я все еще не уверен, как разделить базу пользователей. Я думал об использовании нечетной / четной позиции в списке «главных вопросов», однако позиции в списке меняются ежедневно по мере проверки новых вопросов.

Обновление: Я только что попросил продолжение этого вопроса - Мне нужно периодически удалять фиксированное количество вопросов из пула.

1 Ответ

4 голосов
/ 22 декабря 2011

Я не знаю, существует ли какой-то конкретный, хорошо известный алгоритм для этого. Однако, это было бы моим мнением:

  1. «максимизировать количество оцениваемых игровых (то есть невидимых) вопросов для всех игроков» означает как , максимально увеличивая количество вопросов с + 5 и количество невидимых вопросов от каждый игрок.
  2. Каким бы ни был алгоритм, его эффективность зависит как от качества вопросов , представленных участниками, так и от готовности оценивать другими игроками (если вы не заставьте их оценить вопросы).
  3. Цель вашей системы должна состоять не в том, чтобы заставить всех игроков иметь одинаковое количество «невидимых вопросов» (это на самом деле не имеет значения), а скорее в том, чтобы всегда имел для каждого игрока «резерв» из невидимых вопросов, которые позволяют ему / ей играть с нормальной скоростью игры . Например: скажем, у вас есть два пользователя A и B, которые регулярно играют на вашем сайте. Обычно А отвечает на 80 тестов в день, а В - только на 40. Если ваша система в среднем получает 100 новых утвержденных вопросов ежедневно, в принципе вы бы хотели, чтобы игрок А никогда не видел больше 20 из них каждый день, в то время как игрок Б мог видеть 60 из них.
  4. Соотношение между заданным вопросом и утвержденным вопросом также важно: если каждый второй заданный вопрос не является хорошим, то пользователи A и B сверху могут оценивать 40 и 120 вопросов ежедневно.

Таким образом, мой подход к окончательному алгоритму будет следующим:

  1. Следите за следующим:
    • Количество отправленных новых вопросов в день (F = Flow)
    • Соотношение хорошо / общее количество заданных вопросов (Q = качество)
    • Количество вопросов, используемых (для игры, а не для рейтинга) каждым игроком в день (GR = Game Rate)
    • Количество вопросов, оцениваемых каждым игроком в данный день (RC = Счетчик отзывов)
  2. Создайте приоритетную очередь вопросов для оценки. Цель здесь - как можно быстрее получить одобренные вопросы. Дайте бонусу приоритет обоим:
    • вопросов, которые уже набрали голосов
    • вопросы, отправленные пользователями, у которых есть история других вопросов, которые уже были приняты.
  3. Когда игрок участвует в рейтинге, покажите ему / ей первый вопрос в очереди.
  4. Повторите шаг 3 столько раз, сколько вы хотите, чтобы убедиться, что это условие никогда не выполняется: Q * (F - RC)

[Вышесказанное может быть доработано, учитывая тот факт, что когда пользователь впервые зарегистрируется, на сайте уже будет пул утвержденных, но невидимых вопросов]

Конечно, вы можете сильно влиять на поведение пользователей, давая стимулы для похвальной деятельности (значки и репутационные очки на SO - самоочевидный пример).


РЕДАКТИРОВАТЬ / ДОБАВИТЬ: Обсуждение в комментариях проясняет, что GR является фиксированным, и это один вопрос в день. Кроме того, ФП заявляет, что в системе будет по крайней мере 1 новый утвержденный вопрос каждые 24 часа. Это означает, что можно упростить вышеуказанный алгоритм в одной из двух форм:

Если пользователь может голосовать только ПОСЛЕ того, как он ответил на свой ежедневный вопрос:

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

Если пользователь может голосовать даже ДО того, как он ответит на свой ежедневный вопрос:

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

Это так, что если пользователь голосует за все голосующие вопросы в системе и , то отвечает на свой ежедневный вопрос в 23:59, в 00:00 все равно останется вопрос, на который можно ответить. плюс 24 часа для системы, чтобы получить новый вопрос на следующий день.

НТН!

...