根据他们的技能将申请人的组合与工作职位相匹配

时间:2014-06-27 20:37:36

标签: algorithm

基本上我的工作有固定数量的职位,例如3或6,N个申请人。

这项工作需要一些技能,比如技能a,b,c,... z。

申请人有一些技能,但可能不是所有技能。

我正在努力做的是构建一个算法来匹配3或6个申请人,这样他们的综合技能可以满足所有情况下工作所需的技能。乐观地实现所有这些,但最坏的情况是尽可能多的

如果这与任何类型的算法相似或相同,请告诉我,我无法弄清楚如何研究它。

我已经尝试过一种解决方案,例如添加具有最多技能的人,然后尝试找到拥有最多技能的人1并不具备该工作所需的人。但是,如果解决方案是人与中等人的组合,那就会分崩离析。技能数量。

我还想过将每个申请人的技能转化为二进制1或0,以表示他们是否拥有它,但我正在努力将其转化为有用的东西。我认为这样做可能会走上正轨。

2 个答案:

答案 0 :(得分:1)

这不是一种特定的算法,但针对这些问题的一种方法是使用约束求解器/优化器。例如,在Java中,您可以使用OptaPlanner

这些基本上是声明性系统,因此您不必解释算法,而是必须对问题进行编程。基本上描述了状态空间,以及对什么是或不是解决方案的约束。然后你运行它,它会告诉你它是否找到了解决方案以及它找到了什么解决方案。

答案 1 :(得分:0)

注意:这不是一个完整的解决方案,但我想分享一些注意事项。请尝试找到更好的解决方案。

因此,我们有n个申请人和一组m技能S = {s(1),s(2),...,s(m)}
为了我们的目的,每个申请人都是A S的一个子集,表征他/她的技能。
t是要选择的申请人数量(例如3或6)。

正如OP所说,我们可以将每个申请人的技能表示为一长串m,如果i属于{{1},则s(i)位置的字符为1 }},如果没有,则为0。

示例

A

减少申请人数

我们可以在申请人上定义以下顺序:给定两个申请人a1和a2,我们说S = {Programming, Accounting} Programming Accounting Applicant1 0 1 Applicant2 1 1 if {且仅当以下陈述为真时:a1 <= a2。在上面的示例中,我们有if a1 has a skill, then a2 also has it

现在我们可以使用此订单过滤我们的申请人:如果申请人a1是&#34;以下&#34;另一个申请人a2在我们的订单中,a1可以是discarder,因为选择a2将始终产生至少相同的结果。这可以在Applicant1 <= Applicant2步骤中完成。

非最佳,贪心算法

完成后,我会这样做:

O(n^2)

基本上,我会选择申请人r = string of lenght m filled with zeros choose an applicant a r = skills(a) best_applicant = null APPLICANT_LIST = new LIST APPLICANT_LIST.add(a) for(counter=0; counter < (t-1); counter ++) { foreach applicant b not in APPLICANT_LIST { if (count(skills(b) OR r) > count(r)) then r = (skills(b) OR r) best_applicant = b } APPLICANT_LIST.add(b) } 并从他/她的技能集a开始,然后搜索能够将最多技能添加到我现有集合中的申请人r { {1}}以便最大化它。我会将b添加到我的列表中,并重复此过程,直到我有一组r个申请人。所有这些都是在b步骤中完成的(因为t是不变的,我忽略了它)。 这种伪代码可能因编程目的而不正确(取决于语言,你可能想检查退出条件,空指针等),但我确信你明白了。

我担心这种方法并不总能产生最佳解决方案,如下例所示:

O(n^2)

如果要以t开头,他将永远无法达到最佳解决方案t = 3 a1 000000001111 a2 000011110000 a3 111100000000 a4 110111001101 。 这是我们为每个步骤的最佳解决方案支付的价格,但并未从全球视角考虑问题。

注意:在上面的示例中,选择不同的起始申请人不会有帮助,因为仍然会包含a4。也可能完全贪婪,并选择具有最多技能的申请人作为我们的第一个申请人。