安排两组人之间的采访的算法

时间:2019-04-09 14:23:21

标签: algorithm combinations permutation matching

我有两组人-设置A 设置B 。两组大小相同,例如 n

A族中的人需要采访 B族中的 m 个人,反之亦然,其中 m 。您可以想象这是两组之间的比赛。

对于 A组 B组中的每个人,他们已经与另一组中的 m 个人进行了预匹配,因此没有的比赛前是重复

如何安排 m 个时隙,使

    两组的
  • n 人中的每一个都在每个时隙中采访另一组中预先匹配的人
  • 没有人在同一时间进行两次采访
  • m 时段结束时,每个人都已经用他们的赛前比赛完成了所有采访

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以将预匹配项表示为图形,其中两个集合的成员表示为节点,而匹配项表示为无向边。这将是一个二部图,因为A的任何成员都不与A的另一个成员(与B相同)匹配。

然后,您想要找到带有m颜色的该图的边缘着色。边缘着色为每个边缘分配两个颜色,这样,共享公共节点的两个边缘都不会有相同的颜色。如果我们假设颜色代表时间段,那么这完全意味着每个人在任何时候都只能接受一次采访。

有多种算法可以解决此问题。看看Wikipedia article以获得一些参考。

答案 1 :(得分:0)

首先要创建匹配项

将数据集彼此相对放置,并在相对的插槽之间进行直线连接。第一次匹配是1:1。然后,对于剩余的每个m,向上(或向下)旋转B并重新进行直线连接。 n = 7且m = 1、2、3、4、5和6的示例(成对的一列是一个采访时间):

 │A B│  │A B│A B│  │A B│A B│A B│  │A B│A B│A B│A B│  │A B│A B│A B│A B│A B│  │A B│A B│A B│A B│A B│A B│ 
 ├───┤  ├───┼───┤  ├───┼───┼───┤  ├───┼───┼───┼───┤  ├───┼───┼───┼───┼───┤  ├───┼───┼───┼───┼───┼───┤ 
 │1 1│  │1 1│1 2│  │1 1│1 2│1 3│  │1 1│1 2│1 3│1 4│  │1 1│1 2│1 3│1 4│1 5│  │1 1│1 2│1 3│1 4│1 5│1 6│ 
 │2 2│  │2 2│2 3│  │2 2│2 3│2 4│  │2 2│2 3│2 4│2 5│  │2 2│2 3│2 4│2 5│2 6│  │2 2│2 3│2 4│2 5│2 6│2 7│ 
 │3 3│  │3 3│3 4│  │3 3│3 4│3 5│  │3 3│3 4│3 5│3 6│  │3 3│3 4│3 5│3 6│3 7│  │3 3│3 4│3 5│3 6│3 7│3 1│ 
 │4 4│  │4 4│4 5│  │4 4│4 5│4 6│  │4 4│4 5│4 6│4 7│  │4 4│4 5│4 6│4 7│4 1│  │4 4│4 5│4 6│4 7│4 1│4 2│ 
 │5 5│  │5 5│5 6│  │5 5│5 6│5 7│  │5 5│5 6│5 7│5 1│  │5 5│5 6│5 7│5 1│5 2│  │5 5│5 6│5 7│5 1│5 2│5 3│ 
 │6 6│  │6 6│6 7│  │6 6│6 7│6 1│  │6 6│6 7│6 1│6 2│  │6 6│6 7│6 1│6 2│6 3│  │6 6│6 7│6 1│6 2│6 3│6 4│ 
 │7 7│  │7 7│7 1│  │7 7│7 1│7 2│  │7 7│7 1│7 2│7 3│  │7 7│7 1│7 2│7 3│7 4│  │7 7│7 1│7 2│7 3│7 4│7 5│ 

不幸的是,上面的示例是最简单直接的方法。除此之外,还有许多其他方式,可能会导致大量不同的配对。例如,如果n,m为7,3,则可以旋转B数据集,每轮不是两个,而是一个。或者,在经过A的一半时,指向B的指针可能会有一个额外的偏移量。或者,如果n较大,则可能(可能-变得有毛)在A的后半部分具有该偏移量和除一个以外的其他步长。 B旋转。只要B不环绕,几乎所有可能。与m相比,n越大,争夺的可能性就越大。

最后,A和B不必从1开始对数字进行排序。它们可以是任何数字。

解决此问题

一如既往,了解数据会有所帮助。如果知道匹配最初是如何创建的,则有可能基于该知识来做一些捷径和结论。例如,如果我知道匹配是按照上述方式创建的,并且我知道n和m,那么我只需创建正确的表并对给定的匹配进行搜索/插入。

如果没有,则可以使用solver或Nico Schertlers答案的Wikipedia文章中提到的某些空缺。就我而言,我通常很懒惰地研究这种情况,因此,如果数据似乎爆炸不太多,我想尝试一下蛮力替代方案。

Bruteforce意味着创建所有可能的组合,然后过滤满足条件的组合。

不幸的是,这使SO回答很差(在浏览器中待处理两周),因为我现在没有时间研究解决方案。对不起。希望我以后能完成。