3

我想创建一个程序来自动化我今天手动执行的过程。如果解决方案似乎很简单,我深表歉意,我只是不想专门针对我的问题考虑新算法,因为我确信有人已经考虑过了。我的场景是这样的:我有正在寻找工作的候选人列表,并且我有工作列表。对于每个候选人,我都知道他正在寻找的工作的以下要求。喜欢:

  1. 薪水
  2. 工作地点
  3. 公司规模(大/小)

在手动过程中,我所做的是将这些候选人的需求参数与工作的需求参数进行匹配,并“返回”似乎适合候选人的工作(它不必完全匹配)。当然,我正在考虑候选人的要求是“很高兴拥有”或“必须拥有”。

我正在寻找一种算法,该算法返回每个候选人对每个工作的适合百分比。有人可以指点我这样的匹配算法的任何名称。

谢谢

4

2 回答 2

2

我的建议是将每个对象转换为 3-D 空间中的向量,然后找到两个向量(对象)之间的欧几里得距离。

  • 首先,将工资位置大小分别分配给xyz轴。
  • 然后将属性映射到[0, 1]轴的间隔。

例如,如果您的最低工资是 1'000,最高工资是 10'000,那么您将映射:

  • $ 1'000 -> x轴上的 0,
  • $ 10'000 -> 到x轴上的 1。

映射位置很难,但是假设您有一个地图网格,并且您根据地理位置为网格的每个补丁分配一个值 - 更接近的具有相似的值。例如,美国各州为我们提供了一个很好的例子:

  • 纽约 -> y轴上的 1.0,
  • 新泽西州 -> y轴上的 0.99,
  • ...
  • 加利福尼亚 -> y轴上的 0.1。

映射公司规模如下:

  • 在z轴上启动 -> 0.2 ,
  • ...
  • 多国-> z轴上的 1.0 。

因此,举个例子:约翰想要 9.000 的薪水,想要在纽约找到一份工作,并且想要在一家初创公司工作。他在 3D 空间中的向量是[0.82, 1.00, 0.1]彼得想要 5.500 的薪水,想要在新泽西找到一份工作,并且想要在一家非常大的公司工作 - [0.5, 0.99, 0.8]。最后,迈克想要一份 8.000 的薪水,在加利福尼亚找到一份工作,并且还想要一家初创公司—— [0.73, 0.1, 0.1]

根据 3D 空间中的欧几里得距离公式:

d(a, b) = sqrt((a1-b1)^2 + (a2-b2)^2 + (a3 - b3)^2)

Distance between John and Peter is: d(J, P) = 0.77
Distance between John and Mike is:  d(J, M) = 0.90

所以结论是约翰和彼得比约翰和迈克更接近。

您可以做的另一件事是在每个轴上引入一些常量以强调其重要性(例如,位置比公司规模更重要)因此在公式中您可以执行以下操作:

d(a, b) = sqrt((a1-b1)^2 + (C*a2 - C*b2)^2 + (a3 - b3)^2), where C = 10
于 2013-06-15T14:13:55.387 回答
0
similiarity(A,B) = 1 / (1 + (distance(A,B) / unit))

距离为 0 的情况:

similarity(A,A)
= 1 / (1 + (distance(A,A) / unit))
= 1 / (1 + (0 / unit))
= 1 / (1 + 0)
= 1.0
~ 100 %

距离无限的情况:

similarity(A,Z)
= 1 / (1 + (distance(A,Z) / unit))
= 1 / (1 + (infinity / unit))
= 1 / infinity
= 0.0
~ 0 %

代码:

JobComparison* compare (Job a, Job b)
{

    // define units based on measurement
    double unit1 = 1000.0;
    double unit2 = 100.0;
    double unit3 = 10.0;

    // calculate distance
    double d1 = abs(a.salary - b.salary);
    double d2 = distance(a.location, b.location);
    double d3 = abs(a.companySize - b.companySize);

    // calculate similiarity
    double p1 = 1 / (1 + (d1 / unit1));
    double p2 = 1 / (1 + (d2 / unit2));
    double p3 = 1 / (1 + (d3 / unit3));

    return new JobCompare(p1, p2, p3);

}

public class JobCompare
{
  public:
    double salarySimiliarity;
    double locationSimiliarity;
    double companySimiliarity;
}

public class Job
{
  public:
    double salary;
    Location location;
    double companySize;
}
于 2013-06-16T05:44:46.820 回答