1

我有一张桌子,上面有一组球队,他们需要与其他球队打多少场比赛,如下所示:

匹配表示例

在这张表中,a、b、c、d 队各打两场,另一组各打一场,每队共打 10 场。我需要根据此表创建每周对战时间表(例如:第 1 周 - a vs b、c vs d 等),以便所有比赛将在 10 周内进行,每支球队每周进行一场比赛. 换句话说,我需要知道每支球队在 10 周内每周打哪支球队,以便每支球队打 10 场比赛。没有要考虑的家/外地。

编辑:还有一点需要注意的是,每支球队每周都将在同一天比赛,所以基本上它将这些比赛安排在 10 天之内,每支球队在 10 天的每一天都打一场比赛。

我很难找到一个好的方法来做到这一点,所以如果有人对算法/包有任何建议或者可以向我指出一些资源(我的首选语言是 python),我将非常感激。

提前致谢!

4

3 回答 3

1

一种非常简单的方法是生成组合,然后添加双打,如下所示:

from itertools import combinations

teams = "abcdefgh"

possible_games = combinations(teams, 2)

doubles = {"a":("b", "c", "d"), "b":("c", "d"), "c":("d",), "e":("f", "g", "h"), "f":("g", "h"), "g":("h",)}
all_doubles = {(k, v) for k, values in doubles.iteritems() for v in values}
print all_doubles

games = list(possible_games)
games += [g for g in games if g in all_doubles]
print games, len(games)

这留下了关于实际日程安排的问题 - 你需要确保(我相信)例如团队 A 不会连续打 7 天然后闲置一周,但我认为以上应该是一个好的开始。

于 2018-08-21T02:11:27.270 回答
0

您可以在前 7 天进行第一轮循环赛,这样每支球队都会与其他球队交手一次。然后在最后3天,做两个单独的循环赛,让abcd中的队伍再次对战,efgh中的队伍再次对战。更多关于循环赛的信息:

# a table is a simple list of teams
def next_table(table):
  return [table[0]] + [table[-1]] + table[1:-1]
  # [0 1 2 3 4 5 6 7] -> [0 7 1 2 3 4 5 6]

# a pairing is a list of pairs of teams
def pairing_from_table(table):
  return list(zip(table[:len(table)//2], table[-1:len(table)//2-1:-1]))
  # [0 1 2 3 4 5 6 7] -> [(0,7), (1,6), (2,5), (3,4)]

# a team is an element of the table
def round_robin(table):
  pairing_list = []
  for day in range(len(table) - 1):
    pairing_list.append(pairing_from_table(table))
    table = next_table(table)
  return pairing_list

def get_programme():
  first7days = round_robin(list('abcdefgh'))
  last3days_abcd = round_robin(list('abcd'))
  last3days_efgh = round_robin(list('efgh'))
  return first7days + [a+e for a,e in zip(last3days_abcd, last3days_efgh)]

print(get_programme())
# [[('a', 'h'), ('b', 'g'), ('c', 'f'), ('d', 'e')],
#  [('a', 'g'), ('h', 'f'), ('b', 'e'), ('c', 'd')],
#  [('a', 'f'), ('g', 'e'), ('h', 'd'), ('b', 'c')],
#  [('a', 'e'), ('f', 'd'), ('g', 'c'), ('h', 'b')],
#  [('a', 'd'), ('e', 'c'), ('f', 'b'), ('g', 'h')],
#  [('a', 'c'), ('d', 'b'), ('e', 'h'), ('f', 'g')],
#  [('a', 'b'), ('c', 'h'), ('d', 'g'), ('e', 'f')],
#  [('a', 'd'), ('b', 'c'), ('e', 'h'), ('f', 'g')],
#  [('a', 'c'), ('d', 'b'), ('e', 'g'), ('h', 'f')],
#  [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]]
于 2021-10-18T09:03:22.913 回答
0

要实现循环赛,请在所有游戏中创建第一轮。想象一下,上一场比赛除主队外的所有球队都像链条一样相连。顺时针旋转这条链(总共 nr 个团队减去 2 次) 像这样

第一回合

第 1 队 - 第 2 队
 | |
第 5 队 - 第 3 队
       \ |
第 6 队 - 第 4 队

第二轮

第 5 队 - 第 1 队
  | |
第 4 队 - 第 2 队
       \ |
第 6 队 - 第 3 队

等适用于所有数量的团队。如果是奇数队,只需删除每轮的最后一场比赛。由你来编写算法。我很久以前做过。

于 2021-10-30T11:57:49.677 回答