多线程排列算法

时间:2012-03-27 03:18:39

标签: algorithm optimization matching

让我以小小说故事的形式描述问题。

故事

在一个勇敢的新世界中,新城市将在几天内建成,只需要填充。此外,没有更长时间无聊的招聘流程,没有采访和主观决策 - 每个人都经过多次测试,他们的结果被用来找到最好的员工。

当新城市建成时,公司的数量会在那里设置办公室,并要求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)

但是,当然,这种算法具有非常大的计算复杂度。使用缓存检查结果进行动态编程会有所帮助,但这仍然太慢。

我在考虑某种总是收敛的条件优化算法,但是我并不熟悉这个领域以找到合适的算法。

那么,有更好的算法吗?

0 个答案:

没有答案