下面PHP集團行數據分爲2組,是一個集我有基於總價值
ID | Dept | Value
1 | 0 | 50.58
2 | 0 | 75.64
3 | 0 | 32.57
4 | 0 | 187.57
5 | 0 | 354.54
我將如何去分割將其分爲2組,部門1和部門2中,其中擊穿將基於價值。即,其值接近總值的一半。
在上面的例子中,ID1-4將在組1中,總數爲346.36,ID5將在組2中,總數爲354.54。
下面PHP集團行數據分爲2組,是一個集我有基於總價值
ID | Dept | Value
1 | 0 | 50.58
2 | 0 | 75.64
3 | 0 | 32.57
4 | 0 | 187.57
5 | 0 | 354.54
我將如何去分割將其分爲2組,部門1和部門2中,其中擊穿將基於價值。即,其值接近總值的一半。
在上面的例子中,ID1-4將在組1中,總數爲346.36,ID5將在組2中,總數爲354.54。
這是一個非常困難的問題。有很多算法可以做到這一點「bin packing」解決方案(即試圖在各種容器上平均分割各種大小)。這基本上是一樣的。有關它的更多信息,請看Fill volume algorithm。
簡而言之,這並不容易,最多隻能得到最佳解決方案的近似值。
你可以給出任何代碼實例來獲得一個近似值,我沒有期望每次都能得到確切的答案,因爲數據集可以定期改變。 – buzzmonkey
我相信我爲其他問題提供的鏈接有一些例子。也看看http://en.wikipedia.org/wiki/Bin_packing_problem。基本上最簡單的解決方案是按降序排列項目,並將其分配給剩餘空間的第一個部門。但在你的情況下,你不介意輕微的溢出,所以你必須想出這個想法的一些變種。 – CodePB
此代碼應該做你想做的事情。
<?php
// Your records stored as arrays
$records = array(
array(1, 0, 50.58),
array(2, 0, 75.64),
array(3, 0, 32.57),
array(4, 0, 187.57),
array(5, 0, 354.54)
);
// Blank value for total value
$total_value = 0;
// Calculate half way of total
foreach ($records AS $record)
{
$total_value += $record[2];
}
// Get the half way point
$half_way = $total_value/2;
// Create array for each department
$dept_1 = array();
$dept_2 = array();
// Split the records in to department
foreach ($records AS $record)
{
if ($record[2] >= $half_way)
{
// Put in to department 1
array_push($dept_2, $record);
}
else
{
// Put in to department 2
array_push($dept_1, $record);
}
}
// Show each departments contents
var_dump($dept_1);
var_dump($dept_2);
?>
它產生兩個數組$dept_1
和$dept_2
取決於它們的值是否高於或低於一半的總的:
array(4) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
int(0)
[2]=>
float(50.58)
}
[1]=>
array(3) {
[0]=>
int(2)
[1]=>
int(0)
[2]=>
float(75.64)
}
[2]=>
array(3) {
[0]=>
int(3)
[1]=>
int(0)
[2]=>
float(32.57)
}
[3]=>
array(3) {
[0]=>
int(4)
[1]=>
int(0)
[2]=>
float(187.57)
}
}
array(1) {
[0]=>
array(3) {
[0]=>
int(5)
[1]=>
int(0)
[2]=>
float(354.54)
}
}
這並不完全是問題的要求。他希望將分配給每個部門的項目總數約爲總數的一半。你的解決方案在這種情況下工作(因爲它在一個部門中是1個,其餘部分在另一個部門中),但是如果你要添加另一個大型項目,它將不起作用 – CodePB
啊?總價值的一半是350.45。那麼你需要在「部門1」中具有小於此值的任何值以及「部門2」中的任何其他值? – Luke