我想创建一个程序来自动化我今天手动完成的流程。 我很抱歉,如果解决方案似乎很容易,我只是不想考虑专门针对我的问题的新算法,因为我确信有人已经考虑过它。 我的情景是这样的: 我有正在寻找工作的候选人名单,我有工作清单。 对于每个候选人,我都知道他正在寻找的工作的以下要求。像:
在手动过程中,我所做的是将候选者的需求参数与作业的需求参数进行匹配,并“返回”似乎适合候选者的作业(它不必完全匹配)。 当然,我正在考虑候选人的要求是“很高兴”或“必须拥有”。
我正在搜索一种算法,该算法返回每个候选人与每个工作之间的拟合百分比。 有人可以指点我这样的匹配算法的任何名称。
由于
答案 0 :(得分:2)
我的建议是将每个对象转换为三维空间中的向量,然后在两个向量(对象)之间找到Euclidean distance。
[0, 1]
间隔。例如,如果您的最低工资为1'000,最高工资为10'000,那么您将映射:
映射位置很难,但是假设您有一个地图网格,并根据地理位置为网格的每个补丁分配一个值 - 较近的一个具有相似的值。例如,美国各州为我们提供了一个很好的例子:
映射公司规模,例如:
所以,举一个例子: 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;
}