Python(足球比赛算法问题)

3

我正在尝试编写关于足球小组赛的算法。 例如:我有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支队伍,我把它们分成了若干组:

  • 第一组:['team1', 'team2', 'team3', 'team4']
  • 第二组:['team1', 'team2', 'team3', 'team4']
  • 第三组:['team1', 'team2', 'team3']

每个小组内的队伍都要和组内的所有其他队伍进行比赛。以其中一个小组为例,它包括以下几支队伍:

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)拆分,并确定哪个团队在哪一天参赛。


3
请阅读http://sscce.org,并提供一个代码示例,展示您目前所尝试的内容,说明您遇到了什么问题或者不理解的地方。 - zmo
你对"rounds"的定义非常模糊。你到底想要实现什么,目前进展如何? - OBu
轮次是比赛日,每个团队在一场“n-1”天的单循环比赛中与其他所有团队比赛,并且每个团队在每个轮次都要进行比赛。(当团队数量为偶数时,后者显然是可能的。如果团队数量为奇数,则应该有一个虚拟团队。与虚拟团队比赛意味着:该团队在该轮次没有比赛。) - M Oehm
生成所有排列或在链接选择中调节日期编号 - Khaled.K
1个回答

3
这个问题可以看作是一个精确覆盖问题,并且可以像数独一样使用X算法进行解决,网络上有Python实现可用。
需要覆盖的集合包括:
- 每个团队和每个比赛日的组合 - 每个比赛配对
对于四支球队,这些集合如下:
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

解决这个问题会有很多可能的设备,基本上是团队和比赛日的排列组合。选择一个,按比赛日排序并进行比赛。
如果有奇数个团队,则没有解决方案。添加一个空团队作为虚拟对象,并不参加其中一方是虚拟对象的比赛。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接