Я работаю над планированием 8 витрин на этот год. У меня есть фреймы данных для каждой витрины с указанием ранга и конференции, откуда родом каждый игрок. На каждой витрине зарегистрировано разное количество игроков, но это всегда разное количество игроков. Бывший. 48, 20 игроков. Некоторые игроки могут участвовать в нескольких шоукейсах или во всех восьми.
Ранги никогда не меняются. Они устанавливаются в начале года.
В каждой витрине проводится 3 раунда, и все игроки должны сыграть по одной игре в каждом раунде. Игроки не могут играть друг с другом более одного раза в течение года и не могут играть с другим игроком из одной конференции. Матчи для игроков должны определяться по аналогичному рейтингу.
Я пытался использовать швейцарскую систему для планирования игр на Python, и я могу ее сгенерировать, но это не так. последовательным, поскольку не все противники совпадают в каждом раунде. Я считаю, что это потому, что у нас есть дополнительное ограничение, а именно «конференции», тогда как в обычной швейцарской системе оно ограничивается только «рангом». Система должна быть ограничена как «рангом», так и «конференцией».
Есть ли у кого-нибудь предложения по поводу каких-либо пакетов или типов алгоритмов, которые я мог бы использовать? Или если вы думаете, что есть лучший способ решить эту проблему.
Спасибо!!!
++++ Редактировать +++< /p>
Хорошо, если честно, я не уверен, в чем проблема, поэтому я просто включу первую часть:
Вот что я сделал:
Код: Выделить всё
class Player:
def __init__(self, name, rating, area):
self.name = name
self.rating = rating
self.area = area
self.games_played = 0
def optimize_pairings(players, pairings_history, round_num):
# Ensure players list contains only Player objects
if not all(isinstance(player, Player) for player in players):
raise ValueError("Invalid player objects in the players list.")
# Create a binary variable for each pair of players
pair_vars = pulp.LpVariable.dicts("Pair", ((p1, p2) for p1 in players for p2 in players if p1 != p2), cat='Binary')
# Create a PuLP minimization problem
prob = pulp.LpProblem("Pairing Optimization", pulp.LpMinimize)
# Objective: minimize the total rating difference between paired players
prob += pulp.lpSum(pair_vars[(p1, p2)] * abs(p1.rating - p2.rating) for p1 in players for p2 in players if p1 != p2)
# Add constraints
for p1 in players:
prob += pulp.lpSum(pair_vars[(p1, p2)] for p2 in players if p1 != p2) == 1 # Each player is paired with exactly one opponent
for p1 in players:
for p2 in players:
if p1 != p2:
prob += pair_vars[(p1, p2)] + pair_vars[(p2, p1)]
Подробнее здесь: [url]https://stackoverflow.com/questions/78203281/swiss-scheduling-system-for-ping-pong-league[/url]