让我以小小说故事的形式描述问题。
在一个勇敢的新世界中,新城市将在几天内建成,只需要填充。此外,没有更长时间无聊的招聘流程,没有采访和主观决策 - 每个人都经过多次测试,他们的结果被用来找到最好的员工。
当新城市建成时,公司的数量会在那里设置办公室,并要求Super Mind为他们找到最佳员工给出一种方法来计算他们的得分 特定公司。在他们一边的人要求Super Mind为他们找工作。他们给了他公司名单,他们希望与相应的优先级一起工作。 Super Mind非常人性化,所以它的任务是找到安排,让人们找到他们想要的最好的公司,即使有些公司根本没有员工。
现在让我更正式地定义任务。
E
- 寻找工作的员工人数。 C
- 公司数量。S(e,c)
- 公司e
的员工c
得分。Pr(e,c)
- 公司c
在员工e
的个人“愿望清单”中的优先级。 P(c)
- 公司c
中可用的职位数量。 任务:获取以下条件下的(e, c)
元组列表:
S(e,c)
以上的员工应该始终先行(例如,如果公司c
中只剩下一个职位,并且有2名候选人,则应该保证得分较高的员工能够获得此职位位置)。我能想到的唯一能保证所有条件的算法如下。首先,我创建了从员工到公司(A(e,c,s,p)
)的所有可能应用程序的列表,其中s
是公司e
的员工c
得分,p
是该员工的公司优先事项。然后我按总分对所有应用程序进行排序,然后运行下一个递归过程:
def arrange(As, Ps, not_approved, approved):
# As - list of applications left
# Ps - map of type (company -> # of positions left)
# not_approved - set of not approved applications
# approved - set of approved applications (hold intermediate result)
if (empty(As))
return approved
a = head(As)
As_rest = tail(As)
if (cant_be_hired(a)) # if no places left in company from this application
return arrange(As_rest, Ps, not_approved + a, approved)
else if (highest_priority(a)) # if this application has highest of left priorities
return arrange(As_rest, Ps(c) - 1, not_approved, approved + a)
else
# if application can be accepted, but it has higher priorities left,
# check what will happen if we do not accept this application
check_result = arrange(As_left, Ps, not_approved + a, approved)
if (employee_is_hired_for_better_job(a, check_result))
# if employee can be hired to a job with higher priority,
# just return check_result - it is already an answer
return check_result
else
# otherwise accept this application and proceed for rest of them
return arrange(As_rest, Ps, not_approved, approved + a)
但是,当然,这种算法具有非常大的计算复杂度。使用缓存检查结果进行动态编程会有所帮助,但这仍然太慢。
我在考虑某种总是收敛的条件优化算法,但是我并不熟悉这个领域以找到合适的算法。
那么,有更好的算法吗?