摘要
本篇文章围绕仓库拣货优化的领域建模展开,详细介绍了订单、商品、手推车、仓库、拣货步骤等核心业务实体及其关系,强调了区分"规划实体"与"问题事实"对优化建模的重要性。文末引出超市/仓库拣货路径的计算方式——曼哈顿距离,指出实际拣货只能横竖走,不能斜着穿越货架,为后续深入讲解路径优化和距离算法埋下悬念。

下图为本案例的领域模型类图,帮助你整体把握各核心对象及其关系。

file

本图展示了订单、订单项、商品、手推车、拣货步骤等核心对象及其关系,后文将详细讲解每个对象的作用。

为什么领域建模很重要?

领域建模是优化问题落地的第一步。只有把业务场景抽象成合适的数据结构,优化引擎才能理解并求解实际问题。

在仓库拣货优化中,领域建模的好坏,直接影响到后续约束设计、求解效率和结果可解释性。


仓库拣货的主要业务实体

业务对象说明关键属性/关系
订单(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(问题事实):不会变化的事实数据,作为约束和分配的基础。

    • 本案例中:TrolleyProductWarehouseLocation
只有把"哪些是可以变化的,哪些是固定事实"区分清楚,才能高效建模和约束。

主要类结构与关系

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点"实际要走多远?

其实,超市和仓库的拣货路径计算,并不是简单的"直线距离",而是采用了曼哈顿距离——也就是只能横着、竖着走,不能斜着穿越货架。

如下图所示:

file

在超市/仓库场景,拣货员推车只能沿通道横竖移动,路径计算采用曼哈顿距离。

那么,具体的距离是怎么一步步算出来的?为什么不用"直线距离"?

这些问题,我们将在下一篇《曼哈顿距离(Manhattan Distance)通俗讲解》中详细揭晓!

敬请期待,欢迎留言讨论你的思考!


本文首发于微信公众号【Timefold技术前线】

我正在学习和探索 Timefold,内容难免有不足之处,欢迎大家留言指正、补充,一起交流共同进步!

关注公众号,第一时间获取更多原创内容,和我一起持续学习、成长。

file


转载须知: 本文为原创内容,欢迎分享,转载请注明出处及作者信息,禁止用于任何商业用途,否则将依法追究相关责任。

本文由博客一文多发平台 OpenWrite 发布!


Timefold技术前线
1 声望0 粉丝

热爱技术分享,专注于智能优化领域,致力于帮助开发者掌握Timefold(OptaPlanner)的应用实践,让复杂问题变得简单。