乒乓球联赛的瑞士制赛程系统

-1 投票
1 回答
45 浏览
提问于 2025-04-13 02:40

瑞士赛制的帮助!请帮忙

我正在安排一年中的8场展示赛。我为每场展示赛准备了数据表,里面有每位选手的排名和他们来自的会议。每场展示赛注册的选手人数不同,比如有48个、20个选手。还有一些选手可能会参加多场展示赛,甚至全部8场。

选手的排名是固定的,年初就已经确定了。

每场展示赛有3轮,所有选手必须在每轮中进行一场比赛。选手之间在整年内不能重复对战,也不能和来自同一会议的选手对战。选手的比赛对手应该根据相似的排名来决定。

我尝试用瑞士赛制在Python中安排比赛,虽然能生成结果,但每轮的对手匹配不一致。我认为这是因为我们有一个额外的限制条件,就是“会议”,而在普通的瑞士赛制中只受“排名”限制。这个系统必须同时考虑“排名”和“会议”。

有没有人能推荐一些可以使用的包或者算法?或者你觉得有没有更好的方法来解决这个问题。

谢谢!!!

++++ 编辑 ++++

老实说,我不太确定问题出在哪里,所以我就先把第一部分放上来:

这是我做的:

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)] <= 1  # No rematches between tournaments

     for p1 in players:
         for p2 in players:
             if p1 != p2:
                 if p1.area == p2.area:
                    prob += pair_vars[(p1, p2)] == 0  # No player can play an opponent from the same conference

     # Exclude pairings already used in previous tournaments
     for (p1, p2) in pair_vars.keys():
         if (p1, p2) in pairings_history or (p2, p1) in pairings_history:
             prob += pair_vars[(p1, p2)] == 0

     # Solve the ILP problem
     prob.solve()

     # Extract pairings from the solution
     paired_players = [(p1, p2) for (p1, p2), var in pair_vars.items() if pulp.value(var) == 1]

     # Update pairings history for the current round
     pairings_history.update({(p1, p2) for (p1, p2) in paired_players})

     return paired_players

这里还有一个链接,里面有一个示例的结果/数据

1 个回答

暂无回答

撰写回答