我正忙着在业余时间做一些私人项目,而且我一直困在一个特定的数学问题上。
我知道垃圾箱包装是一个NP-HARD问题,但这不是我面临的问题。
我必须做的是计算我需要适合给定数量的盒子的托盘数量,但是布局(第一级/基础级别)是预先定义的。对我来说,问题是我必须考虑箱子重量,托盘最大重量,箱子高度和托盘最大高度。在一瞬间,这听起来像一个小学数学,但后来我突然迷失了太多if
和else
声明。
以下是我所拥有的:
托盘(宽度,深度,最大高度,最大重量)
盒子(盒子总数,宽度,深度,高度,重量)
现在,正如我所提到的,最简单的部分是我事先已经知道我可以在第一层上安装多少个盒子。但后来,我迷路了,因为我试图检查太多东西。
例如,托盘可以在填充最大高度之前达到最大重量(反之亦然)。另一个(不太可能但可能)的情况,箱子总数(如果足够小)可以安装在一个托盘上,而不会达到托盘的最大高度/重量。
最后,我需要知道满载托盘的数量以及最后(部分填充)托盘是否有任何箱子。
我现在在javascript
工作。如果有人能帮我解决这个问题,我将不胜感激,至少我可以转换一些伪代码。
如果您愿意尝试一下,这里有一些数字可以运行您的算法:
Box Values:
+-----------+-----------+------------+------------+--------------------+-------------------+
| Width(cm) | Depth(cm) | Height(cm) | Weight(kg) | Fits(single layer) | Total (number of) |
+-----------+-----------+------------+------------+--------------------+-------------------+
| 32.5 | 24 | 22 | 14.7 | 9 | 111 |
+-----------+-----------+------------+------------+--------------------+-------------------+
Pallet Values:
+-----------+-----------+----------------+----------------+
| Width(cm) | Depth(cm) | Max.Height(cm) | Max.Weight(cm) |
+-----------+-----------+----------------+----------------+
| 120 | 80 | 145 | 725 |
+-----------+-----------+----------------+----------------+
编辑:我为不清楚而道歉。我迷失在自己的计算中。我更新了给定的值。
另外,我忘了提到托盘的重量和高度都是最大的。因此,顶部也可以有一个部分填充的层(如果最大高度没有填充先前的层,而另一个填充的层将超过允许的最大重量)。
好的,这是我认为体现了meowgoesthedog意味着的代码:
function fillPallets(totalBoxNumber, boxHeight, boxWeight, boxesPerLayer, palletMaxHeight, palletMaxWeight) {
let maxBoxesByHeight = Math.floor(palletMaxHeight / boxHeight) * boxesPerLayer;
let maxBoxesByWeight = Math.floor(palletMaxWeight / boxWeight);
let maxBoxesPerPallet = Math.min(maxBoxesByHeight, maxBoxesByWeight);
let fullPalletsCount = Math.floor(totalBoxNumber / maxBoxesPerPallet);
let palletsCount = Math.ceil(totalBoxNumber / maxBoxesPerPallet);
let lastPalletBoxes = totalBoxNumber - fullPalletsCount * maxBoxesPerPallet;
let buildPallet = function (number) {
let palletLayers = [];
for (let rest = number; rest > 0; rest -= boxesPerLayer) {
palletLayers.push(Math.min(rest, boxesPerLayer))
}
return palletLayers;
}
let pallets = [];
let fullPallet = buildPallet(maxBoxesPerPallet);
for (let i = 0; i < fullPalletsCount; i++) {
pallets.push(fullPallet);
}
if (lastPalletBoxes > 0)
pallets.push(buildPallet(lastPalletBoxes));
return {
count: palletsCount,
palletsLayouts: pallets
}
}
用法示例
fillPallets(111,22,14.7,9,145,725)
产生以下输出
{
"count": 3,
"palletsLayouts": [[9, 9, 9, 9, 9, 4], [9, 9, 9, 9, 9, 4], [9, 4]]
}
这段代码背后的想法是你想要计算maxBoxesPerPallet
,并且只有两个独立的限制:高度或重量。所以你首先计算maxBoxesByHeight
和maxBoxesByWeight
,然后你得到maxBoxesPerPallet
,然后你得到托盘的数量(大多数将是“完整”,即包含正好maxBoxesPerPallet
,其余可能有一个最后)。