Создание расписания партий по круговой системе Laravel

Всем привет! Я создаю систему управления соревнованиями на . Я получаю участников группы с помощью отношения Group::competitors, и у меня есть таблица партий personal_games, в которой есть поля player1 и player2 для id участников. Мне нужно написать функцию контроллера PersonalGameController, которая бы создавала партии по круговой системе по следующим схемам:

Для группы из 3 игроков:
1 тур: 2-3
2 тур: 3-1
3 тур: 1-2

Для группы из 4 игроков:
1 тур: 1-4, 2-3
2 тур: 3-1, 2-4
3 тур: 1-2, 4-3

Для группы из 5 игроков:
1 тур: 2-4, 1-5
2 тур: 4-1, 5-3
3 тур: 1-3, 2-5
4 тур: 3-2, 5-4
5 тур: 1-2, 3-4

Для группы из 6 игроков:
1 тур: 2-4, 1-5, 3-6
2 тур: 4-1, 6-2, 5-3
3 тур: 1-3, 2-5, 4-6
4 тур: 3-2, 6-1, 5-4
5 тур: 1-2, 3-4, 5-6

Вот таблицы БД (для понимания):
competitors:
Таблица competitors

personal_games (результаты пока не заполняются, там null)
Таблица personal_games

Помогите, пожалуйста, придумать алгоритм, который бы выдавал партии по таким схемам. В идеале хотелось бы, чтобы он работал и для другого количества участников в группе. Заранее всем благодарен!


Ответы (1 шт):

Автор решения: MBo

Можно использовать round-robin алгоритм генерации всех пар.

Для иллюстрации - располагаем элементы в два ряда. Если нечётное количество - добавляем фиктивного, играющий с ним отдыхает.

Фиксируем один элемент A

На каждом круге циклически сдвигаем все элементы, кроме фиксированного, образуем новые пары

A B
D C
-----
A D
C B
----
A C
B D

Пары:

AD, BC 
AC, BD 
AB, CD

P.S.
О, я даже на PHP что-то такое изображал, для нечётного количества в комментариях дополнение.

Пример на Python, для нечетного количества участников играющий с последним (фиктивным) отдыхает

→ Ссылка