【问题标题】:Randomly matching users随机匹配用户
【发布时间】:2023-03-08 05:30:01
【问题描述】:

我正在尝试考虑一种算法,该算法根据一些用户定义的属性(位置、兴趣等)随机配对用户。许多应用和游戏都实现了类似的算法,例如,Tinder(流行的约会移动应用)根据用户的位置、性别和年龄随机匹配用户。但是,对于 Tinder,两个用户彼此“配对”并不重要。然而,我正在尝试将用户配对以进行某种即时通信和交互。

问题是我不知道从哪里开始。如果它已经完成了这么多次,或者至少使用另一个实现作为参考,我不想重新发明轮子。不过,我的 Google 搜索并不丰富,很可能是因为不完全知道要搜索什么,例如特定的算法名称。

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

到目前为止我的想法:

存储/连接

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

搜索

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

加权算法

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

【问题讨论】:

  • 嗯,投了反对票,但是,没有评论他们为什么投反对票。赶上潮流?有趣的是,StackOverflow 变得更多的是关于声誉点以及它带来的错误的智力和重要性,而不是问题和答案(它是从中成立的)。如果您不理解某个问题或需要更多信息,您可以发表评论。如果你不知道答案,你不必提供一个!你对一个问题的看法,比如“它很琐碎”,是无关紧要的。该网站不是为了养活自我,而是为了提问和回答问题。
  • 因为我昨天很着急,没有机会解释为什么我对此投了反对票:我觉得这个问题太宽泛了(并标记为这样)。如果你问的是更具体的问题,而不是在我看来像一个想法产生的问题,那么它会更适合 SO。
  • 这是可以理解的,我很欣赏你的评论。我会在下一个问题中考虑到这一点。

标签: algorithm random match


【解决方案1】:

这是我目前所拥有的。

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)

该算法足以进行单向匹配(如果您允许设置的属性具有不同的长度,那么用户 1 可能与用户 2 匹配得非常好,但用户 2 可能与用户 1 不匹配,令人惊讶的是)。因此,对于双向匹配,您需要调整算法。例如,也许您可​​以执行从 User1 到 User2 和从 User2 到 User1 的匹配算法,然后平均这些值以获得用户之间的总双向匹配值。

关于如何执行算法(将用户分成两个表,主动和被动,允许主动用户对被动用户执行算法并发送连接请求,将用户添加到池中并让服务器对每个用户组合执行算法,或其他方式),我还没有找到太多关于哪种方法是最佳方法的信息。所以我想这取决于偏好、环境和效率。

【讨论】:

    【解决方案2】:

    如果您想要随机分配,解决方案很简单。如果你想要别的东西,你需要先说明你有什么标准来决定如何对匹配进行排名;你已经开始了这个过程,但是在你能说明什么你正在寻找之前,决定如何完成它将会是很多浪费的努力。

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

    如果您可以为每个可能的配对计算一个分数,您可以这样做:计算所有这样的配对分数。反复:取得分最高的一对并将这两个从池中删除。这将问题简化为集合操作问题。

    【讨论】:

    • 这个问题更多的是关于算法本身而不是细节。例如,我是否使用体重、身高、年龄、性别属性或仅使用年龄和性别属性并不特别重要。如果我有一个算法基础,我可以在等式中添加任何细节,只要我这样做正确。例如,使用“加权算法”,我可以看到需要考虑的三种不同类型的属性:精确、范围和相似。所以,我需要一个算法,可以得到每种类型的加权值,然后得到所有属性的总值。
    • 另外,我分配给哪些属性的权重是无关紧要的,以后添加也是微不足道的。
    • 算法是如何获得可接受的匹配集(如果有可接受的,那么它是微不足道的)。听起来您希望每个用户都有一个权重,由(待定)计算。给定一组权重,什么是可接受的匹配,什么不是?如果你不能回答这个问题(而且我还没有看到这样的答案),那么你就没有算法。
    • 我明白了,您无法理解这个问题。没关系,让我试着为你分解一下。首先,“什么是可接受的匹配,什么不是?”:没有“可接受的匹配”,而是它们匹配程度的问题。如果用户 1 与用户 2 共享属性 A,则这是一个属性的匹配,因此一个属性乘以它的加权值加上所有其他匹配的属性乘以它们的加权值将等于这些用户的匹配程度。唯一需要考虑的值类型是“范围”和“相似”。
    • 对于那些属性,我认为可以接受的与算法无关(就像方程中的变量,一旦知道我就可以插入它的值)。二、“计算(待定)”:正是!问题是要求提供匹配的算法。如果您在理解问题方面需要更多帮助,请告诉我。但截至目前,您的“答案”更多的是评论或问题本身,并没有为回答我的问题提供任何见解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2018-12-17
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多