本项目旨在使用多目标进化算法 (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 # 本文件
- Java Development Kit (JDK):建议 JDK 11 或更高版本。
- Apache Maven: 用于项目构建和依赖管理。
- 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 引擎的本地库。
- 确保 MATLAB Engine API for Java 的
使用 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: 算法运行的评估次数或迭代次数
- 配置
config.properties:根据您的实验需求修改配置文件。 - 运行
Main.java:- 可以直接在 IDE (如 IntelliJ IDEA, Eclipse) 中运行
com.husky0c.Main类。 - 或者,如果已构建 JAR 包,可以使用
java -jar命令运行。
- 可以直接在 IDE (如 IntelliJ IDEA, Eclipse) 中运行
- 控制台输出:显示算法运行进度、参数配置、帕累托解集大小等信息。
- 帕累托前沿文件 (
.pf):- 如果启用了保存功能 (例如在
run或customRun方法中),优化结果会保存到src/main/result/pf/目录下。 - 程序也可以从这些
.pf文件加载已有的解集进行比较或可视化。
- 如果启用了保存功能 (例如在
- CSV 文件:
Resultshow.plotMultiple方法会将用于绘图的帕累托前沿数据导出到src/main/resources/pf_comparison_output/目录下的 CSV 文件中。
- MATLAB 图形窗口:
- 会自动启动 MATLAB 引擎并显示帕累托前沿比较图。
- 如果调用了
showResultByMatlab或showAllByMatlab,还会显示货架分配的三维可视化图。
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.m或Display3dRackWithlegend.m脚本。 - 不同的 SKU 类型会以不同的颜色在三维货架图中表示。
- 添加新的 SKU:在
config.properties中按照sku.quantity.SKU-NAME=QUANTITY的格式添加即可。SKU 的物理属性(重量、周转率)目前在Main.generateSkuProperties中随机生成,可以按需修改。 - 修改仓库布局:直接修改
config.properties中的warehouse.*参数。 - 尝试新的算子:
- 实现新的算子类 (例如,实现
Variation接口)。 - 在
CustomOperatorProvider.java中注册您的新算子。 - 在
config.properties中的operator字段指定使用您的新算子。
- 实现新的算子类 (例如,实现
- MATLAB 依赖:确保 MATLAB 环境和 Engine API for Java 配置正确,否则可视化功能将无法工作。
- 文件路径:项目中部分文件路径是相对路径 (例如,保存/加载
.pf文件,MATLAB 脚本路径)。请确保程序在正确的根目录下运行。 customRun模式:Main.customRun方法中的aPMX参数 (segmentCountScale,segmentLengthScale) 是动态调整的,会覆盖config.properties中的对应设置。
- 实现更多的标准/自定义遗传算子。
- 增加更复杂的约束条件处理。
- 引入更多的性能指标进行算法评估。
- 提供不依赖 MATLAB 的备用可视化方案。
欢迎提出问题、Bug报告和功能请求。