基于数字技能值创建“团队”的算法

时间:2012-03-15 09:46:56

标签: php algorithm

我正在构建一个有助于管理飞盘“帽子锦标赛”的应用程序。这个想法是人们报名参加这个“帽子锦标赛”。当他们注册时,为我们提供1到6之间的数值,表示他们的技能水平。

目前,我们正在接受这个庞大的注册人员名单,并根据每个玩家的技能水平手动尝试创建团队。我想,我可以通过创建一个尽可能均匀地分割团队的算法来实现自动化。

唯一的数据是“玩家”阵列和所需的“团队数量”。一般来说,我们正在关注120名球员和8支球队。

我目前的思维过程是基本上每个团队都有一个正在运行的“得分”。此分数是所有分配的球员技能等级的总和。我遍历每个技能水平。我在技能水平循环中经历了几轮选秀权。根据团队的运行得分,每轮重新计算选秀顺序。

这实际上运作得相当好,但并不完美。例如,我的样本数据数组中有5个范围。我可以非常轻松地,手动交换玩家并使团队之间的差异不超过1分......问题在于以编程方式完成。

到目前为止,这是我的代码:http://pastebin.com/LAi42Brq

看起来像什么数据的摘录:

[2] => Array
    (
        [user__id] => 181
        [user__first_name] => Stephen
        [user__skill_level] => 5
    )

[3] => Array
    (
        [user__id] => 182
        [user__first_name] => Phil
        [user__skill_level] => 6
    )

有人能想到更好,更简单,更有效的方法吗?非常感谢提前!!

4 个答案:

答案 0 :(得分:7)

我认为你的事情太复杂了。如果您有T队,请根据他们的技术水平对球员进行排序。选择前T队球员作为球队的队长。然后,从队长1开始,每个队长轮流选择他想要的队员。这可能是未被选中的球员名单中的人。

这个算法已经在游乐场(并且,我敢说在加利福尼亚的飞盘领域)中发挥作用,并且会产生与任何更复杂的伪统计方法一样“公平”的结果。

答案 1 :(得分:2)

一个简单的解决方案可能是首先生成一个团队选择顺序,然后每个团队将“选择”一个可用的最高技能的玩家。对于下一轮,顺序是相反的,选择一名球员的最后一支球队获得第一顺位,第一支球队获得最后一轮选秀权。对于每一轮,您都会反转拣配顺序。

第一轮拣货订单可能是:

A - B - C - D - E

第二轮将是:

E - D - C - B - A

然后

A - B - C - D - E等。

答案 2 :(得分:2)

看起来这个问题确实是NP难的,是Multiprocessor scheduling problem.

的变种

“h00ligan”的建议等同于LPT算法。

另一种启发式策略是该算法的变体:

第一轮:挑选最好的,第二轮:将最差的球队配对(从最后添加)等等。

使用示例“6,5,5,3,3,1”和2个团队,这将给团队“6,1,5”(= 12)和“5,3,3”(= 11) 。 “h00ligan”的战略将给予团队“6,3,3”(= 12)和“5,5,1”(= 11)。

答案 3 :(得分:1)

这个问题很遗憾NP-Hard。看看bin packing这可能是一个很好的起点,并且包含一个你可以调整的算法,根据两个具有相同分数的团队需要“公平”,这可能有用也可能没有用。 / p>