下面是我拥有的数据集
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。
下面是我拥有的数据集
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。
这是一个非常困难的问题。有很多算法可以完成这种“装箱”解决方案(即尝试在各种容器中平均分割各种尺寸)。这本质上是一样的。查看填充量算法以获取更多信息。
简而言之,这并不容易,充其量只能获得最佳解决方案的近似值。
这段代码应该做你想做的事。
<?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)
}
}