排列组合的唯一性

时间:2017-01-30 17:04:57

标签: algorithm unique combinations permutation

我正在尝试创建一些伪代码来为这种情况生成可能的结果:

有一场锦标赛正在进行,每场比赛中所有参赛者都与其他不同球队的球员在一起。

考虑到x个数量的球队,每支球队的球员数量确切。对于规模为r的小组,你可以只有一个队员中的一个队员,并且该队员必须没有与之前几轮中的任何其他队员一起玩过,可能会有什么结果。

示例:4支球队(A-D),每支球队4名球员,每组4名球员。

可能的分组是:(正确的团队约束)

A1, B1, C1, D1
A1, B3, C1, D2

但不是:(违反相同的团队约束)

A1, A3, C2, D2
B3, C2, D4, B1

但是,唯一性约束在此分组中起作用

A1, B1, C1, D1
A1, B3, C1, D2

虽然它确实遵循了与不同球队比赛的限制,但它打破了与不同球员比赛的独特性规则。在这种情况下,A1用C1

分组两次

在一天结束时,伪代码应该能够创建类似下面的内容

Round 1   Round 2   Round 3   Round 4
 a1 b1     a1 d4     a1 c2     a1 c4
 c1 d1     b2 c3     b4 d3     d2 b3

 a2 b2     a2 d1     a2 c3     a2 c1
 c2 d2     b3 c4     b1 d4     d3 b4

 a3 b3     a3 d2     a3 c4     a3 c2
 c3 d3     b4 c1     b2 d1     d4 b1

 a4 b4     a4 d3     a4 c1     a4 c3
 c4 d4     b1 c2     b3 d2     d1 b2

在示例中,您会看到在每一轮中没有任何玩家与另一个玩家分组。

1 个答案:

答案 0 :(得分:1)

如果团队中的队员数量是主要力量(2,3,4,5,7,8,9,11,13,16,17,19等),那么这是一个创建的算法基于有限仿射平面的最大轮数的计划。

我们在有限域GF(n)中工作,其中n是团队中的球员数量。 GF(n)有自己的乘法概念;当n是素数时,它是乘法mod n,当n是某个素数的较高幂时,它是单变量多项式的乘法,是一个适当程度的不可约多项式。每个团队由GF(n)的非零元素标识;让团队标识符集合为T.每个团队成员由T×GF(n)中的一对标识。对于GF(n)的每个非零元素r,圆r的组是

String str = cursor.getString(cursor.getColumnIndex("column_name"));

其中 int position = cursor.getColumnIndex("column_name"); enter code here {{(t, r*t + c) | t in T} | c in GF(n)}, 分别表示GF(n)中的乘法和加法。

Implementation in Python 3

此问题与Social Golfer Problem密切相关。社交高尔夫球手的问题是,如果每个球员每天在g组大小s(n = g×s)中进行一次比赛,那么他们可以安排多少天,这样任何球员都不会多次与其他球员比赛?< / p>

寻找社交高尔夫球手问题实例解决方案的算法是约束求解器和数学结构的拼凑而成,它们并没有令人满意地解决很多情况。如果团队中的玩家数量等于团队规模,那么可以通过将第一天的时间表解释为团队分配然后使用剩余的时间表来得出此问题的解决方案。可能还有其他结构。