
BoxPacker 实战四维装箱算法【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPacker电商订单里 47 件商品打包员要手动挑箱型、反复试错怎么塞运费和面单数量都看它的脸色。BoxPacker是 PHP 写的一个四维装箱bin packing/ 背包问题求解器给定物品的三维尺寸和重量加上可用箱型清单它自动算出用哪些箱、用几只、怎么摆还顺手把每只箱子的重量摊匀直接对接运费计算与面单打印。BoxPacker 一句话讲清楚一个 PHP 库PHP 8.2MIT 协议解决4D装箱问题长宽高之外重量是第四个约束目标是用尽量少的箱把货装下。和普通 3D 装箱工具的区别有三点支持按物品指定翻转规则Box/Item是接口你自己的商品、箱型实体可以直接传入不必先转成库内数据结构装完拿回来的也是你自己的对象箱型可设库存上限。主流程入口见 src/Packer.php。 智能装箱核心能力拆解空间搜索把箱子当坐标系单箱搜索由src/VolumePacker.php完成它沿箱内坐标系逐个落子剩余空间交给src/WorkingVolume.php记账每放入一件物品空闲空间被重新划分子块后续只搜索真正的空地不做无谓碰撞判断支持分层打包src/LayerPacker.php一层一平面地铺满再往上叠外层Packer先按体积排序试箱型装不下全部物品体积的小箱排在后面省掉注定失败的计算方向与堆叠约束每件物品通过Rotation枚举声明翻转规则特殊规则用接口挂接KeepFlat可转 90° 但不能侧躺适合带向上标记的易碎品BestFit任意方向摆放Never则完全锁定姿态实现 ConstrainedPlacementItem 的canBePacked()可写自定义规则比如每箱最多 4 节电池不实现时算法不受额外开销影响重量平衡与箱型选择装完后若箱子数在 2~12 之间WeightRedistributor 会在箱对之间挪动物品把每箱重量拉向平均值避免一箱压塌、一箱飘着库存有限的箱型用LimitedSupplyBox或setBoxQuantity()声明算法不会超发packAllPermutations()能枚举全部可行装箱组合方便你再按箱价挑最省的一套箱型多时很慢5分钟上手从安装到第一个装箱结果git clone https://gitcode.com/gh_mirrors/bo/BoxPacker # 或者集成到自己项目 composer require dvdoug/boxpacker最小可运行示例TestBox/TestItem是仓库自带的测试实现参数依次为外尺寸、空重、内尺寸、限重use DVDoug\BoxPacker\Packer; use DVDoug\BoxPacker\Rotation; use DVDoug\BoxPacker\Test\TestBox; use DVDoug\BoxPacker\Test\TestItem; $packer new Packer(); $packer-addBox(new TestBox(小箱, 300, 300, 10, 10, 296, 296, 8, 1000)); $packer-addItem(new TestItem(商品A, 250, 250, 12, 200, Rotation::KeepFlat), 2); foreach ($packer-pack() as $box) { echo $box-box-getReference(), , $box-items-count(), 件共, $box-getWeight(), g; }更完整的用法单箱试装、结果遍历看 tests/ 与 docs/getting-started.rst。落地场景谁在用它电商运费计算订单确认后调一次pack()拿到箱型、箱数、整箱重量直接喂给承运商 API 询价30 件订单一次算完不再靠人肉估履约中心打单返回的装箱数就是面单数每件商品落在哪只箱里都有坐标贴错箱、漏件可以直接对账仓储与托盘规划同一套空间搜索引擎反过来用——给定集装箱内尺寸算最多装得下哪些 SKU 组合减少半空出仓⚙️ 进阶与调优超时、预算与异常超时保护$packer-setTimeoutChecker(new DefaultTimeoutChecker(5.0))批量任务跑超 5 秒抛TimeoutException及时止损实现见 src/DefaultTimeoutChecker.php重量平衡预算setMaxBoxesToBalanceWeight()默认 12 只控制平衡阶段触发上限大件多箱订单调小可省时间边界情况某件商品放不进任何箱型时默认抛NoBoxesAvailableException调throwOnUnpackableItem(false)可改为能装先装未装下的用getUnpackedItems()取回人工处理架构速览核心模块一览Packer.php— 总入口负责试箱、选最优箱、触发重量平衡VolumePacker.php— 单箱内的空间搜索与落子WorkingVolume.php— 剩余空间记账空间搜索只查空地LayerPacker.php/LayerStabiliser.php— 分层铺底与层内排序WeightRedistributor.php— 跨箱重量再分配社区与展望如何参与提 issue实际项目里遇到旋转限制、特殊堆叠等边界情况直接反馈场景和复现数据提 PR单测全部 PHPUnit结构清晰自定义排序器、新约束接口都可以增量贡献补文档docs/是 Sphinx 的 rst 文档加一个行业用例示例的门槛很低后续方向跟着项目现状走packAllPermutations()全组合搜索天生耗时值得做剪枝自带的 visualiser/ 三维可视化TypeScript Vite在交互和性能上还有明显空间。如果你在用 PHP 做电商或物流系统想把手写 if-else 的装箱逻辑换成开箱即用的引擎克隆下来跑一次pack()看看结果。【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPacker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考