根据偏好的相似性将两个元素(人)匹配在一起

时间:2011-11-17 20:52:03

标签: algorithm matching

我正处于网站的规划阶段,会定期将两个用户聚集在一起。

池中的每个人都将具有在匹配过程中使用的多个首选项,例如他们喜欢什么类型的音乐,以及他们可用的一周中的哪几天。出于本项目的目的,如果偏好是特定的,我想分配更高的权重/匹配优先级;也就是说,两个只喜欢“科幻小说”的人比仅仅把两个人“完全结合上述”的人组合在一起更好。我认为标准的贪婪匹配算法可能会有效,但有没有更高效的算法?

1 个答案:

答案 0 :(得分:1)

这不是那么简单,您需要创建一个实用程序函数,让您知道哪个更匹配。例如,哪个更好:
(1)一对匹配很好,另一对非常差。
(2)两对,平均匹配。

我建议使用一些经过充分验证的artificial intelligence工具来解决此问题。
首先,一些定义:

  • P={all persons}
  • S={all possibilities to match all people}
  • u:PxP->R成为对的评分函数:u(p1,p2)=their score as a match [当然取决于您的数据]
  • U:S->R成为整个匹配的评分函数:U(aMatch) = Sigma(u(p1,p2)) for each paired couple
  • next:S->2^S成为:next(S)={all possible matchings which are different from S by swapping two people only}

现在,通过上述定义,您可以使用steepest ascent hill climbinggenethic algorithm,这些都是经过验证的人工智能工具,可以获得良好的效果。

最陡峭的登山攀登 [SAHC]很简单,从随机匹配开始,做一个小改动,直到你达到无法进行局部改进的程度。这一点是局部最大值,也是最佳解决方案的候选者。使用不同的初始状态重新启动进程。
伪代码:

1. best<- -INFINITY
2. while there is more time
3. choose a random matching
4. NEXT <- next(s)
5. if max{ U(v) | for each v in NEXT} < U(s): //s is a local maximum
   5.1. if u(s) > best: best <- u(s) //if s is better then the previous result - store it.
   5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
   6.1. s <- max { NEXT }
   6.2. goto 4.
7. return best //when out of time, return the best solution found so far.

注1:此算法为anytime,这意味着当您给它更多时间时,它会获得更好的结果。如果您的时间 - >无穷大,算法最终将找到最佳解决方案。
注2:效用函数U只是一个建议,您也可以使用max{u(p1,p2) | for each pair in the match}或您认为适合的任何其他效用函数。

修改
即使是更简单的问题,即:两个人可以简单地“匹配”或“不匹配”[u(p1,p2)=0u(p1,p2)=1]实际上是maximal matching problem,即NP-Hard 3}},因此没有已知的多项式解决方案来解决这个问题,并且可能会使用如上所述的启发式解决方案。
请注意,如果您的图表为bipartite [即你不能将男性与男性/女性与女性相匹配],这个问题可以在多项式时间内解决。更多信息:matching in bipartite graphs