You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python赛事赛程生成程序报0错误但存在队伍连续参赛问题求助

4场地赛事赛程生成程序Bug排查

核心问题原因

以下是导致你程序统计错误数为0但实际存在连续参赛冲突的根本原因:

  • 赛程编排顺序逻辑错误(最核心原因)
    你当前的循环顺序是先遍历场地x,再遍历轮次y:先把1号场地的所有8轮比赛全部排完,再排2号场地的8轮比赛,以此类推。
    正确的逻辑应该是先遍历轮次y,再遍历同轮次的4块场地x:同一轮次是同一时段的4场并行比赛,必须先把该轮次所有场地的比赛都排完、确认该轮次所有参赛队伍没有重复,再去排下一轮的比赛。
    你当前的顺序会导致:排场地1的第2轮比赛时,同属第1轮的场地2/3/4的比赛还没安排,第1轮的参赛队伍列表还没更新,后续加进第1轮的队伍可能刚好已经被排到了第2轮,就出现了队伍连续两轮参赛的情况,且这种冲突不会被你的错误统计逻辑捕获。
  • 冲突尝试循环无提前退出逻辑
    你写的while Try < maxTry循环仅在发现冲突时打乱比赛列表,但哪怕某次打乱后首条比赛已经满足无冲突要求,也不会提前退出,会一直循环到150次,后续的打乱操作完全可能再次把有冲突的比赛放到列表首位,等于你的冲突检查逻辑实际失效。
  • 比赛列表未每次循环重置
    你将存储比赛的matches列表定义在最外层,每次迭代时只会从文件读取新比赛追加到列表尾部,不会清空上一次迭代残留的内容,会导致比赛总数溢出、匹配逻辑混乱。
  • Python版本兼容问题
    numGames/numCourt在Python3中会返回浮点型,传入range()会直接报错,需要改成整除numGames//numCourt。

修复建议

  1. 调整循环顺序:外层循环遍历轮次y(共8轮),内层循环遍历当前轮次的场地x(共4块)
  2. 修改冲突尝试循环:只要匹配到无冲突的首条比赛就立刻break跳出尝试循环
  3. 将matches = []移动到i循环内部,每次迭代都清空旧的比赛列表
  4. 所有赛程排完后,单独加一轮全局校验逻辑,遍历所有比赛校验队伍是否存在同时参赛、连续参赛的情况,确保输出结果的正确性

参考修复后的核心逻辑片段

# 仅展示核心修改部分,其余代码可保留原有逻辑
i = 1
while i < 250:
    pyMatches = []
    # 每次迭代清空全局队伍参赛记录
    round_team_map = {} # 替换原来的g[y],key为轮次y,value为该轮次参赛队伍ID列表
    errors = 0
    matches = [] # 每次迭代清空比赛列表
    # 读取比赛文件逻辑不变
    with codecs.open ('matches.txt', 'r', encoding='utf-8') as f:
        csv_reader = csv.reader(f, delimiter=',')
        for row in csv_reader:
            matches.append(row)
    numGames = len(matches)
    total_round = numGames // numCourt
    random.shuffle(matches)
    # 调整循环顺序:先轮次,后场地
    for y in range(1, total_round + 1):
        round_team_map[y] = []
        for x in range(1, numCourt + 1):
            maxTry = 150
            Try = 0
            valid = False
            while Try < maxTry:
                Try += 1
                t1_id = matches[0][2]
                t2_id = matches[0][3]
                # 同轮次不能重复参赛
                if t1_id in round_team_map[y] or t2_id in round_team_map[y]:
                    random.shuffle(matches)
                    continue
                # 上一轮不能参赛
                if y > 1:
                    if t1_id in round_team_map[y-1] or t2_id in round_team_map[y-1]:
                        random.shuffle(matches)
                        continue
                # 满足条件直接退出
                valid = True
                break
            # 统计错误
            if not valid:
                errors +=1
            # 记录参赛队伍
            t1_id = matches[0][2]
            t2_id = matches[0][3]
            round_team_map[y].append(t1_id)
            round_team_map[y].append(t2_id)
            # 写入结果逻辑不变
            matches[0].append(x)
            matches[0].append(y)
            matchinfo = ",".join(matches[0])
            pyMatches.append(matchinfo)
            matches.pop(0)
    # 其余保存最优结果逻辑不变

内容的提问来源于stack exchange,提问作者Erik Nilsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:48:00