如何解决遍历和组合产品的最佳方法
我正在寻找您对实现此目标的最佳方式的个人想法,因为我可以看到很多达到同一目的的方式。
我的店面有多个不同的小册子,可以任意组合订购。
每个小册子项目在数据库中具有L xW x H和重量。它们实际上都是L x W一样的,只是厚度和重量在变化。
我还设置了最大盒子尺寸。
我知道我可以在最大的盒子中容纳10.5的高度。
但是我可以合并这些书以进行运输。因此,我想尽可能地填充盒子,然后重复直到我只有部分盒子为止。
我需要的最终结果是每个盒子及其重量的数组。
示例:
订购的商品
- 第一本书100的厚度为.05,重量为.15
- 第二本书200的厚度为.07,重量为.23
高度
- 100 * .05 = 5
- 200 * .07 = 14
重量
- 100 * .15 = 15
- 200 * .23 = 46
第1栏包含
- 第二本书150个
- 高度:150 * .07 = 10.5
- 重量:150 * .23 = 34.5
第2栏包含
- 第二本书50本书和第一本书100本书
- 高度:(100 * .05)+(50 * .07)= 8.5
- 重量:(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);
}
}
解决方法
作为箱装问题的经典例子,这无可避免,尽管我也不是数学家,但很多人都对此进行了深思熟虑。所以:
没有已知的最优解决方案,可以用多项式时间来计算,并且看来您输入的大小可能很大。因此,您应该采用以下启发式之一:
-
First Fit Algorithm
:逐个处理小册子,将其放在具有足够容量以容纳小册子的第一个框中。如果没有此类框,则必须启动一个新框并将其添加到可用框列表中。 -
Best Fit Algorithm
:一本一本地处理小册子,然后将其放入最紧的盒中(剩余容量最小)。如果没有可容纳小册子的盒子,则必须启动一个新盒子并将其添加到可用盒子列表中。 -
First Fit Decreasing Algorithm
:首先通过降低高度来对小册子进行排序,然后执行“第一拟合算法”。在您的示例中,您将首先打包“ Book 2”手册。 -
Best Fit Decreasing Algorithm
:首先通过降低高度对小册子进行排序,然后执行最佳拟合算法。
但是,当然,您的订单包含N种特定类型小册子的项目。在上述算法中,我们将宽松地采用“每次一次”的处方。因此,例如,如果您正在执行“第一拟合算法”,那么当您找到第一个有能力容纳小册子的盒子时,很容易计算出该盒子可以容纳的最大小册子数M。一次最多处理min(M,N_LEFT)
本小册子,其中N_LEFT
是您仍然需要打包的那种大小的小册子数。对于其他三种算法,也是如此。
您可以调查上述其他装箱启发式方法,仅是示例四。我不能说一个案例在所有情况下都必须优于其他案例。我认为对它们中的任何一个进行合理的实现都可以满足您的目的。无论如何,这是我的看法。
,这是bin-packing problem。最佳算法是Korf's。如果这对于您拥有的数据量来说太慢了,那么有多种算法可以更快地提供良好的近似答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。