通过参数获取两个对象之间的匹配百分比

时间:2013-06-15 07:30:15

标签: c# algorithm

我想创建一个程序来自动化我今天手动完成的流程。 我很抱歉,如果解决方案似乎很容易,我只是不想考虑专门针对我的问题的新算法,因为我确信有人已经考虑过它。 我的情景是这样的: 我有正在寻找工作的候选人名单,我有工作清单。 对于每个候选人,我都知道他正在寻找的工作的以下要求。像:

  1. 薪酬
  2. 工作地点
  3. 公司规模(大/小)
  4. 在手动过程中,我所做的是将候选者的需求参数与作业的需求参数进行匹配,并“返回”似乎适合候选者的作业(它不必完全匹配)。 当然,我正在考虑候选人的要求是“很高兴”或“必须拥有”。

    我正在搜索一种算法,该算法返回每个候选人与每个工作之间的拟合百分比。 有人可以指点我这样的匹配算法的任何名称。

    由于

2 个答案:

答案 0 :(得分:2)

我的建议是将每个对象转换为三维空间中的向量,然后在两个向量(对象)之间找到Euclidean distance

  • 首先,将工资位置尺寸分配给 x y z 轴。
  • 然后将属性映射到轴的[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。

所以,举一个例子: John 想要一份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

所以结论是John和Peter比John和Mike更接近。

你可以做的另一件事是为每个轴引入一些常量来强调它的重要性(例如,位置比公司规模更重要),所以在公式中你可以做类似的事情:

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

答案 1 :(得分: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;
}