algorithm - 安排 16 队 1v1 比赛,6 种不同的比赛类型

标签 algorithm combinations combinatorics schedule sports-league-scheduling-problem

我的任务是为公司的团队比赛制定日程。最初我认为这非常简单,但我在想出有效的解决方案时遇到了一些麻烦。以下是需要满足的事实:

  • 共有 16 支队伍
  • 有 6 种不同的 1v1 游戏可供玩
  • 每支球队必须参加全部 6 种游戏类型
  • 任何两支球队都不能交手两次
  • 团队可以进行 8 个可用的“回合”或“时段”。这意味着一支球队将有两轮休息且不参加比赛
  • 任何游戏类型不得在同一轮中玩两次

这不是循环赛,因为所有球队都不会互相比赛。它有点类似于 Swiss Tournament ,但受到所有球队都必须参加的多种游戏类型的限制。我正在努力找出正确的算法来确定这个时间表,任何有助于解决问题的帮助或信息都会很棒。

最佳答案

我认为您可以使用本地搜索来实现此目的,但让我给您一个数学结构。

将16支队伍分为8支A队和8支B队。每支 A 队将与除 2 支 B 队之外的所有球队进行比赛。每个 B 队将与除 2 个 A 队之外的所有球队进行比赛。

此构造需要两个相互正交的 8x8 拉丁方,例如,

abcdehfg
badchegf
cdabgfhe
dcbafgeh
ehgfabdc
hefgbacd
fghedcab
gfehcdba

abcdefgh
cdabhgfe
efhgabdc
hgefcdba
dcbaghef
badcfehg
feghbacd
ghfedcab

按 A 团队对行进行索引,按 B 团队对列进行索引。第一个拉丁方的条目指定 A 队将与 B 队竞争的事件。其中两个字母被视为休息。根据拉丁方的性质,每个团队只完成每项事件一次(并休息两次)。

第二个拉丁方的条目表示 A 队与 B 队比赛(或双方休息)的时间。根据拉丁方的性质,每个团队在每一轮中做一件事。根据相互正交拉丁方的性质,每个事件在每一轮中恰好发生一次。

在 Python 3 中:

import string


def latin8a(i, j):
    return i ^ j


def latin8b(i, j):
    b = i >> 2
    return (i << 1) ^ (b << 3 | b << 1 | b) ^ j


a_teams = string.ascii_uppercase[:8]
b_teams = string.ascii_uppercase[8:16]
for i in range(8):
    print()
    print('Round', i + 1)
    for j in range(6):
        print(a_teams[latin8a(i, j)], 'vs', b_teams[latin8b(i, j)],
              'in game type', string.ascii_lowercase[j])

输出:

Round 1
A vs I in game type a
B vs J in game type b
C vs K in game type c
D vs L in game type d
E vs M in game type e
F vs N in game type f

Round 2
B vs K in game type a
A vs L in game type b
D vs I in game type c
C vs J in game type d
F vs O in game type e
E vs P in game type f

Round 3
C vs M in game type a
D vs N in game type b
A vs O in game type c
B vs P in game type d
G vs I in game type e
H vs J in game type f

Round 4
D vs O in game type a
C vs P in game type b
B vs M in game type c
A vs N in game type d
H vs K in game type e
G vs L in game type f

Round 5
E vs L in game type a
F vs K in game type b
G vs J in game type c
H vs I in game type d
A vs P in game type e
B vs O in game type f

Round 6
F vs J in game type a
E vs I in game type b
H vs L in game type c
G vs K in game type d
B vs N in game type e
A vs M in game type f

Round 7
G vs P in game type a
H vs O in game type b
E vs N in game type c
F vs M in game type d
C vs L in game type e
D vs K in game type f

Round 8
H vs N in game type a
G vs M in game type b
F vs P in game type c
E vs O in game type d
D vs J in game type e
C vs I in game type f

关于algorithm - 安排 16 队 1v1 比赛,6 种不同的比赛类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972267/

相关文章:

python - 是否可以使用递归技术编写组合函数?

c - 存储和调用动态数组中的值时出错 : program output not as expected

javascript - 如何找到最佳数字组合以获得最大和?

algorithm - 如何计算可能的不同序列的数量?

algorithm - trominoes 算法的复杂性

java - 给定正数的所有数字的总和

algorithm - 如何用链表实现一个不相交集的数据结构?

python - 如何找到在 Blackjack 中获得 21 的方法数?

c++ - 遍历所有可能的组合

r - R 中是否有一种有效的方法将矩阵 M2 的每一行 "paste"到矩阵 M1 的每一行以获得所有可能的组合?