2

以下は私が持っているデータセットです

ID | Dept | Value

1  | 0    | 50.58

2  | 0    | 75.64

3  | 0    | 32.57

4  | 0    | 187.57

5  | 0    | 354.54

これを部門 1 と部門 2 の 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);
?>

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 に答える