BoxPacker 装箱算法入门:每件货物该放哪个箱子

📅 2026/8/27 1:21:22
BoxPacker 装箱算法入门:每件货物该放哪个箱子
BoxPacker 装箱算法入门每件货物该放哪个箱子【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPackerBoxPacker 是一个用 PHP 编写的四维装箱算法库。你给它一份货物清单和几种可选纸箱它会直接算出方案每件货物放进哪个箱子、以什么方向摆放、每个箱子连箱带货多重。做电商发货时这类 4D 装箱问题的结果可以直接拿去做运费计算和面单打印。先看问题四维装箱在解决什么手工装箱有两个常见麻烦货没装完却要开第二箱或者箱子塞不满只能加填充物。更隐蔽的是重量分配——第一箱塞满最后一箱轻得几乎只有包装纸收货方和快递员都不舒服。所谓四维前三维是长宽高第四维是重量。装箱算法必须同时满足空间不重叠和承重上限。这是个 NP-hard 问题穷举所有摆法不现实BoxPacker 因此模拟熟练工人的装法体积大的先放沿箱壁向上叠层放得下就并排最后让多箱重量接近。对算法要求不高的人记住这四条就够判断它给出的方案是否合理。完整原则写在 docs/principles.rst读一遍你对整体思路就有数然后进入安装一节。安装 BoxPacker 并准备两类数据环境要求 PHP 8.2 及以上用 Composer 一条命令引入composer require dvdoug/boxpacker库只要求数据对象实现两个接口Item 提供长宽高、重量和允许的旋转方式Box 提供内外部尺寸、空箱重量和承重上限。方法名都比较常见你现有的商品、纸箱实体类通常只差一两个 getter 就能对接。没有现成对象时tests/Test/ 目录下的 TestItem 和 TestBox 是两个可以直接使用的参考实现照着它们的字段建模即可。准备完毕就可以跑下一节的最小示例。跑通一个最小装箱示例use DVDoug\BoxPacker\{Packer, Rotation}; use DVDoug\BoxPacker\Test\{TestBox, TestItem}; $packer new Packer(); $packer-addBox(new TestBox(纸箱A, 300, 200, 150, 100, 290, 190, 140, 5000)); $packer-addItem(new TestItem(商品1, 100, 80, 60, 200, Rotation::KeepFlat)); $packedBoxes $packer-pack();pack() 返回按箱组织的结果箱数就是所需纸箱数每箱里能查到箱子类型、总重量以及每件货物的摆放位置。注意 items 里装的是你传进去的原始对象而不是副本取价格、SKU 这些业务字段很方便。docs/getting-started.rst 里有打印每箱明细的完整版本建议直接照着改成自己的数据。追踪装箱流程从选箱到落货装箱算法的主循环在 src/Packer.php。doBasicPacking() 的套路是只要还有货没装完就轮流让每种纸箱试装剩余货物比较后挑出装得最好的一箱把已装箱的货从待装列表划掉再进下一轮。选箱顺序有个取巧——内装体积够放全部剩余货物的箱子优先试避免在明显装不下的箱子上浪费时间。单箱内部由 src/VolumePacker.php 驱动。它一层一层往上建LayerPacker 在箱底铺平一层后抬高箱面WorkingVolume 记录箱内每个位置还剩多少空间首件货物的朝向对后续布局影响最大所以会额外多试几种摆法每件货允许哪些朝向则由 Rotation 控制。基础装箱完成后如果结果落在 2 到 12 箱之间src/WeightRedistributor.php 会做第二轮包裹重量分配把重箱里的货挪进还有余量的轻箱让各箱重量趋于接近。这个阈值可用 setMaxBoxesToBalanceWeight() 调整传 0 或 1 直接跳过该轮。想彻底看懂从 VolumePacker 的 pack() 方法顺调用链读起即可。按需调整约束与异常行为液体或薄板类商品可以声明 KeepFlat 只允许平放完全锁死朝向用 NoRotation。src/ConstrainedPlacementItem.php 处理更细的限制比如同类商品每箱最多几件、哪些货禁止叠放。纸箱库存有限时改用 LimitedSupplyBox 声明可用数量。有货装不下时默认行为是抛 NoBoxesAvailableException调用 throwOnUnpackableItem(false) 后改为只记日志剩下的货留在 getUnpackedItems() 里由你决定。大批量订单可以挂一个 TimeoutChecker 给求解设时间上限防止单次计算拖太久。调完这些开关装箱算法的行为边界就定了去下一节用测试数据核对输出。用测试数据核对你的方案tests/ 目录内置了十组公开案例br1.txt 到 br10.txt 是输入items.csv 与 boxes.csv 是其中的货物和箱子参数expected.csv 是期望结果PublishedTestCasesTest.php 负责比对。十组案例里既有刚好装满的也有必须拆两箱的覆盖了不少边界。跑一遍 phpunit你对装箱算法各步骤的理解就有了客观校验。tests/PackerTest.php 覆盖单箱装下、多箱分配、装不下抛异常等分支断言写法可以直接当 API 用法参考。哪些场景该引入 BoxPacker它的职责边界很清楚已知货物尺寸重量和候选箱子求一套可用的分配方案。适合的情况包括电商下单后按包裹计运费、仓储系统给拣货单指定纸箱规格、或者单纯想确认一批货最少要几个箱。要留意的是它给出的是启发式结果而非绝对最优解成本敏感到每克的场景需要再叠加自己的业务校验。开始入口就一条命令composer require dvdoug/boxpacker。装好后打开 tests/PackerTest.php把第一个用例里的商品和纸箱换成你自己的数据跑一次看输出。【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPacker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考