根据喜欢和不喜欢将人们匹配在一起的算法



我有一个大约75人的小组。每个用户都喜欢或不喜欢其他 74 个用户。这些人需要分成大约15组不同大小(4到8人(。他们需要组合在一起,以便这些组只由彼此喜欢的人组成,或者至少尽可能多地。

我不确定解决这个问题的最佳算法是什么。非常感谢任何指针或伪代码!

这还不足以建议特定的算法。 我建议使用聚类和"集团"算法,但您仍然需要定义"最佳分组"指标。 "尽可能多",在权衡取舍和不确定的欲望面前,是没有意义的。 聚类分析算法将需要此指标来形成组。

数据表示很简单:你需要一个有向图。 从 A 到 B 的边意味着 A 喜欢 B;缺少边缘意味着 A 不喜欢 B。 这将以易于处理的形式对"喜欢"信息进行编码。 你有 75 个节点,每个"喜欢"都有一个边。

从研究集团算法开始;"集团"是每个成员都喜欢其他成员的集合。 这些可能会构成群集的基础。

但是,请注意,您必须定义权衡。 例如,考虑 13 个节点的情况,该节点由 4 人和 8 人组成的两个不同的集团组成,再加上一个喜欢 8 人集团中一个成员的人。 图中没有其他"喜欢"。

你如何放置第 13 个人? 你会把8个集团分开,把他们和他们喜欢的人一起加入小组吗? 如果是这样,你是否将 3 或 4 个人分成 8 人? 打破15或16个"喜欢",把那个人放在他们喜欢的人身上,谁不喜欢他们,这公平吗? 将第 13 个人添加到 4 人的相互对抗的集团中更好吗?

对于所有这些情况,您的 eval 函数必须返回一个有序的指标。 它将需要支持添加到组、拆分大型组等。

这听起来像是一个聚类问题。 每个用户都是一个节点。如果两个用户彼此喜欢,则节点之间有一条路径。 如果用户彼此不喜欢,或者一个喜欢另一个,但不是相反,那么这些节点之间就没有路径。

一旦你把类似的信息处理成一个图,你就会得到一个连接的图(如果没有人喜欢那个用户,也许一些节点会被隔离(。现在的问题变成了如何将该图切割成 4-8 个连接节点的集群,这是一个经过充分研究的问题,有很多可能的算法:

https://www.google.com/search?q=divide+connected+graph+into+clusters

如果你想区分两个人互相不喜欢的情况与一个人喜欢另一个人而那个人不喜欢第一个人的情况,那么你也可以在路径上引入权重 - 每个喜欢是+1,不喜欢是-1。那么问题就变成了对加权图进行分区的问题。

最新更新