将数组按其值均匀分成两个

时间:2011-05-24 02:04:08

标签: php

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

我想将这个数组分配到两个数组中,这两个数组最终都是以总数(从浮点数值)结束,大致相同。我尝试了K-Clustering,但是将更高的值分配到一个数组上,将更低的值分配到另一个数组上。我正在努力创建一个甚至是球员技能的棒球队。

2 个答案:

答案 0 :(得分: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的最终结果。

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

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

答案 1 :(得分:1)

这非常简单,但您是否考虑过像草稿一样?按照示例中的数组进行排序,A队获得array[0],B队获得array[1]array[2]接下来的两个选择将进入A队,依此类推。

对于你给出的例子,我有一个团队,大约50,000,另一个团队,大约45,000。