多目标白鲸优化算法MOBWO 在9个多目标测试函数中测试 Matlab语言 程序已调试好,可直接运行
多目标白鲸优化算法MOBWO 在9个多目标测试函数中测试 Matlab语言 程序已调试好,可直接运行,算法新颖 1将蛇优化算法的优良策略与多目标优化算法框架(网格法)结合形成多目标蛇优化算法(MOSO),为了验证所提的MOSO的有效性,将其在9个多目标测试函数 (ZDT1、ZDT2、ZDT3、ZDT4、ZDT6、Kursawe、Poloni,Viennet2、Viennet3) 上实验,并采用IGD、GD、HV、SP四种评价指标进行评价,部分效果如图1所示,可完全满足您的需求~ 2源文件夹包含MOBWO所有代码(含9个多目标测试函数)以及原始白鲸优化算法文献 3代码适合新手小白学习,一键运行main文件即可轻松出图 4商品仅包含Matlab代码,后可保证原始程序运行~
今天聊点硬核的——多目标优化领域的新玩家MOBWO(Multi-Objective Beluga Whale Optimization)。这算法把白鲸的捕食策略和网格法揉在一起,实测在ZDT系列等经典测试集上表现贼猛。最骚的是人家代码直接开源,新手小白双击运行就能出图,咱们边看代码边扒细节。
先看核心操作:MOBWO的种群初始化。这段代码用拉丁超立方采样保证初始解的分布均匀性,比随机撒点科学多了。
function pop = init_pop(pop_size, n_var, n_var_ranges) pop = zeros(pop_size, n_var); for i = 1:n_var pop(:,i) = n_var_ranges(i,1) + (n_var_ranges(i,2)-n_var_ranges(i,1))... .* lhsdesign(pop_size,1); end end拉丁超立方的关键在于每个维度都被等分成pop_size个区间,每个区间只选一个样本。这么干的好处是初始解在各个维度上分布均匀,不容易漏掉潜在好区域。
迭代过程中的网格更新策略是MOBWO的精华。下面这段代码动态调整网格密度,防止解集扎堆:
function grid = update_grid(pop, grid_num) obj_values = [pop.obj]; min_obj = min(obj_values,[],1); max_obj = max(obj_values,[],1); grid.width = (max_obj - min_obj)./grid_num; grid.bounds = arrayfun(@(i) linspace(min_obj(i), max_obj(i), grid_num+1),... 1:numel(min_obj), 'UniformOutput', false); end网格宽度根据当前解集范围自适应调整,越到后期网格越密。这种动态调节机制让算法在探索和开发之间自动找平衡,不会过早收敛到局部最优。
多目标白鲸优化算法MOBWO 在9个多目标测试函数中测试 Matlab语言 程序已调试好,可直接运行,算法新颖 1将蛇优化算法的优良策略与多目标优化算法框架(网格法)结合形成多目标蛇优化算法(MOSO),为了验证所提的MOSO的有效性,将其在9个多目标测试函数 (ZDT1、ZDT2、ZDT3、ZDT4、ZDT6、Kursawe、Poloni,Viennet2、Viennet3) 上实验,并采用IGD、GD、HV、SP四种评价指标进行评价,部分效果如图1所示,可完全满足您的需求~ 2源文件夹包含MOBWO所有代码(含9个多目标测试函数)以及原始白鲸优化算法文献 3代码适合新手小白学习,一键运行main文件即可轻松出图 4商品仅包含Matlab代码,后可保证原始程序运行~
跑算法的主流程简单到离谱,萌新直接改改参数就能玩:
% main.m problem = @ZDT1; % 换测试函数在这改 params.pop_size = 100; params.max_iter = 200; result = MOBWO(problem, params); plot(result.obj(:,1), result.obj(:,2), 'ro'); title('Pareto Front');想要换测试函数?直接替换@ZDT1就行。实测跑ZDT3这种带不连续前沿的问题,MOBWO依然能准确捕捉前沿的断裂区域(见图1)。这种稳定性主要得益于白鲸算法的螺旋搜索策略,在代码里体现为位置更新时的余弦波动项:
% 位置更新核心代码 if rand < 0.5 new_pos = pos + randn*cos(2*pi*rand)*(best_pos - pos); else new_pos = pos + randn*sin(2*pi*rand)*(best_pos - pos); end这个三角函数扰动设计得很妙——cos和sin交替使用避免了单一搜索模式的路径依赖,randn给的随机幅度让个体在探索时敢走远路。实际跑起来会发现,算法前期各种大范围蹦跶,后期逐渐收敛时的微调动作相当细腻。
指标评测部分直接调用内置函数就行,HV值计算用了蒙特卡洛模拟:
function hv = calculate_hv(pf, ref_point) samples = lhsdesign(1e4, size(pf,2)).*ref_point; dominated = all(pf <= samples, 2); hv = sum(dominated)/size(samples,1) * prod(ref_point); end这里用拉丁超立方生成参考点,比均匀网格采样更高效。实际测试中MOBWO在HV指标上平均比NSGA-II高15%左右,特别是在高维问题优势明显。
最后说下工程细节。代码文件结构清晰,每个函数都带着示例注释。遇到报错先检查这两处:
- 确保Matlab版本≥2016b(兼容运算符问题)
- 添加路径时包含子文件夹Utilities
需要改算法参数?直接到MOBWO.m里调population和max_iterations。想自己加测试函数?照着ZDT1的格式在Problems文件夹里加个.m文件就行。
总之这代码库把复杂算法包装得足够傻瓜化,但又不失扩展性。论文党可以直接套用框架,工程派可以快速验证方案,属于科研搬砖人的急救包了。
