我试图想出一种根据用户定义的属性(位置,兴趣等)随机配对用户的算法。许多应用程序和游戏都实现了类似的算法,例如,Tinder(流行的约会移动应用程序)根据用户的位置,性别和年龄随机匹配用户。虽然,对于Tinder来说,对用户和配对"并不重要。彼此。然而,我试图将用户配对以进行某种即时通信和交互。
问题是我不知道从哪里开始。如果已经多次完成或者至少使用另一个实现作为参考,我不想重新发明轮子。虽然,我的谷歌搜索资源丰富,很可能是由于不完全知道要搜索的内容,例如特定的算法名称。
如何实施加权随机用户匹配算法?最佳匹配算法会更好。我不希望你提供一个代码(除非它真的很容易),伪代码/理论或明确定义的库或实现的链接。
到目前为止我的想法是什么:
存储/连接
搜索
加权算法
答案 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)
如果您想要随机分配,解决方案是微不足道的。如果你想要别的东西,你需要先说出你决定如何排名匹配的标准;你已经开始了这个过程,但是在你能够拼出你想要的之前,决定 如何实现它将会耗费大量的精力。
更具体地说,这是一个算法:使用任何标准为每个用户分配数字分数;按该分数对列表进行排序;匹配每个连续的对。如果这不能产生令人满意的匹配项,请说明它违反的标准(因为我在您的问题描述中找不到任何标准)。
如果您可以为每个可能的配对计算得分,则可以改为:计算所有此类配对得分。反复:以最高分和&从池中删除这两个。这将问题简化为集合操作。