2010-06-29 9 views
5

Próbuję znaleźć najlepszy sposób obliczenia rozmiaru pudełka potrzebnego do wysyłki.Obliczyć przybliżoną wartość dla rozmiaru opakowania transportowego

Mam 3 kontenery transportowe o różnych rozmiarach. Mam szerokość, długość, głębokość i masę produktu zdefiniowane w bazie danych.

Chciałbym wiedzieć, jak znaleźć najmniejszą ilość pudełek potrzebnych do wysyłki, a także najmniejsze wymiary tych pudełek, biorąc pod uwagę liczbę pozycji w koszyku.

Mój obecny "pomysł" polega na znalezieniu maksymalnej szerokości całej tablicy produktów, wybraniu odpowiedniego pola, a następnie podzieleniu zamówienia w razie potrzeby ... nie wydaje się, żeby to działało.

Kim wielkości pudełka są: - 8 x 6 x 6 = 228 cali sześc - 10 x 8 x 8 = 640 cali sześc - 12,5 x 12,5 x 12,5 = 1953,125 cali sześc

produkt jest zdefiniowany jako takie:

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

Sprawdziłem problem z plecakiem, problem z pakowaniem itp. i nie mogę znaleźć sposobu, aby to zrobić. Każda pomoc będzie WIELKA.

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

Naprawiono formatowanie ... to nie jest praca domowa, lecz system koszyka na zakupy, który piszę. – Wil

+6

Wygląda na to, że jak tylko problem stanie się nie-ogólny, konkretny i namacalny, by można go było właściwie zastosować do rzeczywistej sytuacji, jest oznaczony jako praca domowa, z jakiegoś powodu =/ –

+0

@Justin L. Miałem dokładnie odwrotny sens - problem był zbyt ogólny i nieostry, by być prawdziwym światem. Co sprawiło, że myślałeś, że to był prawdziwy świat? Obecność liczb (3 pola) lub rzeczywiste rozmiary? To są wskazówki dla mnie. Dlaczego twierdzisz, że nie było to ogólne? Jest to problem z plecakiem i jest naprawdę trudny - dlatego zazwyczaj jest to praca domowa. –

Odpowiedz

2

chodzi o uzyskanie optymalnej odpowiedzi, że jest NP-trudny ... http://en.wikipedia.org/wiki/Bin_packing_problem

Chciwy algorytm pokazano na Wikipedii, a może to być dość daleko, w rzeczywistości może zrobić dla swojej sprawy.

Jednak jako szacunek można po prostu podsumować wolumeny produktów, a następnie zastosować współczynnik nieefektywności , a następnie użyć najmniejszego pudełka, jakie można.

Można również posortować elementy w celu zmniejszenia objętości, a następnie sprawdzić, ile można uzyskać w bieżącym zestawie pudełek, tworząc nowe pudełko, gdy nie można go dopasować. Nie wiesz, jak obsługiwać inne pudełko rozmiary jednak. Możesz także mieć przypadek, w którym zmienia się rozmiar pudełka, zamiast tworzyć nowe pole.

Jedzenie dla myśli.

+1

Proponuję również buforowanie wyników w tabeli mieszania, więc obliczenia nie będą musiały być wykonane ponownie, jeśli ponownie pojawi się ta sama kombinacja skrzynek :) –

+1

Myślę, że ten pakiet jest rozwiązaniem startowym https: // github. com/dvdoug/BoxPacker tylko na przyszłość, jeśli ktokolwiek na świecie przyjedzie tutaj, aby znaleźć możliwe rozwiązanie: D –

2

Oto niski tech ale możliwe rozwiązanie:

Właśnie wpadł na ten sam problem. Postanowiłem wziąć nasze rozmiary pudełek, a następnie dać każdemu produktowi pewien procent za ilość zajmowanej przestrzeni w każdym rozmiarze pudełka. Nasze produkty są w formie swobodnej i mogą być nieco spłaszczone, więc jeśli masz absolutną wielkość, możesz zmniejszyć procentowy udział w produktach umieszczanych w pudełku pod różnymi kątami itd. Również dla nas jesteśmy w stanie zawsze umieścić rzeczy w skrzynkach ustawione pod takim samym kątem względem siebie, co pomaga również w lepszym działaniu poniższej metody.

Zakłada są 3 rozmiarów skrzyni:

  • produkcie
    • Box A = 48% (2 mieszczą się w pudełku)
    • kasetą B = 30% (3 fit w postaci pudełka),
    • polu C = 12% (8 mieszczą się w pudełku)
  • Produkt B
    • Box A = 24%
    • Box B = 15%
    • Box C = 7%

Następnie wystarczy mieć swój kod sumować te procenty za swoje przedmioty w koszyku dla pudełek A, B i C ... oczywiście, jeśli jakiekolwiek są poniżej 100%, wszystko powinno pasować, a jeśli zaczniesz od góry do dołu, pierwszy, aby osiągnąć mniej niż 100%, będzie pasował do twoich produktów i będzie najmniejszym pudełkiem. A jeśli natkniesz się na dowolne scenariusze podczas pakowania, które nie będą pasowały, zmniejsz nieco procent wprowadzony dla tego produktu.

W przypadku przesyłek z wieloma przesyłkami wystarczy zdecydować, co chcesz zrobić, jak w przypadku kombinacji. Powyższe działa najlepiej w przypadku przesyłek pojedynczych, ale z dodatkową logiką może z łatwością dobrze działać w przypadku wielu przesyłek pudełkowych.

Powiązane problemy