通过玩家偏好

时间:2018-06-09 13:09:35

标签: algorithm sorting math partition-problem

我正在制作一个匹配客户,将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支球队的大型游戏,挑选你喜欢的队友将通过搜索功能完成。我知道这个系统可能不是最好的 - 但是,这是一个有趣的问题,我希望在学习的过程中找到一个有效的解决方案。

2 个答案:

答案 0 :(得分:0)

首先是免责声明。

如果您的用户建议这样做,则有两种可能性。 他们可以提供算法的确切细节,所以问问他们。 或者他们很可能不知道他们在谈论什么,只是在现场产生了一个局部的想法,在这种情况下,遗憾的是平均值得不值得。

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

现在,您将有机会探索这个想法。 首先,为了将十个项目分成两组,每组五个,there are只选择(10,5)= 252种可能性,因此,除非系统必须每秒进行数百万次,否则您只需计算一些分数所有这些,并选择最好的一个。 最直接的方法可能是考虑所有2 ^ {10} = 1024种方法来形成10个元素的子集,然后探索子集大小为5的方法。 但根据语言或框架的不同,可能有更好的more to-the-point工具可供使用。 10-choose-5组合是一组,未采取的项目是另一组。

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

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

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

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

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

  5. 当然可以考虑其他因素......

  6. 基于这一切,构建一个至少在表面看起来合理的系统,然后再进行实验和实验,调整它以便更好地适应配对目标。

答案 1 :(得分:0)

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

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

我会从不同的起点多次爬山,然后选择得分最高的答案,因为爬山可能会在当地的最佳位置结束,而不是全球最佳。

至少有一些起点应该基于人们的原始选择。如果你让人们的选择相当于一个整个团队的选择,这将是最简单的,但是如果你说你将遵循A的建议,你可以建立一个团队来自多个建议,然后在需要时选择B人,以及然后根据需要进行人员C的选择,等等。

如果你包括每个人的选择的起点,或基于优先级ABCDE选择...然后优先BCDE ...然后优先CDEF ...那么你有一个属性,如果任何人提交一个完美的选择,你的算法将识别就这样。

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