基本上我的工作有固定数量的职位,例如3或6,N个申请人。
这项工作需要一些技能,比如技能a,b,c,... z。
申请人有一些技能,但可能不是所有技能。
我正在努力做的是构建一个算法来匹配3或6个申请人,这样他们的综合技能可以满足所有情况下工作所需的技能。乐观地实现所有这些,但最坏的情况是尽可能多的
如果这与任何类型的算法相似或相同,请告诉我,我无法弄清楚如何研究它。
我已经尝试过一种解决方案,例如添加具有最多技能的人,然后尝试找到拥有最多技能的人1并不具备该工作所需的人。但是,如果解决方案是人与中等人的组合,那就会分崩离析。技能数量。
我还想过将每个申请人的技能转化为二进制1或0,以表示他们是否拥有它,但我正在努力将其转化为有用的东西。我认为这样做可能会走上正轨。
答案 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。也可能完全贪婪,并选择具有最多技能的申请人作为我们的第一个申请人。