如何正确调用3D装箱库函数以避免返回Null?
解决3DContainerPacking库调用返回Null的问题
以下是几个可能导致返回Null的原因及对应解决办法:
1. 物品尺寸超出容器限制
检查你添加的物品,比如Item(490661, ..., Convert.ToDecimal(4500), 1)的高度是4500,而容器高度只有2390——哪怕允许物品旋转,这个尺寸也远超容器的最大可用空间,这种情况下算法找不到可行的装箱方案,直接返回Null。
- 解决:先过滤掉所有无法通过旋转放入容器的物品,或者调整容器尺寸适配物品。
2. 单一算法无法找到可行解
你只传入了EB_AFIT一种算法,部分场景下该算法可能找不到最优解甚至可行解。
- 解决:同时传入多种算法扩大搜索范围,比如加上
MaxRects:List<int> algorithms = new List<int>(); algorithms.Add((int)AlgorithmType.EB_AFIT); algorithms.Add((int)AlgorithmType.MaxRects);
3. 物品总体积远超容器容量
如果所有物品的总体积加起来远大于容器的容积,算法也会返回Null。
- 解决:计算容器容积(长×宽×高)和所有物品的体积总和(每个物品长×宽×高×数量),确认是否有装下的可能,必要时减少物品数量或更换更大容器。
4. 依赖或初始化问题
确认项目已正确引用3DContainerPacking库,若使用NuGet安装,检查包是否正常安装完成,没有缺失依赖项。
修改后的示例代码
using CromulentBisgetti.ContainerPacking; using CromulentBisgetti.ContainerPacking.Algorithms; using CromulentBisgetti.ContainerPacking.Entities; // 初始化容器 var containers = new List<Container> { new Container(1, Convert.ToDecimal(12030), Convert.ToDecimal(2400), Convert.ToDecimal(2390)) }; // 初始化物品(移除尺寸超标的Item 490661) var itemsToPack = new List<Item> { new Item(3, Convert.ToDecimal(3100), Convert.ToDecimal(1280.382), Convert.ToDecimal(880), 1), new Item(590261, Convert.ToDecimal(2380), Convert.ToDecimal(460), Convert.ToDecimal(735), 1), new Item(4, Convert.ToDecimal(1638.161), Convert.ToDecimal(891.535), Convert.ToDecimal(2753.832), 2), new Item(2, Convert.ToDecimal(1500), Convert.ToDecimal(1224.091), Convert.ToDecimal(462), 1), new Item(290698, Convert.ToDecimal(1400), Convert.ToDecimal(190), Convert.ToDecimal(150), 2), // 其他物品... }; // 同时使用多种算法 var algorithms = new List<int> { (int)AlgorithmType.EB_AFIT, (int)AlgorithmType.MaxRects }; var result = PackingService.Pack(containers, itemsToPack, algorithms); // 结果验证 if (result != null && result.Any()) { foreach (var containerResult in result) { // 处理装箱结果,比如输出已装物品信息 Console.WriteLine($"容器 {containerResult.ContainerId} 已装入 {containerResult.PackedItems.Count} 件物品"); } } else { Console.WriteLine("未找到可行的装箱方案"); }
内容的提问来源于stack exchange,提问作者shongololo
相关产品推荐
相关产品推荐

