通过玩家偏好创建团队算法



我正在制作一个匹配客户端,将 10 个人匹配为两个团队:

每个人都选择四个他们想一起玩的人,从高到低排名。

然后从该组中最强的关系中组成两个团队。

您将如何创建解决此问题的算法?

例:

Given players [a, b, c, d, e, f, g, h, i, j], '->' meaning a preference pick.
a -> b (weight: 4)
a -> c (weight: 3)
a -> d (weight: 2)
a -> e (weight: 1)
b -> d (weight: 4)
b -> h (weight: 3)
b -> a (weight: 2)
...and so on

这个问题表面上看起来很简单(毕竟它只是一个配对客户端),但考虑了一段时间后,似乎需要考虑相当多的关系。

编辑(从评论粘贴): 理想情况下,我会避免使用蛮力方法来扩展到需要 100 名玩家和 25 支球队的大型游戏,在这些游戏中,选择您喜欢的队友将通过搜索功能完成。我知道这个系统可能不是最好的 - 但是,这是一个有趣的问题,我想在学习一些东西的同时找到一个有效的解决方案。

首先是免责声明。

如果您的用户建议这样做,则有两种可能性。 要么他们可以提供算法的确切细节,所以问他们。 或者他们很可能不知道他们在说什么,只是当场产生了一个部分的想法,在这种情况下,可悲的是,它平均价值不大。

因此,一种选择是搜索匹配在其他项目中的工作方式,完全忽略这个想法。 另一种是探索用户的想法。 可能不会变成一个好的系统,但它有可能。 无论如何,您将不得不自己做一些实验。


现在,对于您将在探索这个想法时获得乐趣的情况。 首先,将十个项目分成两组,每组五个,只有 choose(10,5)=252 种可能性,因此,除非系统必须每秒执行数百万次,否则您可以计算所有项目的一些分数,然后选择最佳一个。 最直接的方法可能是考虑所有 2^{10} = 1024 种方法形成 10 个元素的子集,然后探索子集大小为 5 的元素。 但是,根据语言或框架的不同,可能会有更好、更切中要害的工具。 10-pick-5组合是一组,未采取的物品是另一组。

那么,组合的分数是多少? 现在我们看看我们的偏好。

  1. 对于满足的每个偏好,我们可以将其权重或权重平方或其他方式添加到分数中。 哪种效果最好肯定需要一些实验。

  2. 同样,对于每个未满足的偏好,我们可以根据其权重添加惩罚。

  3. 接下来,我们可以考虑所有球员,并可能为每个没有满足他们偏好的球员增加更多的惩罚。

  4. 另一件需要考虑的事情是团队平衡。 由于到目前为止唯一的数据是偏好(这很可能是不够的),不平衡意味着一个团队满足了许多偏好,而另一个团队只有很少的偏好,如果有的话。 因此,我们根据(第一队的满意度总和)和(第二队的满意度总和)的绝对差异增加另一个惩罚。

  5. 当然,还有其他因素需要考虑...

基于所有这些,构建一个至少表面上看起来合理的系统,然后再次尝试和实验,对其进行调整,使其更好地符合匹配目标。

我会想到一种方法来根据人们的选择对提议的团队进行评分,例如根据权重对提议的团队进行评分。

我会尝试通过爬山来优化这一点(例如,交换一对人,看看这是否能提高分数),如果只是因为人们可以查看最终解决方案并自己尝试 - 所以你不想错过这种改进。

我会从不同的起点多次爬山,并选择得分最高的答案,因为爬山可能会以局部最优结束,而不是全局最优。

至少一些起点应该基于人们的原始选择。如果你让人们的选择相当于整个团队的选择价值,这将是最简单的,但如果你说你会遵循人A的建议,然后是人B的选择(如果需要),然后是人C的选择,等等,你可能会从多个建议中建立一个团队。

如果将每个人的选择作为起点,或者基于优先级ABCDE的选择,然后是优先级BCDE...然后优先CDEF...然后你有一个属性,如果有人提交一个完美的选择,你的算法会识别它。

如果你的爬山算法尝试交换所有玩家对进行改进,并持续到它找到局部最优然后停止,那么你还有一个属性,如果有人提交一个距离完美只有一个交换的选择,你的算法会识别它。

最新更新