尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

BoxPacker快速上手:用PHP算出每件商品进哪个箱子的装箱方案

BoxPacker快速上手:用PHP算出每件商品进哪个箱子的装箱方案 BoxPacker快速上手用PHP算出每件商品进哪个箱子的装箱方案【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPacker当仓库堆着上百件待发货商品、你还要手工试纸箱组合时装箱就成了最费经验的事。BoxPacker 是一个 PHP 的 4D 装箱求解库输入商品与纸箱的尺寸重量直接给出每件商品进哪个箱的方案。上百件商品通常在秒级算完接入只需实现两个接口。它能帮你做什么计算每件商品的落箱方案它的主循环很简单开一个箱子、尽量装满、再开下一个直到所有商品放完。入口在 src/Packer.php。返回 PackedBoxList每个箱子带出装了哪些商品、各自的 x/y/z 坐标同时登记多种纸箱自动先尝试装得下全部剩余商品的箱子某个商品装不下时可选择抛异常或把剩余商品留给你处理平衡多箱之间的重量装完不是终点。多箱时 src/WeightRedistributor.php 会做第二轮重分配。在箱子之间挪动商品避免一箱很沉、一箱很轻默认只在箱子数不超过 12 时执行再多就跳过以节省计算时间重分配时会同时校验每个箱子的最大承重按业务规则约束摆放不是所有商品都能任意放。约束通过接口实现见 src/ConstrainedPlacementItem.php。用 src/Rotation.php 的三个值控制朝向固定方向、可横转 90 度、任意方向实现 canBePacked() 就能表达每箱最多几节电池这类规则用 LimitedSupplyBox 声明某规格纸箱的有限库存从零到跑通获取代码git clone https://gitcode.com/gh_mirrors/bo/BoxPacker或直接作为依赖composer require dvdoug/boxpacker安装依赖项目目录执行composer install要求 PHP 8.2 及以上跑最小示例下面 12 行代码完成加箱、加商品、求方案、读结果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(reference: 小箱, outerWidth: 300, outerLength: 200, outerDepth: 150, emptyWeight: 30, innerWidth: 296, innerLength: 196, innerDepth: 146, maxWeight: 10000)); $packer-addItem(new TestItem(description: 商品A, width: 100, length: 80, depth: 60, weight: 200, allowedRotation: Rotation::BestFit), qty: 3); $packedBoxes $packer-pack(); echo $packedBoxes-count(), 个箱子被打开;跑通后你应该看到控制台打印1 个箱子被打开说明 3 件商品全部装进了小箱。想要更完整的输入格式看 tests/ 里的现成实现和 docs/getting-started.rst不必贴测试代码照着改就行。深入用法与关键配置如何给装箱计算设置超时适用场景商品多或纸箱种类多时计算时间不可控不能让请求无限等下去。use DVDoug\BoxPacker\DefaultTimeoutChecker; $packer-setTimeoutChecker(new DefaultTimeoutChecker(timeout: 5.0)); // 单位秒预期效果任何一步检查发现超过 5 秒就抛出 TimeoutException你可以捕获后走降级逻辑而不是干等。如何处理塞不进去的商品适用场景某件商品比所有纸箱都大默认行为是抛 NoBoxesAvailableException 中断整个计算。一行改动$packer-throwOnUnpackableItem(false)。预期效果pack() 正常返回已装好的箱子没塞进的商品留在 src/Packer.php 的 getUnpackedItems() 里交给人工或二次装箱。如何限制商品摆放方向适用场景易碎、带此面向上标识的商品不能侧放。在 Item 实现的 getAllowedRotation() 里返回值即可Rotation::Never只允许定义方向Rotation::KeepFlat可横转 90 度Rotation::BestFit任意朝向。预期效果侧放方案从搜索结果中直接排除不会出现在最终箱子里。它适合谁电商订单发货订单确认后你需要马上知道用几个箱、什么规格。下单时直接算出纸箱规格与数量替代人工估箱箱子实际重量可直接对接承运商 API运费预估与实际偏差更小打印的运单数等于返回的箱子数不缺单也不浪费仓库出库复核仓管按方案装箱复核靠清单核对。每个商品带 x/y/z 坐标打印出库清单后与实物逐项对照多箱时重量自动再平衡避免一箱沉一箱轻托盘码放更稳方案与实物对不上时重跑一次即可不用手工重排物流报价与批量规划批量询价要快速给出箱数和成本。输入商品清单即得总箱数报价不靠手工试错LimitedSupplyBox 声明纸箱库存方案不会推荐你没有的箱需要对比方案时packAllPermutations() 能列出全部箱型组合箱型多时较慢慎用内部怎么运作Packersrc/Packer.php — 主入口逐箱试装直到全部放完最后触发重量平衡VolumePackersrc/VolumePacker.php — 负责单箱内部的摆放逐件落位WorkingVolumesrc/WorkingVolume.php — 记录箱内剩余可用空间每放一件更新一次OrientatedItemFactorysrc/OrientatedItemFactory.php — 按允许朝向展开商品的所有合法摆法并排序WeightRedistributorsrc/WeightRedistributor.php — 全部装完后跨箱挪动商品、均衡重量DefaultTimeoutCheckersrc/DefaultTimeoutChecker.php — 每步检查耗时超限抛 TimeoutException数据流就一条线商品和箱子进入 Packer分发给 VolumePacker 逐箱填充WorkingVolume 保证每次落位不重叠最后 WeightRedistributor 匀一遍重量以 PackedBoxList 交还给你。上生产前注意什么当商品数量上千或箱型超过十几种时建议先挂上 TimeoutChecker用真实订单数据压测一遍再定阈值当有商品装不进任何箱子时默认抛 NoBoxesAvailableException想降级就throwOnUnpackableItem(false)再从 getUnpackedItems() 取回剩余商品当箱子数超过 12maxBoxesToBalanceWeight 默认值时重量平衡会被跳过需要时调高该值当箱型较多时不要在生产路径调用 packAllPermutations()组合数量会随箱型数膨胀参与与支持Issues 入口功能建议与缺陷直接提交到仓库 Issues附上最小复现的商品与箱子尺寸完整文档本地 docs/ 目录覆盖从安装到约束摆放的全部主题这篇示例的展开版在 docs/getting-started.rst示例代码tests/ 里有可直接借鉴的 Box 与 Item 实现以及公开测试用例的回归数据写在最后手工试纸箱组合这件事可以交给代码了。花 5 分钟装好依赖把上面 12 行示例跑一遍再用你自己业务的对象替换 TestBox 和 TestItem。当 pack() 返回的每个箱子都能说清装了什么、多重、放在哪个坐标它就算正式上岗。MIT 协议的开源项目接入成本就是实现两个接口。【免费下载链接】BoxPacker4D bin packing / knapsack problem solver项目地址: https://gitcode.com/gh_mirrors/bo/BoxPacker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表