2010-06-29 103 views
5

我試圖找到計算裝運所需箱尺寸的最佳方法。計算裝運箱尺寸的粗略估算值

我有3個不同尺寸的集裝箱。我在數據庫中定義了產品的寬度,長度,深度和質量。

我想知道如何找到需要運送的箱子的最小數量,以及給出購物車中物品數量的那些箱子的最小尺寸。

我目前的想法是找到整個產品數組的最大寬度,根據需要選擇一個盒子,然後根據需要拆分順序......這看起來不像是可行的。

我的框尺寸爲: - 8×6×6 =228立方英寸 - 10×8×8 =640立方英寸 - 12.5×12.5×12.5 =1953.125立方英寸

的產物被定義因此:

[Product] => Array 
       (
        [STOCK_CODE] => 010003 
        [Product_Slug] => GABA_010003 
        [ItemName] => GABA 
        [WHOLESALE_PRICE] => 17.47 
        [RETAIL_PRICE] => 24.95 
        [Brand] => 
        [ProductLine] => 
        [image_name] => 705077000440 
        [MASS] => 0.313 
        [Height] => 4.625 
        [Width] => 2.375 
        [Depth] => 2.375 
        [cubic_inches] => 26.087890625 
       ) 

我查看了揹包問題,包裝問題等,並找不到一種方法來做到這一點。任何幫助將是偉大的。

function shipping(){ 

     $this->CartProduct->unbindModel(
      array('belongsTo' => array('User')) 
     ); 

     //find all cart products by current logged in user 
     $cartItems = $this->CartProduct->find('all', array('conditions' => array('CartProduct.user_id' => $this->Auth->user('id')))); 

     $i = 0; 

     //get the max width, height, depth 
     $maxHeight = 0; 
     $maxWidth = 0; 
     $maxDepth = 0; 
     foreach($cartItems as $c){ 
      $cartItems[$i]['Product']['cubic_inches'] = $c['Product']['Height'] * $c['Product']['Width'] * $c['Product']['Depth']; 
      $cartItems[$i]['CartProduct']['total_cubic_inches'] = ($c['Product']['Height'] * $c['Product']['Width'] * $c['Product']['Depth']) * $c['CartProduct']['qty']; 

      if($c['Product']['Height'] > $maxHeight) 
      { 
       $maxHeight = $c['Product']['Height']; 
      } 

      if($c['Product']['Width'] > $maxWidth) 
      { 
       $maxWidth = $c['Product']['Width']; 
      } 
      if($c['Product']['Depth'] > $maxDepth) 
      { 
       $maxDepth = $c['Product']['Depth']; 
      } 
      $i++; 
     } 

     //possible containers 
     //8 x 6 x 6 = 228 ci 
     //10 x 8 x 8 = 640 ci 
     //12.5 x 12.5 x 12.5 = 1953.125 

     $possibleContainers = array(
      1 => array(
       'Height' => 8, 
       'Width' => 6, 
       'Depth' => 6, 
       'Cubic' => 228), 
      2 => array(
       'Height' => 10, 
       'Width' => 8, 
       'Depth' => 8, 
       'Cubic' => 640), 
      3 => array(
       'Height' => 12.5, 
       'Width' => 12.5, 
       'Depth' => 12.5, 
       'Cubic' => 1953.125) 
     ); 



     $max = array(
      'Height' => $maxHeight, 
      'Width' => $maxWidth, 
      'Depth' => $maxDepth, 
     ); 

     pr($cartItems); 
     pr($possibleContainers); 
     die(); 
    } 
+2

固定格式...這不是作業,它是我正在寫的購物車系統。 – Wil 2010-06-29 01:40:59

+6

似乎只要一個問題變得非常規,具體和有形,足以實際應用於現實生活中,它就被標記爲家庭作業,出於某種原因=/ – 2010-06-29 01:47:29

+0

@Justin L.我的意思完全相反 - 問題過於籠統,無法成爲現實世界。是什麼讓你覺得這是現實世界?數字(3盒)或實際大小的存在?這些都是我的作業提示。你爲什麼聲稱這是非一般的?這是揹包問題,而且非常難 - 這就是爲什麼它通常是家庭作業。 – 2010-06-29 10:24:06

回答

2

至於得到一個最佳的答案,這是NP難... http://en.wikipedia.org/wiki/Bin_packing_problem

在維基百科上顯示的貪心算法,而它可以相當遙遠,實際上可能對你的情況做。

然而,作爲一個估計,你可以總結項目的數量,然後應用低效率因子,然後使用最小的盒子。

或者,您可以將物品分類爲遞減量,然後查看您可以進入當前一組箱子的數量,當您無法裝入物品時創建一個新箱子。不知道您將如何處理不同的箱子尺寸雖然。你也可以有一個改變盒子大小而不是創建一個新盒子的例子。

思考的食物。

+1

我也建議將結果緩存在哈希表中,所以如果箱子的相同組合再次出現,計算就不必再次完成:) – 2010-06-29 04:08:46

+1

我認爲這個包是一個啓動解決方案https:// github。 com/dvdoug/BoxPacker只是爲了將來的參考,如果世界上任何其他人來這裏尋找可能的解決方案:D – 2015-04-27 10:31:49

2

這裏是一個技術含量較低,但可能的解決方案:

我們恰好​​碰到了同樣的問題。我決定採用我們的箱子尺寸,然後給每個產品一個百分比,以確定每個箱子尺寸需要多少空間。我們的產品是自由形式,可以稍微擠壓一下,所以如果您的產品尺寸是絕對的,您可能需要減少百分比來考慮以不同角度放入盒子中的產品......同樣對於我們來說,我們總能夠盒子裏的東西與對方的角度相同,所以這也有助於使下面的方法更好地工作。

這假設有3米方塊的尺寸:

  • 產品A
    • 框A = 48%(2配合在盒)
    • 盒B = 30%(3配合在一個盒子)
    • 箱C = 12%(8配合在盒)
  • 產品B
    • 盒A = 24%
    • 箱B = 15%
    • 箱C = 7%

然後,只需有你的代碼添加了那些百分比爲您A盒,B盒和C盒的購物車......顯然,如果任何貨品低於100%,一切都應該適合,如果你從上到下首先達到低於100%,將適合你的產品,併成爲最小的盒子。如果您在包裝時遇到任何不適合的情況,只需稍微減少您爲該產品輸入的百分比即可。

對於多箱出貨,你只需要決定你想要做什麼就像組合。以上對單箱出貨最適合,但有一些額外的邏輯可以輕鬆適用於多箱出貨。