Skip to main content

bm产品装箱(重量合规、SKU 优先)

Project description

Cartonizer(装箱求解器)

一个以“重量合规 + SKU尽量不混装”为核心目标的装箱求解器。

目标与约束

  • 默认 strict 模式下每箱重量必须满足 12.0 kg ≤ weight ≤ 22.5 kg(可配置)。
  • manual_like 模式用于 ERP 已发货手工分箱口径:最低重量是软约束,超重仍是硬约束。
  • 尽量保证同 SKU 装在一起;默认每箱 SKU 种类 ≤ 3,必要时可放宽。
  • 不允许旋转(按固定朝向判断尺寸可放入)。
  • 默认只做快速体积与尺寸过滤;可选 3D 校验。
  • 方案完成后支持箱型替换(更小体积)与数量整形(每箱 SKU qty 尽量为 5/10 的整数倍)。

输入与输出

输入格式与输出格式详见 AGENTS.md 的定义,保持稳定以便后续发布 PyPI。

运行命令

在项目根目录执行:

# 安装开发依赖
pip install -e ".[dev]"

# 运行测试
pytest -q

# 运行示例
python -m cartonizer.cli --input examples/order.json
# 可行性验证
python -m cartonizer.cli --input examples/bm_data.json --geometry-check --geometry-viz-dir output
# ERP 手工分箱口径
python -m cartonizer.cli --input examples/bm_data.json --geometry-check --profile manual_like

CLI 参数说明

  • --input: 输入 JSON 路径(必填)。
  • --geometry-check: 对每个箱执行 3D 几何校验(需要安装 py3dbp)。
  • --geometry-viz-dir: 输出几何可视化文件的目录(可选)。
  • --profile: strictmanual_like,默认 strict

ERP 已发货样本导出

可用只读工具导出 ERP 已发货手工分箱作为回归 fixture:

python tools/export_erp_shipped_cases.py

默认导出已发货手工分箱中的有效回归样本:

  • 手工方案至少 2 箱。
  • 每箱重量不低于 12kg。
  • 每箱 SKU 种类不超过 6。
  • 只读 ERP 数据,不写回业务库。

后续继续优化时,可先阅读: docs/cartonizer_optimization_prompt.md

打包与发布(PyPI)

1) 构建本地包

python -m build

2) 上传到 PyPI

为避免在命令行或文档中泄露 Token,推荐使用环境变量:

$env:TWINE_USERNAME="__token__"
$env:TWINE_PASSWORD="<你的PyPI Token>"
python -m twine upload dist/*

如需上传到 TestPyPI:

$env:TWINE_USERNAME="__token__"
$env:TWINE_PASSWORD="<你的TestPyPI Token>"
python -m twine upload --repository testpypi dist/*

分箱思路(详细版)

1) 可行性判定(重量区间)

订单总重为 W,箱数 B 需满足:

  • min_weight * B ≤ W ≤ max_weight * B 推导:
  • B_min = ceil(W / max_weight)
  • B_max = floor(W / min_weight) 如果 B_min > B_maxstrict 模式直接判定 infeasible;manual_like 模式允许继续搜索并把低重箱记录到 metrics。

2) Stage A:SKU 聚合装箱(主解)

逐件分配(不旋转),优先保持 SKU 聚合并满足 SKU 种类限制:

  1. 放入已有箱:优先放入已有同 SKU 的箱,其次放入 SKU 种类更少的箱。
  2. 箱数搜索:从 B_min 起尝试 B_min+1 / B_min+2
  3. 必要时放宽 SKU 限制:若严格限制失败,允许更多 SKU,但仍以少 SKU 为优先。

3) Stage B:修复 underweight(< min_weight)

处理所有低于最小重量的箱:

  1. 轻箱合并(若合并后重量/体积均不超限)
  2. 从重箱搬小件到轻箱(保证 donor 仍 ≥ min_weight)
  3. 跨箱交换(swap)使两箱都落入区间
    优先同 SKU,再必要时跨 SKU。

4) 动态箱数与自动降级

若主解失败,会按顺序自动降级尝试:

  • 利用率目标:0.8 → 0.75 → 0.70 → 0.60
  • 体积阈值:必要时放宽到 fill_rate=0.95
  • SKU 限制:必要时允许更多 SKU,但仍尽量少

5) Stage C:箱型替换与数量整形

在满足重量/体积/尺寸的前提下:

  • 箱型替换优化:能放下的情况下优先换成体积更小的箱型
  • 数量整形:尽量让每箱内每个 SKU 的数量为 5/10 的整数倍(无法满足时保留原值)

6) Stage D:几何可行性校验(可选)

默认仅做“尺寸 + 体积阈值”的快速过滤。
若启用 --geometry-check,使用 py3dbp 做真实 3D 校验。
仅对最终方案进行 3D 验证与可视化输出

备注

  • 当前策略不追求“箱数最少”,而是强调“重量合规 + SKU 聚合优先”。
  • 若需要成本优化、体积利用率二级目标,可在后续版本扩展。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bm_cartonizer-0.3.0.tar.gz (28.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bm_cartonizer-0.3.0-py3-none-any.whl (29.2 kB view details)

Uploaded Python 3

File details

Details for the file bm_cartonizer-0.3.0.tar.gz.

File metadata

  • Download URL: bm_cartonizer-0.3.0.tar.gz
  • Upload date:
  • Size: 28.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for bm_cartonizer-0.3.0.tar.gz
Algorithm Hash digest
SHA256 8fa48f34c6187ba92165272ffe086aa6ffee0ad15f1e938359f49357e585490e
MD5 e3a0e59253ab4d8a5ab8290062e5e3fd
BLAKE2b-256 1e8b8192af6d6b01dc44478c7d311298b14ddd7dc2210747fb1575c5980bbb26

See more details on using hashes here.

File details

Details for the file bm_cartonizer-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: bm_cartonizer-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 29.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for bm_cartonizer-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c8794d312c4705f856614d2ea5c6f9359f28e832ab39d23b86e224d29ba8ac1a
MD5 cfb28e9462d50a4266a5be0f568002e3
BLAKE2b-256 7179839ae97cd4eebff307341cd0b523e515a303e1768f634a6020b4c3ca1fba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page