微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遍历和组合产品的最佳方法

如何解决遍历和组合产品的最佳方法

我正在寻找您对实现此目标的最佳方式的个人想法,因为我可以看到很多达到同一目的的方式。

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

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

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

我知道我可以在最大的盒子中容纳10.5的高度。

但是我可以合并这些书以进行运输。因此,我想尽可能地填充盒子,然后重复直到我只有部分盒子为止。

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

示例:

订购的商品

  1. 第一本书100的厚度为.05,重量为.15
  2. 第二本书200的厚度为.07,重量为.23

高度

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

重量

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

第1栏包含

  1. 第二本书150个
  2. 高度:150 * .07 = 10.5
  3. 重量:150 * .23 = 34.5

第2栏包含

  1. 第二本书50本书和第一本书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);
                }
            }

解决方法

作为箱装问题的经典例子,这无可避免,尽管我也不是数学家,但很多人都对此进行了深思熟虑。所以:

没有已知的最优解决方案,可以用多项式时间来计算,并且看来您输入的大小可能很大。因此,您应该采用以下启发式之一:

  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是您仍然需要打包的那种大小的小册子数。对于其他三种算法,也是如此。

您可以调查上述其他装箱启发式方法,仅是示例四。我不能说一个案例在所有情况下都必须优于其他案例。我认为对它们中的任何一个进行合理的实现都可以满足您的目的。无论如何,这是我的看法。

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。