数学:托盘包装(不完全是垃圾箱包装情况)

问题描述 投票:1回答:1

我正忙着在业余时间做一些私人项目,而且我一直困在一个特定的数学问题上。

我知道垃圾箱包装是一个NP-HARD问题,但这不是我面临的问题。

我必须做的是计算我需要适合给定数量的盒子的托盘数量,但是布局(第一级/基础级别)是预先定义的。对我来说,问题是我必须考虑箱子重量,托盘最大重量,箱子高度和托盘最大高度。在一瞬间,这听起来像一个小学数学,但后来我突然迷失了太多ifelse声明。

以下是我所拥有的:

托盘(宽度,深度,最大高度,最大重量)

盒子(盒子总数,宽度,深度,高度,重量)

现在,正如我所提到的,最简单的部分是我事先已经知道我可以在第一层上安装多少个盒子。但后来,我迷路了,因为我试图检查太多东西。

例如,托盘可以在填充最大高度之前达到最大重量(反之亦然)。另一个(不太可能但可能)的情况,箱子总数(如果足够小)可以安装在一个托盘上,而不会达到托盘的最大高度/重量。

最后,我需要知道满载托盘的数量以及最后(部分填充)托盘是否有任何箱子。

我现在在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 |
+-----------+-----------+----------------+----------------+

编辑:我为不清楚而道歉。我迷失在自己的计算中。我更新了给定的值。

另外,我忘了提到托盘的重量和高度都是最大的。因此,顶部也可以有一个部分填充的层(如果最大高度没有填充先前的层,而另一个填充的层将超过允许的最大重量)。

javascript jquery math pseudocode bin-packing
1个回答
0
投票

好的,这是我认为体现了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,并且只有两个独立的限制:高度或重量。所以你首先计算maxBoxesByHeightmaxBoxesByWeight,然后你得到maxBoxesPerPallet,然后你得到托盘的数量(大多数将是“完整”,即包含正好maxBoxesPerPallet,其余可能有一个最后)。

© www.soinside.com 2019 - 2024. All rights reserved.