Швейцарский турнир - алгоритм спаривания

Я работаю над швейцарской системой турниров в Python и пытаюсь найти оптимальный алгоритм спаривания.
Моя самая большая проблема заключается в том, что каждый алгоритм, с которым я пришел, выдает ошибку в нескольких последовательностях, когда последняя выбранная пара уже сыграла друг с другом, решив, что спаривание недопустимо.

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

Текущий алгоритм, который я сделал, работает следующим образом:

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

Например:
Рейтинг после 2 туров:

1. P1: [P2 win, P3 win] 2 wins
2. P5: [P6 win, P2 win] 2 wins
3. P3: [P4 win, P1 lost] 1 win, 1 loss
4. P4: [P6 win, P3 lost] 1 win, 1 loss
5. P2: [P1 lost, P5 lost] 2 losses
6. P6: [P5 lost, P4 lost] 2 losses

Первый выбор будет P1, а первый матч - P5. Извлечение (P1, P5) из списка.

1. P3: [P4 win, P1 lost] 1 win, 1 loss
2. P4: [P6 win, P3 lost] 1 win, 1 loss
3. P2: [P1 lost, P5 lost] 2 losses
4. P6: [P5 lost, P4 lost] 2 losses

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

1. P4: [P6 win, P3 lost] 1 win, 1 loss
2. P6: [P5 lost, P4 lost] 2 losses

Вопрос: Существует ли какой-либо алгоритм, который гарантирует оптимальный модуль сопряжения, при этом следя за тем, чтобы в конце я не «застрял» с двумя игроками, которые играли друг с другом?

Ответы на вопрос(3)

Ваш ответ на вопрос