最小化元组数

2024-10-03 02:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是如何安排一个由小型比赛组成的联盟,每个比赛中有3支球队,这样每个球队与其他球队的比赛次数相同(>;0),比赛次数最少。你知道吗

如果n个队要进行一次比赛,则需要(n-1)+(n-2)+…+1场比赛。每场比赛由3场比赛组成。在7支球队的情况下,我们将有21场比赛。21 mod 3=0,所以每队比赛1次就足够了:

 (1, 2, 3)
 (2, 4, 6)
 (3, 4, 7)
 (4, 5, 1)
 (5, 7, 2)
 (6, 3, 5)
 (7, 1, 6)

如果我们再增加一支队伍,这样我们就有8支队伍,需要21+7=28场比赛。但是28 mod 3=1,所以我们需要让每支球队互相比赛3次,使之平衡。你知道吗

很容易创建完整的图形:

from itertools import combinations

tournaments = list(combinations(range(1,n+1),3))
games = [ [(x[0],x[1]),(x[0],x[2]),(x[1],x[2])] for x in tournaments ]

对于n=7,这将产生:

7! / (3!*(7-3)!) = 35

比赛。一般来说:

n! / (n!*(n-3)!)

然而,如上所示,对于n=7,只有7场比赛就足够了。测试所有的组合很快就会变得不切实际。对于n=7,我们已经看到最多有35个锦标赛,但是35个元素的幂集包含2^35=34359738368个组合。你知道吗

我正在寻找一种方法,要么减少到一个最低限度的完整的比赛集,或建设它自下而上。有什么想法吗?你知道吗


Tags: fromimportgtmod图形情况range次数