我正在努力寻找计算运费所需箱子大小的最佳方法。
我有3个不同尺寸的集装箱。我在数据库中定义了产品的宽度,长度,深度和质量。
我想知道如何找到运送所需的最小数量的盒子,以及购物车中物品数量的最小尺寸。
我当前的'想法'是找到整个产品阵列的最大宽度,根据它选择一个框,然后根据需要拆分订单......这似乎不起作用。
我的Box尺寸为: - 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
)
我已经研究了背包问题,包装问题等,但找不到办法。任何帮助都会很棒。
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();
}
答案 0 :(得分:2)
至于获得最佳答案,那就是NP-Hard ... http://en.wikipedia.org/wiki/Bin_packing_problem
维基百科上显示的贪婪算法虽然可能相当遥远,但实际上可能适用于您的情况。
然而,作为估计,您可以只计算项目的数量,然后应用效率低下因子,然后使用最小的框。
或者,你可以将物品分类为减少的体积,然后看看你可以进入当前套盒的数量,当你无法放入物品时创建一个新的盒子。不确定如何处理不同的盒子尺寸虽然。你也可以改变盒子的大小,而不是创建一个新的盒子。
深思熟虑。
答案 1 :(得分:2)
这是一种技术含量低但可行的解决方案:
我们遇到了同样的问题。我决定采用我们的盒子尺寸,然后给每个产品一个百分比来确定每个盒子尺寸占用的空间。我们的产品是自由形式,可以压扁一点,所以如果你的产品尺寸绝对,你可能需要降低百分比,以便考虑到不同角度放在盒子里的产品等等。同样对我们来说,我们总能把它放在一起框中的东西彼此相同,所以这也有助于使下面的方法更好地工作。
这假设有3个盒子大小:
然后让你的代码为你的购物车项目添加A,B和C盒子的百分比......显然,如果有任何低于100%,一切都应该适合,如果你从上到下开始第一个达到更少超过100%将适合您的产品,是最小的盒子。如果您遇到任何不适合打包的情况,只需稍微降低您为该产品输入的百分比。
对于多箱发货,您只需要决定您要做什么以及组合。上述方法最适用于单箱装运,但有一些额外的逻辑可以轻松地适用于多箱装运。