安排两组人员访谈的算法

问题描述 投票:0回答:2

我有两组人 - Set A和Set B.两组都有相同的大小,比如n。

来自A组的人需要采访来自B组的m个人,反之亦然,其中m <n。你可以想象它是两组之间的匹配会话。

对于集合A和集合B中的每个人,他们已经与来自另一集合中的m个人预先匹配,使得没有预匹配是重复的。

如何安排m个时隙

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

任何帮助表示赞赏!

algorithm combinations permutation matching
2个回答
2
投票

您可以将预匹配表示为图形,其中两个集合的成员表示为节点,匹配表示为无向边缘。这将是一个二分图,因为A的任何成员都不与A的另一个成员匹配(对B来说也是如此)。

然后,您想要使用m颜色找到此图的边缘着色。边缘着色为每个边缘分配颜色两个,使得共享公共节点的两个边缘不具有相同的颜色。如果我们假设颜色代表时间段,那么这恰好转化为每个人在任何时候都只能进行一次面试的要求。

这个问题有多种算法。看看Wikipedia article的一些参考资料。


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到达A时,指针可以有一个额外的偏移量。或者,如果n更大,则可能(可能 - 变成毛茸茸的)具有该偏移量加上A的后半部分的非超过一步B旋转。只要B没有环绕,几乎任何事情都是可能的。与m相比,n越大,争夺的可能性就越大。

并且,最终,A和B不需要从1开始排序。它们可以是任何数字。

解决这个问题

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

如果没有,可以使用solver或Nico Schertlers答案中维基百科文章中提到的一些开口。就我而言,我通常懒得深入挖掘这样的东西,所以如果数据似乎不会爆炸太多,我喜欢尝试强力替代品。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.