我正处于网站的规划阶段,会定期将两个用户聚集在一起。
池中的每个人都将具有在匹配过程中使用的多个首选项,例如他们喜欢什么类型的音乐,以及他们可用的一周中的哪几天。出于本项目的目的,如果偏好是特定的,我想分配更高的权重/匹配优先级;也就是说,两个只喜欢“科幻小说”的人比仅仅把两个人“完全结合上述”的人组合在一起更好。我认为标准的贪婪匹配算法可能会有效,但有没有更高效的算法?
答案 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 climbing或genethic 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)=0
或u(p1,p2)=1
]实际上是maximal matching problem,即NP-Hard 3}},因此没有已知的多项式解决方案来解决这个问题,并且可能会使用如上所述的启发式解决方案。
请注意,如果您的图表为bipartite [即你不能将男性与男性/女性与女性相匹配],这个问题可以在多项式时间内解决。更多信息:matching in bipartite graphs