2011-11-17 75 views
0

我正处于网站的计划阶段,它会定期将两个用户相互匹配。根据偏好的相似性匹配两个元素(人物)

池中的每个人将有多个在匹配过程中使用的偏好,例如,他们喜欢什么类型的音乐,以及他们每周有哪些日子。为了这个项目的目的,如果偏好是特定的,我想分配更高的权重/匹配优先权;即两个只喜欢“科幻小说”的人比仅仅将两个检查“上述所有”的人放在一起更好。我在想,一个标准的贪婪匹配算法可能会起作用,但是那里有更有效的算法吗?

+0

您需要为整个匹配提供评估函数。假设你有4人,这将是一个更好的匹配:(1)一对优秀比赛,另一个非常差。 (2)双方平均匹配 – amit

+0

我想尝试并最大化配对量。只要比赛是“可以接受的”,这个项目就没问题。我将如何着手编写这样一个评估函数? – maroonmed

+0

看到我的答案的编辑。这个问题被称为最大匹配问题,并且是NP-Hard,因此一个启发式解决方案可能是您最好的选择。 – amit

回答

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,因此没有已知的多项式解决这个问题的方法,并且可能会使用上面提出的启发式解决方案。
请注意,如果您的图形是bipartite [即你不能与男性/女性匹配男性],这个问题可以在多项式时间内解决。更多信息:matching in bipartite graphs

+0

即使使用非二部图中的权重,最大匹配实际上也可以使用例如Edmonds的匹配算法在多项式时间内求解。 “最小最大匹配”是关于找到最小匹配的最大匹配(即,不能添加边的那个匹配)。这与手头的问题没有任何关系。 –