Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建“的算法”;团队“;基于数字技能值_Php_Algorithm - Fatal编程技术网

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

Php 创建“的算法”;团队“;基于数字技能值,php,algorithm,Php,Algorithm,我正在建立一个应用程序,帮助管理飞盘“帽子比赛”。这个想法是人们报名参加这个“帽子比赛”。当他们注册时,他们会向我们提供一个介于1和6之间的数值,表示他们的技能水平 目前,我们正在收集大量注册人员,并根据每位球员的技能水平手动创建团队。我想,我可以通过创建一个尽可能均匀地划分团队的算法来实现这一点的自动化 唯一的数据是“玩家”数组和所需的“团队数量”。一般来说,我们需要120名球员和8支球队 我目前的想法是,基本上每个团队都有一个连续的“分数”。此跑步分数是所有指定玩家技能等级的总和。我循环检查

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

目前,我们正在收集大量注册人员,并根据每位球员的技能水平手动创建团队。我想,我可以通过创建一个尽可能均匀地划分团队的算法来实现这一点的自动化

唯一的数据是“玩家”数组和所需的“团队数量”。一般来说,我们需要120名球员和8支球队

我目前的想法是,基本上每个团队都有一个连续的“分数”。此跑步分数是所有指定玩家技能等级的总和。我循环检查每个技能等级。在技能等级循环中,我会进行一轮又一轮的挑选。每轮选秀的顺序都会根据球队的跑动得分重新计算

这实际上效果相当不错,但并不完美。例如,我的示例数据数组中有5个点的范围。我可以很容易地,手动交换球员,使球队之间的差距不超过1分。。问题是如何通过编程来完成

以下是我迄今为止的代码:

数据外观的片段:

[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
    )

有谁能想出一个更好、更简单、更有效的方法来做到这一点?非常感谢

不幸的是,这个问题是NP难的。看看哪一个可能是一个很好的开始,包括一个你希望可以调整的算法,这可能有用,也可能不有用,这取决于两支得分相同的球队需要多么“公平”。

我认为你把事情弄得太复杂了。如果你有T队,根据球员的技术水平对他们进行分类。选择顶尖的T级球员担任球队队长。然后,从队长1开始,每个队长依次选择他想要加入球队的球员。这可能是在未关闭的玩家列表的顶部的人


这一算法在操场(我敢说在加利福尼亚州的飞盘场上)已经运行了很久,并将产生与任何更复杂的伪统计方法一样“公平”的结果。

一个简单的解决方案可能是首先生成一个团队选择顺序,然后每个团队将“选择”一名技能最高的球员。下一轮的顺序是相反的,最后一个选择球员的队得到第一个选择,第一个队得到最后一个选择。对于每一轮,您都要颠倒提货顺序

第一轮拣货订单可以是:

A-B-C-D-E

第二轮将是:

E-D-C-B-A

然后


A-B-C-D-E等。

看起来这个问题真的是NP难问题,是

“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)。

通过“尽可能平均地分割他们”,你的意思是让他们的个人总分大致相等?例如,如果一支队伍有(2,6)名球员,另一支队伍有(3,5)名球员,那么两支队伍的人数将是相等的?我建议您参考这个问题的答案,因为这些值具有相同的数量级,在这种情况下可能会很好地工作。对于一个一般的分区问题,它不一定会给出最佳的解决方案。我为最后一个被选中的家伙感到抱歉,数据必须适合这种方法。如果我理解正确的话,球员“6,5,5,3,3,1”将导致球队“6,5,3”(=14)和“5,3,1”(=9),对吗?是的,总是有一些杂草丛生、协调不好、患有哮喘的孩子站在健身器材里发抖。@Leif:你在做序数算术。我回答的全部要点是,技能水平是序号,将它们相加是无效的操作。但你是对的,考虑到你的输入数据,游乐场算法会产生团队,团队A中的每个人都比团队B中相应的成员好。就像在游乐场一样。我相信问题有多项式解。箱子包装问题不是一个很好的减少,因为:数值在范围
[1,6]
内。我相信这个问题实际上可以用动态规划多项式来解决。然而,一般情况下[分数不限于6分]确实是NP难的,从子集和问题中减少。