2010-06-29 13 views
5

Estoy tratando de encontrar la mejor manera de calcular el tamaño de la caja necesaria para el envío.Calcular una estimación aproximada para el tamaño de la caja de envío

Tengo 3 contenedores con diferentes tamaños. Tengo el ancho, la longitud, la profundidad y la masa del producto definidos en la base de datos.

Me gustaría saber cómo encontrar la menor cantidad de cajas necesarias para enviar, y también las dimensiones más pequeñas de esas cajas dado el número de artículos en el carro.

Mi "idea" actual es encontrar el ancho máximo de toda la matriz de productos, seleccionar un cuadro según este, y luego dividir el orden según sea necesario ... esto no parece que funcione.

Mis tamaños de cajas son: - 8 x 6 x 6 = 228 pulgadas cúbicas - 10 x 8 x 8 = 640 pulgadas cúbicas - 12,5 x 12,5 x 12,5 = 1953.125 pulgadas cúbicas

se define Un producto tales como:

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

he mirado en problema de la mochila, un problema de embalaje, etc, y no puedo encontrar una manera de hacer esto. Cualquier ayuda sería genial.

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

Formateo fijo ... esto no es tarea, es para un sistema de carrito de compras que estoy escribiendo. – Wil

+6

Parece que tan pronto como un problema se vuelve no general, específico y tangible para aplicarse realmente a una situación de la vida real, se etiqueta como tarea, por alguna razón =/ –

+0

@Justin L. Tenía exactamente el sentido opuesto - el problema era demasiado general y desenfocado como para ser un mundo real. ¿Qué te hizo pensar que esto era el mundo real? La presencia de números (3 cajas) o tamaños reales? Esas son sugerencias de tareas para mí. ¿Por qué afirmas que esto no fue general? Es el problema de la mochila y es realmente difícil, por eso suele ser tarea. –

Respuesta

2

En cuanto a obtener una respuesta óptima, eso es NP-duro ... http://en.wikipedia.org/wiki/Bin_packing_problem

El algoritmo voraz se muestra en la Wikipedia, aunque puede ser bastante lejos, podría hacer por su caso.

Sin embargo, como una estimación, puede resumir los volúmenes de los artículos y luego aplicar un factor de ineficiencia y luego usar la (s) caja (s) más pequeña (s) que pueda.

Alternativamente, puede ordenar los artículos en un volumen decreciente y luego ver cuánto puede obtener en el conjunto actual de cuadros, creando un nuevo cuadro cuando no puede ajustar el elemento. No estoy seguro de cómo manejaría un cuadro diferente tamaños sin embargo. También podría tener un caso en el que cambie el tamaño del cuadro en lugar de crear un cuadro nuevo.

Alimento para el pensamiento.

+1

También sugiero almacenar en caché los resultados en una tabla hash, por lo que los cálculos no tendrán que volver a realizarse si vuelve a aparecer la misma combinación de cuadros :) –

+1

Creo que este paquete es una solución de inicio https: // github. com/dvdoug/BoxPacker solo para referencia futura si alguien más del mundo viene aquí para una posible solución: D –

2

Aquí es una tecnología baja, pero posible solución:

solo nos encontramos con el mismo problema. Decidí tomar nuestros tamaños de caja y luego darle a cada producto un porcentaje de cuánto espacio tomó en cada tamaño de caja. Nuestros productos son de forma gratuita y pueden aplastarse un poco, de modo que si los suyos son de tamaño absoluto es posible que necesite reducir los porcentajes para tener en cuenta los productos que se colocan en la caja en diferentes ángulos, ect ... También para nosotros, siempre podemos poner las cosas en los recuadros tienen el mismo ángulo entre sí, de modo que esto también ayuda a que el siguiente método funcione mejor.

Esto supone que hay 3 tamaños de la caja:

  • Producto A
    • Box A = 48% (2 ajuste en una caja)
    • Box B = 30% (3 ajuste en una caja)
    • Box C = 12% (8 en forma en una caja)
  • Producto B
    • caja A = 24%
    • Caja B = 15%
    • Box C = 7%

A continuación, sólo tienen su código de sumar los porcentajes para su artículos del carrito para la caja A, B y C ... obviamente, si alguno está por debajo del 100%, todo debe caber y si comienzas de arriba a abajo, el primero en llegar a menos del 100% se ajustará a tus productos y será la caja más pequeña. Y si se encuentra con cualquier escenario cuando el embalaje no encaja, reduzca ligeramente el porcentaje que ingresó para ese producto.

Para envíos de múltiples cajas solo necesita decidir lo que quiere hacer en cuanto a combinaciones. Lo anterior funciona mejor para envíos de una sola caja, pero con alguna lógica adicional podría funcionar bien para envíos de múltiples cajas.

Cuestiones relacionadas