Skip to content

Husky0c/SLAP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

118 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SLAP - 货位分配优化项目 (Slotting Allocation Project)

简介

本项目旨在使用多目标进化算法 (MOEA) 解决自动化存储和检索系统 (AS/RS) 中的货位分配优化问题。目标是找到一组帕累托最优的分配方案,以平衡多个运营目标,例如最小化堆垛机行程时间、最大化货架稳定性以及均衡巷道间的货物分布。

本项目使用 MOEA Framework,并实现了一个自定义的自适应 PMX (aPMX) 交叉算子。结果可视化通过 MATLAB 实现。

主要特性

  • 多目标优化:针对 AS/RS 货位分配问题,同时优化多个冲突目标。
    • 最小化加权总行程时间
    • 最大化货架稳定性(基于货物重量和位置)
    • 最小化巷道间 SKU 分布的不均衡度
  • 自定义进化算子
    • aPMX:一种自适应的部分匹配交叉 (PMX) 算子,其片段数量和长度可以根据进化进程动态调整(在 customRun 模式下)。
    • 支持标准的 PMX 和 Swap 变异算子。
  • 可配置性:通过 config.properties 文件轻松配置仓库布局、堆垛机参数、SKU 信息及算法参数。
  • 结果可视化
    • 使用 MATLAB 绘制帕累托前沿比较图。
    • 使用 MATLAB 可视化三维货架的货物分配方案,包括预占用的货物和算法分配的货物。
  • 结果持久化:可以将优化得到的帕累托前沿保存到文件,并从文件加载以供后续分析或比较。
  • 预占用处理:能够模拟仓库中已存在部分货物(预占用)的场景。

项目结构

slap/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/husky0c/
│   │   │       ├── Main.java               # 主程序入口,实验设置和运行
│   │   │       ├── custom/                 # 自定义实现
│   │   │       │   ├── AsrsProblem3Objs.java # 3目标优化问题定义
│   │   │       │   ├── AsrsProblem2Objs.java # (可选)2目标优化问题定义
│   │   │       │   ├── aPMX.java             # 自适应PMX交叉算子
│   │   │       │   └── CustomOperatorProvider.java # 注册自定义算子
│   │   │       ├── model/                  # 领域模型
│   │   │       │   ├── WarehouseLayout.java
│   │   │       │   ├── CargoItem.java
│   │   │       │   ├── Location.java
│   │   │       │   └── StackCraneModel.java
│   │   │       └── tools/                  # 工具类
│   │   │           ├── Resultshow.java       # 帕累托前沿绘图工具
│   │   │           └── MatlabRackVisualizer.java # 货架分配可视化工具
│   │   ├── matlab_scripts/         # MATLAB 可视化脚本
│   │   │   ├── plot_pf_multiple.m
│   │   │   ├── Display3dRack.m
│   │   │   └── Display3dRackWithlegend.m
│   │   └── resources/
│   │       ├── config.properties       # 项目配置文件
│   │       └── pf_comparison_output/   # (自动生成)帕累托前沿CSV输出目录
│   └── test/
│       └── java/
├── pom.xml                         # Maven 项目配置文件
└── README.md                       # 本文件

环境搭建与安装

先决条件

  1. Java Development Kit (JDK):建议 JDK 11 或更高版本。
  2. Apache Maven: 用于项目构建和依赖管理。
  3. MATLAB: 需要安装 MATLAB,并且已正确配置 MATLAB Engine API for Java。
    • 确保 MATLAB Engine API for Java 的 .jar 文件 (通常是 engine.jar) 已添加到您的 Java 项目的类路径中,或者通过 Maven 依赖正确引入。
    • 确保 MATLAB 的 extern/engines/java/jar 目录在系统的 PATH 环境变量中,或者 Java 能够找到 MATLAB 引擎的本地库。

构建项目

使用 Maven 构建项目:

mvn clean install

配置说明

项目的主要配置在 src/main/resources/config.properties 文件中。您可以修改此文件来调整:

  • 仓库布局 (warehouse.*)
    • warehouse.numAisles: 巷道数量
    • warehouse.numBays: 每个货架面的货位数
    • warehouse.numLevels: 每个货架面的层数
    • warehouse.preOccupyRatio: 预占用货位的比例
  • 堆垛机参数 (crane.*)
    • 水平/垂直速度、加速度、减速度。
  • SKU 信息 (sku.quantity.SKU-X)
    • 定义不同 SKU 及其待分配的数量。
  • 优化算法参数
    • populationSize: 种群大小
    • operator: 使用的算子组合 (例如 apmx+swap, pmx+swap)
    • pmx.rate: PMX 交叉概率
    • apmx.probability: aPMX 交叉概率
    • apmx.segmentCountScale, apmx.segmentLengthScale: aPMX 的片段数量和长度缩放因子 (注意:在 customRun 模式下,这些参数会被动态调整,配置文件中的值可能被覆盖)
    • swap.rate: Swap 变异概率
    • runCount: 算法运行的评估次数或迭代次数

运行程序

  1. 配置 config.properties:根据您的实验需求修改配置文件。
  2. 运行 Main.java
    • 可以直接在 IDE (如 IntelliJ IDEA, Eclipse) 中运行 com.husky0c.Main 类。
    • 或者,如果已构建 JAR 包,可以使用 java -jar 命令运行。

程序输出

  • 控制台输出:显示算法运行进度、参数配置、帕累托解集大小等信息。
  • 帕累托前沿文件 (.pf)
    • 如果启用了保存功能 (例如在 runcustomRun 方法中),优化结果会保存到 src/main/result/pf/ 目录下。
    • 程序也可以从这些 .pf 文件加载已有的解集进行比较或可视化。
  • CSV 文件
    • Resultshow.plotMultiple 方法会将用于绘图的帕累托前沿数据导出到 src/main/resources/pf_comparison_output/ 目录下的 CSV 文件中。
  • MATLAB 图形窗口
    • 会自动启动 MATLAB 引擎并显示帕累托前沿比较图。
    • 如果调用了 showResultByMatlabshowAllByMatlab,还会显示货架分配的三维可视化图。

可视化

帕累托前沿比较

  • Resultshow.plotMultiple() 方法用于比较一个或多个帕累托前沿。
  • 它会将数据导出到 CSV,然后调用 src/main/matlab_scripts/plot_pf_multiple.m 脚本在 MATLAB 中生成图表。
  • 支持 2D 和 3D 目标空间的绘图。

货架分配可视化

  • Main.java 中的 showResultByMatlab()showAllByMatlab() 方法用于可视化单个解的货架分配情况。
  • showAllByMatlab() 还会显示预占用的货物。
  • 这些方法调用 MatlabRackVisualizer 类,该类进一步调用 src/main/matlab_scripts/Display3dRack.mDisplay3dRackWithlegend.m 脚本。
  • 不同的 SKU 类型会以不同的颜色在三维货架图中表示。

自定义与扩展

  • 添加新的 SKU:在 config.properties 中按照 sku.quantity.SKU-NAME=QUANTITY 的格式添加即可。SKU 的物理属性(重量、周转率)目前在 Main.generateSkuProperties 中随机生成,可以按需修改。
  • 修改仓库布局:直接修改 config.properties 中的 warehouse.* 参数。
  • 尝试新的算子
    1. 实现新的算子类 (例如,实现 Variation 接口)。
    2. CustomOperatorProvider.java 中注册您的新算子。
    3. config.properties 中的 operator 字段指定使用您的新算子。

注意事项

  • MATLAB 依赖:确保 MATLAB 环境和 Engine API for Java 配置正确,否则可视化功能将无法工作。
  • 文件路径:项目中部分文件路径是相对路径 (例如,保存/加载 .pf 文件,MATLAB 脚本路径)。请确保程序在正确的根目录下运行。
  • customRun 模式Main.customRun 方法中的 aPMX 参数 (segmentCountScale, segmentLengthScale) 是动态调整的,会覆盖 config.properties 中的对应设置。

未来工作 (可选)

  • 实现更多的标准/自定义遗传算子。
  • 增加更复杂的约束条件处理。
  • 引入更多的性能指标进行算法评估。
  • 提供不依赖 MATLAB 的备用可视化方案。

贡献

欢迎提出问题、Bug报告和功能请求。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors