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 组,其中的细分将基于价值。即,价值接近总值的一半。

在上面的示例中,ID 1-4 将在第 1 组中,总数为 346.36,ID 5 将在第 2 组中,总数为 354.54。

4

2 回答 2

0

这是一个非常困难的问题。有很多算法可以完成这种“装箱”解决方案(即尝试在各种容器中平均分割各种尺寸)。这本质上是一样的。查看填充量算法以获取更多信息。

简而言之,这并不容易,充其量只能获得最佳解决方案的近似值。

于 2012-11-12T13:14:02.743 回答
0

这段代码应该做你想做的事。

<?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)
  }
}
于 2012-11-12T13:26:10.230 回答