2010-06-29 9 views
5

J'essaie de trouver la meilleure façon de calculer la taille de boîte nécessaire pour l'expédition.Calculer une estimation approximative pour la taille de la boîte d'expédition

J'ai 3 conteneurs d'expédition avec différentes tailles. J'ai la largeur, la longueur, la profondeur et la masse du produit définies dans la base de données.

Je voudrais savoir comment trouver la plus petite quantité de boîtes nécessaires pour expédier, et aussi les plus petites dimensions de ces boîtes étant donné le nombre d'articles dans le panier. Mon 'idée' actuelle est de trouver la largeur maximale de l'ensemble du tableau des produits, de sélectionner une case en fonction de celle-ci, puis de diviser l'ordre selon les besoins ... cela ne semble pas fonctionner.

Mes tailles de boîte sont: - 8 x 6 x 6 = 228 pouces cubes - 10 x 8 x 8 = 640 pouces cubes - 12,5 x 12,5 x 12,5 = 1953,125 pouces cubes

un produit est définie en tant que tel:

[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 
       ) 

Je l'ai regardé dans problème de havresac, problème d'emballage, etc et ne peut pas trouver un moyen de le faire. Toute aide est la bienvenue.

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

Mise en forme fixe ... ce n'est pas un devoir, c'est pour un système de panier que j'écris. – Wil

+6

Il semble que dès qu'un problème devient non général, spécifique et suffisamment tangible pour être réellement appliqué à une situation réelle, il est étiqueté comme devoirs, pour une raison quelconque =/ –

+0

@Justin L. J'avais exactement le sens inverse - Le problème était trop général et trop flou pour être réel. Qu'est-ce qui vous a fait penser que c'était du vrai monde? La présence de chiffres (3 cases) ou de tailles réelles? Ce sont des indices de devoirs pour moi. Pourquoi prétends-tu que ce n'était pas général? C'est le problème du sac à dos et c'est vraiment difficile - c'est pourquoi c'est habituellement les devoirs. –

Répondre

2

Quant à obtenir une réponse optimale, c'est NP-dur ... http://en.wikipedia.org/wiki/Bin_packing_problem

L'algorithme glouton montré sur Wikipedia, alors qu'il peut être assez loin, peut réellement faire pour votre cas.

Cependant, en guise d'estimation, vous pouvez simplement additionner les volumes des articles, puis appliquer un facteur d'inefficacité puis utiliser les plus petites cases possibles.

Alternativement, vous pouvez trier les articles en volume décroissant, puis voir combien vous pouvez obtenir dans le jeu actuel de boîtes, en créant une nouvelle boîte lorsque vous ne pouvez pas adapter l'article po Pas sûr de savoir comment vous pourriez gérer boîte différente tailles cependant. Vous pouvez également avoir un cas où il change la taille de la boîte plutôt que de créer une nouvelle boîte.

Matière à réflexion.

+1

Je suggère également de mettre en cache vos résultats dans une table de hachage, de sorte que les calculs ne devront pas être refaits si la même combinaison de boîtes revient :) –

+1

Je pense que ce paquet est une solution de démarrage https: // github. com/dvdoug/BoxPacker juste pour référence future si quelqu'un d'autre du monde vient ici pour une solution possible: D –

2

Voici une technologie basse mais solution possible:

Nous venons rencontré le même problème. J'ai décidé de prendre nos tailles de boîte et ensuite donner à chaque produit un pourcentage pour combien d'espace il a pris dans chaque taille de boîte. Nos produits sont de forme libre et peuvent être écrasés un peu si la vôtre est de taille absolue, vous devrez peut-être réduire les pourcentages pour tenir compte des produits mis dans la boîte à différents angles ect ... Aussi pour nous, nous pouvons toujours mettre les choses dans les boîtes comme le même angle l'un par rapport à l'autre donc cela aide aussi à faire mieux fonctionner la méthode ci-dessous.

Cela suppose qu'il y a 3 dimensions de la boîte:

  • le produit
    • Box A = 48% (2 ajustement dans une boîte)
    • Box B = 30% (3 ajustement dans une boîte)
    • Box C = 12% (8 ajustement dans une boîte)
  • Produit B
    • Box A = 24%
    • Box B = 15%
    • Box C = 7%

Alors avez juste votre code additionnez ces pourcentages pour votre articles de chariot pour la boîte A, B et C ... évidemment si tout est inférieur à 100% tout devrait s'adapter et si vous commencez de haut en bas le premier pour atteindre moins de 100% s'adaptera à vos produits et sera la plus petite boîte. Et si vous rencontrez des scénarios lors de l'emballage qui ne correspondent pas, réduisez légèrement le pourcentage que vous avez entré pour ce produit.

Pour les envois de boîtes multiples, il vous suffit de décider ce que vous voulez faire en tant que combinaisons. Ce qui précède fonctionne mieux pour les expéditions à boîte unique, mais avec une logique supplémentaire pourrait facilement fonctionner bien pour les envois de boîtes multiples.