logo
0
0
WeChat Login

xxyh

Go 语言实现的服务器端铝型材线性优化算法服务,面向 Docker 容器部署。

目标

支持以下业务场景:

  • 同一种材料,多种成品长度
  • 多种材料,多种成品长度
  • 原材料长度可手动指定
  • 原材料长度可按范围给出,由算法自动推荐
  • 支持多种原材料长度和数量的库存约束
  • 支持下刀缝宽度(kerf)输入,默认 5mm
  • 相同输入必须得到相同输出(确定性结果)

当前版本分为两层:

V1:Excel/VBA 兼容实现

第一阶段严格参考你给的 Excel/VBA 文件实现,核心行为与宏 线性优化() 保持一致:

  1. 先按成品长度从大到小排序;
  2. 将“长度 + 数量”展开成逐件列表;
  3. 逐件按顺序尝试塞进当前已开原料;
  4. 如果已有原料都放不下,就新开一根原料;
  5. 刀缝按 VBA 规则计入:首段不加刀缝,后续每增加一段增加 kerf_width
  6. 最终按相同切割组合做汇总,生成和 Excel “输出”页一致的模式统计结果。

这意味着:

  • 算法是确定性的贪心首适配(First-Fit Decreasing)
  • 输出不仅有逐根 batches,还会给出汇总后的 pattern_summaries
  • 已用 Excel 样例 2线条06 做测试对齐,结果与原表一致:
    • 用料根数 88
    • 总尾料 26096
    • 组合汇总:
      • 1782mm×3 1582mm×1 × 50
      • 1782mm×2 1582mm×2 × 1
      • 1582mm×4 × 37

V2:在 V1 基线之上的扩展实现

在不破坏 V1 确定性和可复核性的前提下,已经补上服务端更实用的扩展能力:

  • 同一种材料,多种成品长度
  • 多种材料,多种成品长度
  • 原材料长度手动指定 allowed_stock_lengths
  • 原材料长度按范围推荐 allowed_stock_range
  • 明确库存约束 stock_items(长度 + 数量)
  • 相同语义输入返回相同结果

当前扩展层的批次选择策略是:

  1. 枚举所有材料及可用原料长度;
  2. 对每个候选长度,按 V1 同样的贪心装载方式模拟一批;
  3. 在候选批次中稳定选择:
    • 优先容纳件数更多;
    • 件数相同则尾料更少;
    • 尾料相同则原料更短;
    • 仍相同则按材料名排序。

这保证了接口扩展后,依然保持可解释、可重现、可审计

说明:这是第一版可落地实现,先复刻 Excel/VBA,再向动态规划、整数规划、列生成等更强优化算法演进。

HTTP API

健康检查

curl http://localhost:8080/healthz

计算优化结果

curl -X POST http://localhost:8080/optimize \ -H 'Content-Type: application/json' \ -d '{ "kerf_width": 5, "materials": [ { "name": "6063-T5", "allowed_stock_range": {"min": 5000, "max": 7000, "step": 500} }, { "name": "6061-T6", "allowed_stock_lengths": [6000, 6500] }, { "name": "6063-inventory", "stock_items": [ {"length": 6000, "quantity": 2}, {"length": 4500, "quantity": 3} ] } ], "cuts": [ {"length": 1800, "quantity": 3}, {"length": 900, "quantity": 2} ] }'

字段说明:

  • kerf_width:下刀缝宽度,单位 mm;可省略,默认 5
  • materials[].allowed_stock_lengths:允许算法自由选用的原材料长度列表(默认视为数量不限)
  • materials[].allowed_stock_range:允许算法在范围内按步长枚举原材料长度(默认视为数量不限)
  • materials[].stock_items:明确库存约束,支持“多种长度 + 每种长度对应数量”
  • cuts[]:成品切割需求,length 为长度,quantity 为数量

allowed_stock_lengths / allowed_stock_range 可以和 stock_items 同时存在:前两者表示可自由选型,后者表示有限库存;算法会统一排序后做确定性选择。

返回示例:

{ "batches": [ { "material_name": "6063-T5", "stock_length": 5500, "cuts": [1800, 1800, 1800], "waste": 90 }, { "material_name": "6063-inventory", "stock_length": 4500, "cuts": [900, 900], "waste": 2695 } ], "pattern_summaries": [ { "pattern_key": "1800+1800+1800", "display_text": "1800mm×3", "count": 1, "waste": 90, "cuts": [1800, 1800, 1800] }, { "pattern_key": "900+900", "display_text": "900mm×2", "count": 1, "waste": 2695, "cuts": [900, 900] } ], "total_waste": 2785 }

其中:

  • batches:逐根原料的下料结果
  • pattern_summaries:按 Excel “输出”页风格汇总后的切割模式统计
  • total_waste:总尾料

本地测试

项目不依赖本机 Go 环境,直接用 Docker 运行:

docker build -t xxyh:local . docker run --rm -p 8080:8080 xxyh:local

构建阶段会自动执行:

go test ./...

目录结构

. ├── cmd/server/main.go # HTTP 服务入口 ├── internal/optimizer/ # 确定性优化算法 ├── Dockerfile # Alpine 运行镜像 └── README.md

已完成内容

  • 基于 Excel/VBA 逻辑实现确定性首适配降序下料
  • 支持刀缝参数
  • 支持 Excel 风格的组合汇总输出 pattern_summaries
  • 支持多材料、多原料长度、长度范围推荐、库存数量约束
  • 提供 HTTP API 与 Alpine Docker 镜像
  • 通过 Docker 构建时自动执行 go test ./...

后续建议

后续如果要进一步提升“最优率”或业务表达能力,建议继续增加:

  • 最小尾料复用阈值
  • 按材料成本/重量/库存优先级打分
  • 动态规划 / 分支定界 / 整数规划求全局最优
  • 同一输入的 canonical JSON hash,便于结果缓存与审计
  • Excel 导入接口 / 报表导出接口

About

Go server for aluminum profile linear optimization algorithms

Language
Go97.6%
Dockerfile2.4%