摘要:
本篇文章围绕仓库拣货优化的领域建模展开,详细介绍了订单、商品、手推车、仓库、拣货步骤等核心业务实体及其关系,强调了区分"规划实体"与"问题事实"对优化建模的重要性。文末引出超市/仓库拣货路径的计算方式——曼哈顿距离,指出实际拣货只能横竖走,不能斜着穿越货架,为后续深入讲解路径优化和距离算法埋下悬念。
下图为本案例的领域模型类图,帮助你整体把握各核心对象及其关系。
本图展示了订单、订单项、商品、手推车、拣货步骤等核心对象及其关系,后文将详细讲解每个对象的作用。
为什么领域建模很重要?
领域建模是优化问题落地的第一步。只有把业务场景抽象成合适的数据结构,优化引擎才能理解并求解实际问题。
在仓库拣货优化中,领域建模的好坏,直接影响到后续约束设计、求解效率和结果可解释性。
仓库拣货的主要业务实体
业务对象 | 说明 | 关键属性/关系 |
---|---|---|
订单(Order) | 客户的一次购买请求 | id, items (订单项列表) |
订单项(OrderItem) | 订单中的单个商品 | id, order, product |
商品(Product) | 仓库中可拣选的商品 | id, name, volume, location |
手推车(Trolley) | 拣货员使用的运输工具 | id, bucketCount, bucketCapacity, location |
仓库(Warehouse) | 仓库整体结构与货架布局 | shelvings, 位置映射 |
拣货步骤(TrolleyStep) | 需要拣选的每个商品+分配的手推车 | id, orderItem, previousElement, trolley |
Planning Entity 与 Problem Fact
Planning Entity(规划实体):在求解过程中会被分配或变化的对象。
- 本案例中:
TrolleyStep
(每个拣货动作/步骤)
- 本案例中:
Problem Fact(问题事实):不会变化的事实数据,作为约束和分配的基础。
- 本案例中:
Trolley
、Product
、WarehouseLocation
等
- 本案例中:
只有把"哪些是可以变化的,哪些是固定事实"区分清楚,才能高效建模和约束。
主要类结构与关系
Order(订单)
public class Order {
private String id;
private List<OrderItem> items;
// ...
}
业务意义:代表客户的一次购买请求,包含多个订单项。
OrderItem(订单项)
public class OrderItem {
private String id;
private Order order;
private Product product;
// ...
}
业务意义:订单中的单个商品,关联所属订单和商品信息。
Product(商品)
public class Product {
private String id;
private String name;
private int volume;
private WarehouseLocation location;
// ...
}
业务意义:仓库中可拣选的商品,包含体积和存放位置。
Trolley(手推车)
public class Trolley {
private String id;
private int bucketCount;
private int bucketCapacity;
private WarehouseLocation location;
// ...
}
业务意义:拣货员使用的运输工具,有容量和起点位置。
Warehouse(仓库)
public class Warehouse {
private Map<String, Shelving> shelvings;
// ...
}
业务意义:仓库整体结构,负责货架、位置等静态信息。
TrolleyStep(拣货步骤,Planning Entity)
public class TrolleyStep extends TrolleyOrTrolleyStep {
private String id;
private OrderItem orderItem;
private TrolleyOrTrolleyStep previousElement;
private Trolley trolley;
// ...
}
业务意义:每个需要拣选的商品+分配的手推车,是优化分配的核心对象。
在优化中的作用:求解器会决定每个 TrolleyStep 属于哪个手推车、在路径中的顺序。
小结
领域建模的核心,是把业务实体和优化目标用代码结构清晰表达出来。只有这样,后续的约束设计和求解才能高效、准确。
看到这里,你是否会好奇:
- 拣货员在超市/仓库里,如何规划出最短的拣货路径?
- 系统是怎么计算"从A点到B点"实际要走多远?
其实,超市和仓库的拣货路径计算,并不是简单的"直线距离",而是采用了曼哈顿距离——也就是只能横着、竖着走,不能斜着穿越货架。
如下图所示:
在超市/仓库场景,拣货员推车只能沿通道横竖移动,路径计算采用曼哈顿距离。
那么,具体的距离是怎么一步步算出来的?为什么不用"直线距离"?
这些问题,我们将在下一篇《曼哈顿距离(Manhattan Distance)通俗讲解》中详细揭晓!
敬请期待,欢迎留言讨论你的思考!
本文首发于微信公众号【Timefold技术前线】
我正在学习和探索 Timefold,内容难免有不足之处,欢迎大家留言指正、补充,一起交流共同进步!
关注公众号,第一时间获取更多原创内容,和我一起持续学习、成长。
转载须知: 本文为原创内容,欢迎分享,转载请注明出处及作者信息,禁止用于任何商业用途,否则将依法追究相关责任。
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。