php 计算装运箱尺寸的粗略估计值

0qx6xfy6  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(140)

我试图找到最好的方法来计算装运所需的箱子大小。
我有3个不同大小的集装箱。我在数据库中定义了产品的宽度、长度、深度和质量。
我想知道如何找到最小数量的箱子需要船舶,也是最小的尺寸,这些箱子的数量在购物车的项目。
我目前的“想法”是找到整个产品数组的最大宽度,根据它选择一个框,然后根据需要拆分订单...这似乎行不通。
我的 Package 箱尺寸为:- 8 x 6 x 6 = 228立方英寸- 10 x 8 x 8 = 640立方英寸- 12.5 x 12.5 x 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
                )

我已经调查了背包问题, Package 问题等,但不能找到一种方法来做到这一点。任何帮助将是巨大的。

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();  
    }
jvlzgdj9

jvlzgdj91#

至于得到一个最优答案,这是NP难... http://en.wikipedia.org/wiki/Bin_packing_problem
维基百科上显示的贪婪算法,虽然可能离得很远,但实际上可能适合您的情况。
然而,作为一个估计,你可以只加总的项目体积,然后应用一个 * 效率低下的因素 *,然后使用最小的盒子(s),你可以。
或者,您可以将项目按体积递减的顺序排序,然后查看您可以放入当前的一组框中,当您无法放入项目时创建一个新框。但不确定如何处理不同的框大小。您也可以更改框大小而不是创建一个新框。
值得深思。

wqnecbli

wqnecbli2#

这里是一个低技术,但可能的解决方案:
我们刚刚遇到了同样的问题。我决定采取我们的盒子大小,然后给予每个产品多少空间,它在每个盒子大小的百分比。我们的产品是自由的形式,可以压扁一点,所以如果你的是绝对的大小,你可能需要减少百分比,以考虑到产品被放在盒子里的不同Angular 等...同样对我们来说,我们能够总是把东西放在盒子里,彼此成相同的Angular ,所以这也有助于使下面的方法更好地工作。
假设有3种 Package 盒尺寸:

  • 产品A
  • Package 盒A = 48% (2个装在一个 Package 盒中)
  • 箱B = 30% (3个装在一个箱中)
  • 箱C = 12% (8个装在一个箱中)
  • 产品B
  • 方框A = 24%
  • 方框B = 15%
  • 方框C = 7%

然后,只需让您的代码加起来的百分比为您的购物车项目的框A,B和C ...显然,如果任何低于100%的一切都应该适合,如果你开始从上到下的第一个达到低于100%将适合您的产品,是最小的盒子.如果你遇到任何情况下,当 Package 不适合只是稍微减少百分比,你输入的产品.
对于多箱货件,您只需要决定您想做什么作为组合。上述工作最适合单箱货件,但与一些额外的逻辑可以很容易地工作,以及多箱货件。

相关问题