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,但是将更高的值分配到一个数组上,将更低的值分配到另一个数组上。我正在努力创建一个甚至是球员技能的棒球队。
答案 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。