MATLAB多目标优化算法实现与应用
项目介绍
本项目名为“MATLAB多目标优化算法实现与应用”,是一个基于MATLAB环境开发的完整多目标优化解决方案。项目核心代码完全基于经典的NSGA-II (Non-dominated Sorting Genetic Algorithm II) 算法实现,旨在解决具有多个相互冲突目标的复杂优化问题。
当前实现以标准的ZDT1测试函数为例,演示了算法如何自动搜索优化的帕累托(Pareto)前沿。该代码通过非支配排序和拥挤距离计算,能够在保证解集收敛性的同时维持种群的多样性,最终输出一组均衡的帕累托最优解集。项目包含完整的算法逻辑和动态可视化模块,不仅能够直观展示优化过程,也适合作为深入学习进化多目标优化算法(EMOA)原理的参考。
功能特性
- 标准NSGA-II算法框架:完整实现了NSGA-II的核心流程,包括通过精英保留策略结合父代与子代,保证优秀个体不丢失。
- 快速非支配排序:实现了基于支配计数和被支配集合的高效分层排序算法,将种群划分为不同的非支配层级(Rank)。
- 拥挤距离计算:通过计算个体在目标空间中的密度,引导算法在同层级中优先选择分布稀疏的区域,从而获得分布均匀的帕累托前沿。
- 模拟二进制交叉 (SBX):采用SBX算子进行基因重组,模拟单点交叉的概率分布特性,有效探索解空间。
- 多项式变异:针对实数编码的多项式变异算子,防止算法陷入局部最优,增强全局搜索能力。
- 锦标赛选择:基于“非支配层级优先,拥挤距离次之”的规则进行二元锦标赛选择。
- 动态可视化:
* 在迭代过程中实时绘制当前种群的帕累托前沿,并与ZDT1的理论真前沿进行对比。
* 最终结果展示优化后的帕累托最优解集分布。
- 模块化设计:所有核心算法(如排序、交叉、变异)均通过局部函数实现,结构清晰,易于理解和参数调整。
系统要求
- MATLAB R2016a 或更高版本(代码主要使用基础MATLAB函数,无特殊工具箱强依赖,但建议使用较新版本以获得更好的绘图体验)。
- 无需额外安装第三方库。
使用方法
- 将代码文件保存到MATLAB的工作目录中。
- 直接运行主函数。
- 程序将自动开始100代(默认设置)的进化迭代。
- 运行时会弹出一个图形窗口,左侧子图动态展示每一代的优化进展,控制台会输出当前帕累托成员数量。
- 运行结束后,图形窗口右侧子图将展示最终获得的帕累托最优解集与理论真前沿的对比结果。
代码实现逻辑详解
主程序采用单一脚本结构,内部包含了算法主控制流和必要的子函数。具体流程如下:
1. 参数设置与问题定义
代码首先定义了优化问题ZDT1的属性(30个决策变量,2个目标函数,变量范围0到1)。同时配置了NSGA-II的算法参数:
- 最大迭代次数:100
- 种群规模:100
- 交叉概率:0.9,变异概率:1/30
- SBX和多项式变异的分布指数:均为20
2. 初始化阶段
- 构建个体结构体,包含决策变量位置(Position)、目标值(Cost)、非支配等级(Rank)和拥挤距离(CrowdingDistance)。
- 在变量下界和上界之间进行均匀随机采样,生成初始种群。
- 对初始种群执行第一次非支配排序和拥挤距离计算,并根据这些指标对种群进行初步排序。
3. 主循环(进化过程)
在每一代迭代中,程序执行以下核心步骤:
* 使用锦标赛选择法从父代中挑选配对个体。
* 对配对个体执行模拟二进制交叉(SBX),生成两个子代。
* 对子代执行多项式变异,并处理变量边界约束。
* 计算所有新子代的目标函数值。
- 合并种群:将父代种群和子代种群合并,形成大小为2N的混合种群。
- 环境选择:
* 对混合种群进行快速非支配排序,划分出$F_1, F_2, dots$等前沿。
* 计算各前沿的拥挤距离。
* 根据Rank(越小越好)和CrowdingDistance(越大越好)对混合种群排序。
* 截取前N个个体作为下一代种群(精英保留策略)。
- 可视化更新:提取当前种群中Rank为1的个体(第一帕累托前沿),在二维坐标系中绘制。并在图中叠加ZDT1的理论曲线 $f_2 = 1 - sqrt{f_1}$ 以便直观评估收敛性。
4. 结果分析
循环结束后,代码再次提取最终种群的非支配解集,并在新的子图中绘制最终结果,通过蓝色圆点表示求得的解,黑色线条表示理论最优前沿,以此验证算法性能。
关键算法与函数分析
以下是对代码中包含的局部子函数的详细分析:
CostFunction_ZDT1
实现了标准的ZDT1双目标测试函数。
- 输入:30维决策变量向量。
- 输出:2维目标向量 $[f_1, f_2]$。
- 逻辑:$f_1 = x_1$,辅助函数 $g$ 依赖于其余29个变量,$h$ 函数构建了目标间的凹性关系。
NonDominatedSorting
实现了快速非支配排序算法。
- 计算每个个体的支配数(DominatedCount)和被支配集合(DominationSet)。
- 识别出支配数为0的个体作为第一前沿。
- 通过剥离当前前沿个体并递减其支配个体的计数,迭代地寻找后续前沿(Rank 2, Rank 3...)。
CalcCrowdingDistance
计算同一非支配层级内个体的拥挤距离,用于维持种群多样性。
- 对每个目标上的函数值进行排序。
- 边界个体(最大值和最小值)的距离设为无穷大,确保边界点被优先保留。
- 中间个体的距离等于其前后两个个体在该目标上的距离差的归一化之和。
Crossover (SBX)
模拟二进制交叉算子。
- 基于分布指数 $eta_c$ 和随机数 $u$ 生成参数 $beta$。
- 利用 $beta$ 对两个父代位置进行线性组合。
- 具有扩展搜索空间的能力,生成的子代依然服从父代的分布特征。
Mutation (Polynomial)
多项式变异算子。
- 基于分布指数 $eta_m$ 和随机数生成扰动量 $delta$。
- 对选中的基因位进行微调,通过非线性扰动跳出局部极值。
- 包含显式的边界处理代码,防止变量越界。
TournamentSelection
二元锦标赛选择算子。
- 随机选择两个个体。
- 使用挤压比较算子(Crowded-Comparison Operator):优先选择Rank更小的个体;若Rank相同,则选择拥挤距离更大的个体。这直接体现了NSGA-II的收敛性与分布性并重的思想。