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。
修复建议
- 调整循环顺序:外层循环遍历轮次
y(共8轮),内层循环遍历当前轮次的场地x(共4块) - 修改冲突尝试循环:只要匹配到无冲突的首条比赛就立刻break跳出尝试循环
- 将
matches = []移动到i循环内部,每次迭代都清空旧的比赛列表 - 所有赛程排完后,单独加一轮全局校验逻辑,遍历所有比赛校验队伍是否存在同时参赛、连续参赛的情况,确保输出结果的正确性
参考修复后的核心逻辑片段
# 仅展示核心修改部分,其余代码可保留原有逻辑 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
相关产品推荐
相关产品推荐

