分布可以用NxN矩阵很好地表示,其中每行代表一个箱子。然后问题就是找到矩阵元素的一组排列,其中每对数字只共享一行一次。无论是哪一行都不重要,只要两个数字都被分配到同一个箱子里。
以下是满足N=8约束条件的3个排列示例:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
0 8 16 24 32 40 48 56 1 9 17 25 33 41 49 57 2 10 18 26 34 42 50 58 3 11 19 27 35 43 51 59 4 12 20 28 36 44 52 60 5 13 21 29 37 45 53 61 6 14 22 30 38 46 54 62 7 15 23 31 39 47 55 63
0 9 18 27 36 45 54 63 1 10 19 28 37 46 55 56 2 11 20 29 38 47 48 57 3 12 21 30 39 40 49 58 4 13 22 31 32 41 50 59 5 14 23 24 33 42 51 60 6 15 16 25 34 43 52 61 7 8 17 26 35 44 53 62不属于上述集合的排列:
0 10 20 30 32 42 52 62 1 11 21 31 33 43 53 63 2 12 22 24 34 44 54 56 3 13 23 25 35 45 55 57 4 14 16 26 36 46 48 58 5 15 17 27 37 47 49 59 6 8 18 28 38 40 50 60 7 9 19 29 39 41 51 61
由于第二个排列与第一个排列发生了多次冲突,例如它们在一行中都配对了数字0和32。
枚举三个是容易的,它包括一个任意排列、它的置换和一个矩阵,其中行由前一个矩阵的对角线组成。
我找不到产生更多集合的方法。这似乎是一个非常复杂的问题,或者是一个简单的问题,有一个不明显的解决方案。无论哪种情况,如果有人有任何想法如何在合理的时间内解决N=8情况,或者确定问题的正确学术名称,那么我将不胜感激。
如果你想知道它有什么用处,我正在寻找一个调度算法,用于具有8个缓冲区的交叉开关,它将流量传输到64个目的地。调度算法的这一部分与输入流量无关,并且在一些硬连线的目的地缓冲区映射之间循环切换。目标是使每对目标地址仅在循环期内竞争同一个缓冲区一次,并最大化该周期的长度。换句话说,每对地址尽可能少地竞争同一个缓冲区。
编辑:
以下是我拥有的一些代码。 CODE
它是贪心的,通常在找到第三个排列后终止。但至少存在一组N个排列满足问题。
另一种选择需要涉及选择排列I并查找排列(I+1..N),以检查排列I是否是由最大数量的排列组成的解的一部分。这将需要枚举所有排列来检查每个步骤,这是不可行的。