我目前正忙着在一些私人项目上工作,而且我一直困在一个特定的数学问题上。
我知道垃圾箱包装是一个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 |
+-----------+-----------+----------------+----------------+
编辑: 我为不清楚而道歉。我迷失在自己的计算中。我更新了给定的值。
另外,我忘了提到托盘装满了重量和高度。因此,顶部也可以有一个部分填充的层(如果最大高度不是先前的层填充,另一个填充的层将超过允许的最大重量)。
答案 0 :(得分: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
,并且只有两个独立的限制:身高或体重。因此,您首先计算maxBoxesByHeight
和maxBoxesByWeight
,然后获得maxBoxesPerPallet
,然后获得托盘数量(其中大多数将是“完整”,即包含maxBoxesPerPallet
和剩下的可能是最后一个)。