我正在尝试为足球小组赛阶段编写算法。 例如:我在舞台上有4支队伍。
teams = ['team1', 'team2', 'team3', 'team4']
然后我得到了所有独特的对
import itertools
team_pairs = list(itertools.combinations(teams, 2))
我的team_pairs是团队之间的唯一匹配
[('team1', 'team2'), ('team1', 'team3'), ('team1', 'team4'), ('team2', 'team3'), ('team2', 'team4'), ('team3', 'team4')]
现在。我怎么能创造所有轮次? 例如:
('team1', 'team2') ('team3', 'team4')
('team1', 'team3') ('team2', 'team4')
('team1', 'team4') ('team2', 'team3')
以及如何为6支球队或7支球队做到这一点? 请帮忙!!!
我解释说不好:
我有11支球队。然后我把它们分成几组。 我有:
在每个小组中,小组必须与小组中的所有小组一起玩。 让我们成为一组,团队是:
teams = ['team1', 'team2', 'team3', 'team4']
胜利--3分
草案1点
松散 - 0分
他们不能同时扮演所有人。
他们正在玩3天。
* first day - team1 vs team2 and team3 vs team4
* second day - team1 vs team3 and team2 vs team4
* third day - team1 vs team4 and team2 vs team3
然后我可以总结点数。
但我实际上并不了解如何将我的小组(我的team_pairs)分成几天,以及哪支球队在哪一天比赛。
答案 0 :(得分:2)
问题可以看作exact cover问题,可以像Algorithm X的数独游戏一样解决,其中网络上有Python implementations。
需要涵盖的集合包括:
对于四支球队来说是:
A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3, AB, AC, AD, BC, BD, CD
其中B3
表示团队B
在3
天播放,BD
表示团队B
扮演团队D
。
可用的子集都是匹配所有匹配日的匹配对,对于四个团队是:
AB1: A1, B1, AB
AB2: A2, B2, AB
AB3: A3, B3, AB
AC1: A1, C1, AC
...
CD3: C3, D3, CD
解决这个问题会产生很多可能的固定装置,基本上是球队和比赛日的排列。选择一个,按比赛日排序并播放。
如果团队数量奇数,则没有解决方案。添加一个空团队作为虚拟,不要播放其中一个边是虚拟的匹配。