Я думаю об эффективном алгоритме объединения игроков в игры. Поскольку будет огромное количество игроков, алгоритм должен быть асинхронным (т. Е. Масштабируемым для любого числа машин в кластере). Есть данные: Представьте, что есть неориентированный граф (каждый узел является игроком). Каждое из краев между игроками означает, что игроки могут принять участие в одной игре, и если нет края, они не могут. Мне нужно реализовать алгоритм, который будет группировать игроков по следующим критериям:эффективный алгоритм для группировки узлов графа в параллельном/кластере
- У каждого игрока есть состояние: «ждет игры» или «в игре». Только ожидающие игроки должны быть сгруппированы в игры
- каждая игра имеет минимальное и максимальное количество игроков
Мои мысли по реализации: График будут сохранены и доступны через базу данных NoSQL (из разных машин в кластере). Пока нет какой-либо конкретной схемы (любые предложения?). Также блокировка доступа к отдельным игрокам (а также пессимистическим блокировкам) не является вариантом, поскольку это потенциальное узкое место для замедления других процессов, которые будут пытаться получить/собрать одного и того же игрока (ов).
Мой вопрос: кто-нибудь реализовал такие алгоритмы? Какие-либо предложения?
PS: У меня уже есть идея, но сначала хочу обсудить/проверить, что предлагают люди.
Спасибо!
EDIT1: В ответ на Thomas Jungblut: Использование игровых автоматов - интересная идея, но (как только я ее правильно понимаю) она может не работать в некоторых случаях. Пример Fox: в каждой игре должно быть ровно 3 игрока. Новые 6 игроков (назовем их ABCDEF см exaple 1) вступают в графе/очереди один за другим в таком порядке: A, B, E, F, C, D.
В результате только одна игра будет создана (A, B, C), плюс 2 игры с пустыми слотами: (D) и (E, F). Но оптимальным должно быть 2 игры: (A, C, D) и (B, E, F), правильно?
Возможно, существует хорошая реализация на основе MapReduce? – neleus
Какое у вас время? Если вы считаете, что MapReduce является для вас вариантом, вы наверняка сможете подождать несколько часов, чтобы группировать людей в игры (что звучит странно для меня). Я лично использовал бы очередь сообщений и ставил людей жадно в играх со свободными слотами. Вы можете сделать это с помощью простой базы данных mysql. Также вы должны определить «огромное количество игроков» в более научной части. –
Что касается игровых автоматов, см. Мое редактирование выше. Нет особых требований времени ... Это зависит от технологии использования и многих других факторов. Моя цель - реализовать алгоритм (ы), а затем проанализировать его (их) производительность, минусы и профи. «огромное количество игроков» - позволяет считать это миллионом. – neleus