1

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

4

2 回答 2

0

先声明一个。

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

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


现在,您将在探索这个想法时获得乐趣。首先,为了将十个项目分成两组,每组五个,只有select(10,5)=252 种可能性,所以,除非系统必须每秒执行数百万次,否则您可以为所有这些项目计算一些分数,并选择最好的一个。最直接的方法可能是考虑所有 2^{10} = 1024 种方法来形成 10 个元素的子集,然后探索子集大小为 5 的那些。但可能有更好、更实用的方法点,工具随时可用,具体取决于语言或框架。10选5组合为一组,未采取的项目为另一组。

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

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

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

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

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

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

基于这一切,构建一个至少在表面上看起来合理的系统,然后反复试验,调整它,使其更适合匹配目标。

于 2018-06-09T13:45:04.483 回答
0

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

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

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

至少有一些起点应该是基于人们最初的选择。如果您让人们的选择相当于整个团队的选择价值,这将是最简单的,但是如果您说您将遵循 A 的建议,然后根据需要 B 的选择,您可能可以从多个建议中建立一个团队,并且然后根据需要选择 C ​​人的选择,依此类推。

如果您将每个人的选择作为起点,或者基于优先级 ABCDE.. 的选择,然后是优先级 BCDE...,然后是优先级 CDEF...,那么您拥有的属性是,如果有人提交了完美的选择,您的算法将这样识别它.

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

于 2018-06-10T04:36:57.610 回答