【问题标题】:best way to loop through and combine products循环和组合产品的最佳方式
【发布时间】:2020-12-28 08:27:32
【问题描述】:

我正在寻找您对实现此目的的最佳方法的个人想法,因为我认为有多种方法可以达到相同的目的。

我有一个店面,里面有多个不同的小册子,可以任意组合订购。

每个小册子项目在数据库中都有 L x W x H 和重量。它们的长 x 宽实际上都一样,只是厚度和重量不同。

我也设置了最大盒子尺寸。

我知道我可以将 10.5 的高度放入最大的盒子尺寸中。

不过,我可以合并这些书以进行运输。所以我想尽可能地把盒子填满,然后重复直到我只有一个部分的盒子。

我需要的最终结果是每个盒子及其重量的数组。

例子:

订购的物品

  1. 100 册,厚度为 0.05,重量为 0.15
  2. Book 2 的 200 个,厚度为 0.07,重量为 0.23

高度

  1. 100 * .05 = 5
  2. 200 * .07 = 14

权重

  1. 100 * .15 = 15
  2. 200 * .23 = 46

框 1 包含

  1. 第 2 册的 150
  2. 高度:150 * .07 = 10.5
  3. 重量:150 * .23 = 34.5

框 2 包含

  1. 第 2 册的 50 和第 1 册的 100
  2. 高度:(100 * .05) + (50 * .07) = 8.5
  3. 重量:(100 * .15) + (50 * .25) = 27.5

您将如何遍历信息以获取输出? 从一个产品开始,计算高度,将其分成完整的盒子,计算这些盒子的重量并将每个完整的盒子添加到数组中,获取部分盒子的高度并继续下一个产品?还是……??

静态编码会“简单”,但我正在尝试动态编码,这样我就不必每次添加新产品时都回来。

-编辑-

这是我当前的循环,但这只是总计数量并分成盒子。目前的产品都是相同的尺寸/形状,所以这很好用。

    if($zip_code != '')
    {
        my $item_list = enc_sql_select_multi("SELECT * FROM `$PREF{shopping_carts_table}` WHERE `cart_id` = '$cart_id' AND `sold` = '0' AND `deleted_from_cart` = '0'");
        my $item_qty = '0';
        foreach my $k (sort { $a <=> $b } keys %$item_list)
        {
            $item_qty =~ s/,//g;
            my $item_id = $$item_list{$k}{id};
            my $item_qty_new = $$item_list{$k}{option1value};
            $item_qty_new =~ s/,//g;
            $item_qty = $item_qty + $item_qty_new;
        }
        if ($item_qty != '0')
            {
                $item_qty =~ s/,//g;
                if ( $item_qty == 25 )
                {
                    my $tempCount = $carton_specs{25}{boxNo};
                    $tempCount++;
                    $carton_specs{25}{boxNo} = $tempCount;
                }
                elsif ( $item_qty == 50 )
                {
                    my $tempCount = $carton_specs{50}{boxNo};
                    $tempCount++;
                    $carton_specs{50}{boxNo} = $tempCount;
                }
                elsif ( $item_qty == 100 )
                {
                    my $tempCount = $carton_specs{100}{boxNo};
                    $tempCount++;
                    $carton_specs{100}{boxNo} = $tempCount;
                }
                elsif ($item_qty > 100 && $item_qty < 5000)
                {
                    my $fullBoxCt = int($item_qty / 200);
                    my $tempCountFull = $carton_specs{200}{boxNo};
                    $tempCountFull = $tempCountFull + $fullBoxCt;
                    $carton_specs{200}{boxNo} = $tempCountFull;
                    my $partBoxQty = $item_qty - (200 * $fullBoxCt);
                    if ($partBoxQty != 0)
                    {
                        my $tempCountPart = $carton_specs{$partBoxQty}{boxNo};
                        $tempCountPart++;
                        $carton_specs{$partBoxQty}{boxNo} = $tempCountPart;
                    }
                }
                else
                {
                    @shipDetails =
                    (
                        {
                            Code => 1000,
                            Price => '0.00'
                        },
                        {
                            Code => 1500,
                            Price => '0.00'
                        }
                    );
                    return (@shipDetails);
                }
            }

【问题讨论】:

    标签: javascript arrays web foreach cgi


    【解决方案1】:

    这是装箱问题的经典例子,虽然我也不是数学家,但很多人都已经考虑过这个问题。所以:

    对于这个问题没有已知的最优解决方案可以在多项式时间内计算出来,而且看起来你的输入的大小可能非常大。因此,您应该采用以下启发式方法之一:

    1. First Fit Algorithm: 将小册子逐一处理,放入第一个有足够容量容纳小册子的盒子中。如果没有此类框,则必须启动一个新框并将其添加到可用框列表中。
    2. Best Fit Algorithm:将小册子一一处理,放在最紧的盒子里(剩下的容量最小)。如果没有可以容纳小册子的盒子,则必须启动一个新盒子并将其添加到可用盒子列表中。
    3. First Fit Decreasing Algorithm:首先通过降低高度对小册子进行排序,然后执行首次拟合算法。在您的示例中,您将首先打包“Book 2”小册子。
    4. Best Fit Decreasing Algorithm:首先按高度递减排列小册子,然后执行最佳拟合算法。

    但是,当然,您的订单包含 N 件某种类型的小册子。我们将松散地采用上述算法中的“一次一个”的处方。因此,例如,如果您正在执行第一次拟合算法,那么当您找到第一个能够容纳小册子的盒子时,很容易计算出那些小册子的最大数量 M,该盒子可以容纳并且一次最多可处理min(M, N_LEFT) 个小册子,其中N_LEFT 是您仍要打包的该尺寸的小册子数量。对于其他三种算法中的任何一种也是如此。

    您可以调查其他装箱启发式方法,以上只是示例四。我不能说一个在所有情况下都一定优于其他。我认为任何合理的实施都将满足您的目的。无论如何,这是我的看法。

    【讨论】:

    • 好的,这比其他文章更容易理解。并且几乎证实了我的想法。感谢您花时间回答!我可能会选择 First Fit 选项,然后循环浏览订单中的项目。如果他们达到了想要添加大小不同的小册子但比我现在拥有的静态编码更好的项目的程度,仍然不是“最佳”。
    【解决方案2】:

    这是bin-packing problem。最佳最优算法是Korf's。如果这对于您拥有的数据量来说太慢了,那么有各种算法可以更快地提供良好的近似答案。

    【讨论】:

    • 这两篇文章都很吸引人,但我不是数学家,它们并没有真正告诉我如何优化编码循环以找出适合盒子的东西。我知道打包可能非常深入,并且有一些程序包含所有复杂的数学来优化货运和各种事情。但是,我知道其中的 2 个尺寸,我只需要根据高度计算出总共有多少件物品,以及多少个盒子,以及一个盒子里可以装什么。我有几个想法,我正在寻找其他人的想法。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2011-08-21
    • 2014-01-07
    • 2020-11-12
    • 2013-11-26
    • 2020-08-27
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多