2011-05-24 81 views
2
array 
1703 => float 15916.19738 
5129 => float 11799.15419 
33 => float 11173.49945 
1914 => float 8439.45987 
2291 => float 6284.22271 
5134 => float 5963.14065 
5509 => float 5169.85755 
4355 => float 5153.80867 
2078 => float 3932.79341 
31 => float 3924.09928 
5433 => float 2718.7711 
3172 => float 2146.1932 
1896 => float 2141.36021 
759 => float 1453.5501 
2045 => float 1320.74681 
5873 => float 1222.7448 
2044 => float 1194.4903 
6479 => float 1074.1714 
5299 => float 950.872 
3315 => float 878.06602 
6193 => float 847.3372 
1874 => float 813.816 
1482 => float 330.6422 
6395 => float 312.1545 
6265 => float 165.9224 
6311 => float 122.8785 
6288 => float 26.5426 

我想将这个数组分配到两个数组中,这两个数组的总数(从float值开始)大致相同。我尝试了K-Clustering,但是将更高的值分配到一个阵列上,并将更低的值分配到另一个阵列上。我非常想创造一个拥有球员技能的棒球队。通过它的值将数组拆分为两个均匀值

+0

你是否需要平均分配玩家人数?或者在一个阵列中放置一个具有技能'15'的单个玩家并且在另一个阵列中放置15个技能'1'的玩家可以吗?任何球员都会有负面能力吗? – sarnold 2011-05-24 02:10:24

+0

没有消极能力,K-Clustering做了一个技能为15和15,技能为1的玩家。我希望能够平均分配值,而不是真正的总和(在你给我的例子中几乎是答案,但不是我在那里的真实例子...希望这是有道理的)。 – user766987 2011-05-24 02:19:58

回答

2

第1步:将玩家分成两队。这并不重要,你可以做其他事情。

第2步:只有在球队更平均的情况下才随机切换两名球员。

第3步:重复第2步,直到收敛到相等。

$diff = array_sum($teams[0]) - array_sum($teams[1]); 
    for ($i = 0; $i < 1000 && $diff != 0; ++$i) 
    { 
    $r1 = rand(0, 8); // assumes nine players on each team 
    $r2 = rand(0, 8); 

    $new_diff = $diff - ($teams[0][$r1] - $teams[1][$r2]) * 2; 

    if (abs($new_diff) < abs($diff)) 
    { 
     // if the switch makes the teams more equal, then swap 
     $tmp = $teams[0][$r1]; 
     $teams[0][$r1] = $teams[1][$r2]; 
     $teams[1][$r2] = $tmp; 

     var_dump(abs($new_diff)); 

     $diff = $new_diff; 
    } 
    } 

您必须将该代码调整到您自己的结构,但它应该很简单。

下面是一个示例输出:

int(20) 
int(4) 
int(0) 

我用整数从0到100评价每个球员。注意它是如何逐渐趋于平等的,尽管不能保证0的最终结果。

您可以在固定时间间隔后停止进程,或者直到达到某个阈值。

您可以使用更多的科学方法,但这种方法效果很好。

+0

'array 0 => float 52175.65502 1 => float 43303.23718' 正如您所看到的,它仍然不理想(希望获得类似于K-Cluster的算法)。谢谢你。 – user766987 2011-05-24 02:34:18

+0

在个人范围从0到16000的测试中,经过1000次迭代后,差异通常小于100。请注意,我将我的原始数组分割为:'0,1,1,0,0,1'。也就是说,第一队获得最佳球员。然后2队得到两名球员。然后,球队1得到两名球员,等等。 – Matthew 2011-05-24 02:39:28

+0

此外,您可能需要稍微调整算法,以便有时(以低概率)交换球员,即使它们差异更大。例如'如果(abs($ new_diff) Matthew 2011-05-24 02:43:11

1

这是非常简单的,但你有没有考虑过像做草稿一样呢?按照您的示例排序阵列,队A得到array[0],队B得到array[1]array[2]接下来的两个选择去队A,依此类推。

对于你给的例子,我得到了一个队伍〜50,000,另一个队伍〜45,000。

+0

是的,但问题是A队总是会“更好”(我尝试过随机迭代B队并交换球员,但那不是一个真正的解决方案......如果我必须这样做,那么我会,但我认为这有更好的解决方案)。 – user766987 2011-05-24 02:18:41

相关问题