3

便利なメソッド/式を使用して、アイテムがロードされた小包/パレットの寸法を計算するPHP関数の作成を検討しています。

これは、アイテムを含む配列の例です。注:一部のアイテムには、個別の小包として送信されるようにフラグが付けられています。一部のアイテムは傾けられない場合があります。

$items = array(
  1 => array(
    'quantity' => 1,
    'weight' = 1,
    'dimensions' => array(80, 50, 50), // Length, Width, Height
    'separate' => true, // If the item should be sent as a separate package 
    'tiltable' => false, // False if the item has a 'this side up' sticker
  ),
  2 => array(
    'quantity' => 3,
    'weight' = 1,
    'dimensions' => array(21, 15, 10),
    'separate' => false,
    'tiltable' => true,
  ),
  3 => array(
    'quantity' => 2,
    'weight' = 1,
    'dimensions' => array(18, 19, 20),
    'separate' => false,
    'tiltable' => true,
  ),
  // ... and so on ...
);

誰かがこれを行うことから少しの知識や経験を持っていますか?車輪の再発明はしたくありません。

私が考えている関数は次のようなものです:*(構文エラーが発生する可能性があります)*

  function build_packages($items, $max_weight=0, $max_length=0, $max_width=0, $max_height=0) {

    $packages = array();

  // Step through each item
    foreach ($items as $item) {

    // Twist and turn item. Longest side first ([0]=length, [1]=width, [2]=height)
      if (!empty($item['tiltable'])) {
        rsort($item['dimensions'], SORT_NUMERIC);
      } else {
        if ($item['dimensions'][0] < $item['dimensions'][1]) {
          $item['dimensions'] = array($item['dimensions'][1], $item['dimensions'][0], $item['dimensions'][2]);
        }
      }

    // Validate item
      if (!empty($max_weight) && $item['weight'] > $max_weight) return false;
      if (!empty($max_length) && $item[0] > $max_length) return false;
      if (!empty($max_width) && $item[1] > $max_width) return false;
      if (!empty($max_height) && $item[2] > $max_height) return false;

    // Step through quantities
      for ($i=0; $i<$item['quantity']; $i++) {

      // Step through packages
        $package_found = false;
        foreach (array_keys($packages) as $key) {

        // Skip to next package on certain conditions
          if ($packages[$key]['separate']) continue;
          // ...

          // Do some logic
          // ...

        // Modify package
          $package_found = true;
          $packages[$key]['num_items']++;
          $packages[$key]['weight'] += $item['weight'];
          $packages[$key]['dimensions'] = array(0, 0, 0); // <--- Replace with new dimensions

        // Twist and turn package. Longest side first ([0]=length, [1]=width, [2]=height)
          if (!empty($item['tiltable'])) {
            rsort($packages[$key]['dimensions'], SORT_NUMERIC);
          } else {
            if ($packages[$key]['dimensions'][0] < $packages[$key]['dimensions'][1]) {
              $packages[$key]['dimensions'] = array($packages[$key]['dimensions'][1], $packages[$key]['dimensions'][0], $packages[$key]['dimensions'][2]);
            }
          }

          break;
        }

        if ($package_found) continue;

      // Add to a new package
        $packages[] = array(
          'num_items' => 1,
          'weight' => $item['weight'],
          'dimensions' => $item['dimensions'],
          'separate' => $item['separate'],
          'tiltable' => $item['tiltable'],
        );
      }
    }

    return $packages;
  }

いくつかのコードを手伝ってくれませんか?

4

2 に答える 2

1

あなたが求めているのは、ビンパッキング問題の解決策です。解決策はNP Hardであるため、最適な解決策ではなく、「十分な」解決策を見つけたい場合があります。グーグル検索でこれが判明しました:One Dimensional Bin Packing class。私はコードを見ていないので、それがどれほど優れているかはわかりませんが、少なくとも調査を開始する場所としてお勧めします. 1 次元の問題に十分であることが判明した場合は、複数の 1 次元レイアウトを作成するソリューションを作成し、各行の最大高さを追跡して、パッケージの高さの合計を超えたかどうかを知ることができます。

お役に立てれば。

于 2013-01-14T02:53:20.333 に答える
1

これまでのところ、このパッケージhttps://github.com/dvdoug/BoxPackerとこのサービスhttps://3dbinpacking.com/が見つかりました。

于 2016-12-26T18:57:30.030 に答える