随机匹配用户

时间:2015-03-19 17:25:46

标签: algorithm random match

我试图想出一种根据用户定义的属性(位置,兴趣等)随机配对用户的算法。许多应用程序和游戏都实现了类似的算法,例如,Tinder(流行的约会移动应用程序)根据用户的位置,性别和年龄随机匹配用户。虽然,对于Tinder来说,对用户和配对"并不重要。彼此。然而,我试图将用户配对以进行某种即时通信和交互。

问题是我不知道从哪里开始。如果已经多次完成或者至少使用另一个实现作为参考,我不想重新发明轮子。虽然,我的谷歌搜索资源丰富,很可能是由于不完全知道要搜索的内容,例如特定的算法名称。

如何实施加权随机用户匹配算法?最佳匹配算法会更好。我不希望你提供一个代码(除非它真的很容易),伪代码/理论或明确定义的库或实现的链接。

到目前为止我的想法是什么:

存储/连接

  • 将用户分为两个表:主动和被动。活动用户通过被动表执行随机搜索/配对算法。向匹配的被动用户发送匹配请求。被动用户接受第一个收到的匹配请求拒绝所有其他人。用户匹配进行通信,可以从表中删除。如果被动用户没有被选中,则可能需要超时用户#34;一段时间后,它可以成为活跃用户。

搜索

  • 活动用户根据活动用户位置设置范围等内容随机选择被动用户的设定数量。考虑被动用户从他们的位置设置范围?

加权算法

  • 为每个用户定义的属性分配重要性的特定权重。计算匹配属性的数量(类似或在范围内?)以及它们的权重组合在一起。根据用户的匹配值对用户进行排序。为最高匹配的被动用户执行存储/连接阶段。如果该用户接受匹配请求,则他们已连接,如果没有尝试下一个最高匹配的被动用户。如果没有建立连接,则启动整个算法。

2 个答案:

答案 0 :(得分:0)

这是我到目前为止所拥有的。

How would I implement a weighted random User matching algorithm?

实现这样的算法有很多部分。您需要一种方法来确定用户之间的相似性以及评估此相似性的方法。此外,您需要一种执行算法的方法,例如:所有用户进入池并且服务器进行匹配或者您是否将用户分开,一个执行操作而另一个等待匹配(如问题)。

至于确定用户之间的相似性,请查看Collaborative Filtering. This StackExchange问题和答案处理类似问题。协作过滤通常用于推荐系统(推荐您可能感兴趣的产品的电子商务网站),但算法的基础可用于匹配用户之间的相似性。

相似性评级取决于您选择使用的特定算法,但加权值是一种方法。在这种情况下,为用户包含的每个属性分配加权值,该加权值表示该值对算法的重要性。加权值越高,越重要。您认为更重要的加权值。该值本身没有意义,但相对于算法是有用的。类似地,分配给用户的总计算的相似值(应用了权重的整个算法的结果值)本身是没有意义的,但是当与具有计算值的其他用户相比时是有用的。

获得这些值后,您只需对用户进行排序(最高值最相似)然后连接即可。 但您究竟如何确定用户之间的相似性?一种方法是查看属性并查看它们是否相等。

例如,假设为所有用户分配了一个" likesMusic"属性是一个布尔值。要比较用户1和用户2之间的此属性,请查看它们是否相等:

if(User1.getLikesMusic() == User2.getLikesMusic()){
    return 1;
else{
    return 0;
}

值0可以在算法中用于不匹配,1可以用于完全匹配。然后,可以将返回的值乘以指定权重值的属性,并将其添加到所有其他属性计算中。这适用于匹配或不匹配的值,但可以在某种程度上匹配的值呢?例如,考虑一个属性" favFoods"这是一组用户最喜欢的食物。用户可以分享一些,所有或不喜欢的食物。

return (User1.getFavFoods().intersection(User2.getFavFoods()) / User1.getFavFoods().size());

上述伪代码通过获取集合之间的交叉值的数量并除以User1的设定长度来比较User2的最喜欢的食物与User1的相似程度。 注意:必须切换这些值以获得User1最喜欢的食物与User2的相似程度。这种方法的好处是它使我们保持在0和1之间的返回范围。这样我们可以保持我们的初始值1是精确匹配而0是不匹配的,并且它们之间的所有内容都会有点匹配。

这适用于集合和列表但是可以在范围内的值呢?事情变得复杂一点。例如,假设每个用户都有一个年龄属性。年龄越接近匹配越好。我们可以取两个年龄之间的差异,然后差异越大,匹配值越小。但是当差值变大时,匹配值会以什么速率变小?这个值,减少率,必须根据您的特定应用选择。例如,让我们说每两年差异一次,我们将相似度降低10%。由于1将是完全匹配,具有这种下降率,我们有:

return 1 - ((abs(User1.getAge() - User2.getAge()) / 2) * 0.1);

注意:您必须注意确保从1减去的值不超过1,因为我们不想要负数。

上述等式应涵盖您将遇到的大多数情况。现在,如果我们知道所有"类型"对于用户属性(精确,设置或范围),我们可以使用正确的公式来获取值V,乘以其权重W,并获得两个用户之间的总匹配值,M:

M = (V1 * W1) + (V2 * W2) + , ... , + (Vn * Wn)

这个算法对于单向匹配就足够了(如果你允许set属性有不同的长度,那么User1可能与User2非常匹配,但是User2可能与User1不匹配,令人惊讶)。因此,对于双向匹配,您需要调整算法。例如,您可以执行从User1到User2和User2到User1的匹配算法,并对这些值进行平均以获得用户之间的总双向匹配值。

至于如何执行算法(将用户分成两个表,主动和被动,允许活动用户在被动用户上执行算法并发送连接请求,将用户添加到池并让服务器对每个用户组合执行算法,或者另一种方式),我还没有找到关于哪种方法最好的信息。所以我猜它依赖于偏好,环境和效率。

答案 1 :(得分:-1)

如果您想要随机分配,解决方案是微不足道的。如果你想要别的东西,你需要先说出你决定如何排名匹配的标准;你已经开始了这个过程,但是在你能够拼出你想要的之前,决定 如何实现它将会耗费大量的精力。

更具体地说,这是一个算法:使用任何标准为每个用户分配数字分数;按该分数对列表进行排序;匹配每个连续的对。如果这不能产生令人满意的匹配项,请说明它违反的标准(因为我在您的问题描述中找不到任何标准)。

如果您可以为每个可能的配对计算得分,则可以改为:计算所有此类配对得分。反复:以最高分和&从池中删除这两个。这将问题简化为集合操作。