Algorithm 排列组合中的唯一性

Algorithm 排列组合中的唯一性,algorithm,unique,combinations,permutation,Algorithm,Unique,Combinations,Permutation,我试图创建一些伪代码来生成此场景的可能结果: 有一场比赛正在进行,在每一轮比赛中,所有参加比赛的球员都与不同球队的其他球员组成一个小组 给定x个队的数量,每个队正好有n个球员。对于大小为r的团队,如果每个团队只能有一名球员,并且该球员必须在前几轮中没有与任何其他球员一起比赛,那么可能的结果是什么 示例:A-D组4人,每组4人,每组4人 可能的分组是:正确的团队约束 A1, B1, C1, D1 A1, B3, C1, D2 A1, A3, C2, D2 B3, C2, D4, B1 但不是:

我试图创建一些伪代码来生成此场景的可能结果:

有一场比赛正在进行,在每一轮比赛中,所有参加比赛的球员都与不同球队的其他球员组成一个小组

给定x个队的数量,每个队正好有n个球员。对于大小为r的团队,如果每个团队只能有一名球员,并且该球员必须在前几轮中没有与任何其他球员一起比赛,那么可能的结果是什么

示例:A-D组4人,每组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, 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

在本例中,您可以看到,在每一轮中,没有一名球员与前一名球员分组。

如果团队中的球员人数是素数幂2、3、4、5、7、8、9、11、13、16、17、19等,那么下面是一个基于有限仿射平面创建具有最大轮数的时间表的算法

我们在有限域n中工作,其中n是团队中的球员数量。GFn有自己的乘法概念;当n是素数时,它是乘法模n,当n是某个素数的高次幂时,它是一元多项式的乘法模某个适当次数的不可约多项式。每个团队由GFn的非零元素标识;让团队标识符集为T。每个团队成员由T×GFn中的一对标识。对于GFn的每个非零元素r,轮r的群为

{{(t, r*t + c) | t in T} | c in GF(n)},
其中*和+分别表示GFn中的乘法和加法

这个问题与环境问题密切相关。社交高尔夫球手的问题是,假设n名球员每天在大小为sn=g×s的g组中打一次球,那么他们可以安排多少天,这样就不会有球员与任何其他球员打超过一次球


社交高尔夫问题的求解算法是约束求解器和数学构造的拼凑,它们不能令人满意地解决很多情况。如果团队中的玩家数量等于团队规模,那么可以通过将第一天的日程安排解释为团队任务,然后使用日程安排的其余部分来得出该问题的解决方案。可能还有其他的构造。

@DavidEisenstat你不知道我在谷歌上搜索过的所有不同的搜索结果,也没有看到这个。谢谢,我来看看,嗯,不太会打社交高尔夫。@Davidisenstat看起来很像。唯一的区别是,在我的场景中,所有玩家每天都必须玩。@Davidisenstat目前正在尝试查看他们使用的算法,因为从我读到的内容来看,他们可以切换每天的分组数和玩家数量。因此,最好的方法是根据上一轮/当前日程安排进行下一轮/天的切换?@KelseyAbreu你可以在少量的回合中进行切换,但一般来说,你需要提前安排整个事情。我想我仍然不知道如何确保它的独特性。你能告诉我在我的例子的第一轮之后我会做些什么吗?我仍然对此很困惑。我尝试过编程,但似乎无法得到正确的答案。更具体地说,是组的算法。我只是不明白如何去编程。@KelseyAbreu它涉及其中,特别是对于更高的素数幂,如果你不使用像SageMath这样的大型库的话。当我有机会从头开始实现时,我会打电话给你。