2011-05-24 119 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

相關問題