优化算法比较(多目标优化算法测试函数大全从ZDT到WFG的完整指南)

优化算法比较(多目标优化算法测试函数大全从ZDT到WFG的完整指南)

admin 2025-10-18 社会资讯 20 次浏览 0个评论

在多目标优化研究中,测试函数是评估算法性能的基石。本文将全面介绍各类多目标测试函数,包括ZDT、DTLZ、WFG、UF、LZ等系列,并通过MATLAB进行可视化展示。

一、ZDT系列(Zitzler-Deb-Thiele)1. ZDT1 - 凸Pareto前沿function [f1, f2] = ZDT1(x) n = length(x); f1 = x(1); g = 1 + 9 * sum(x(2:n)) / (n-1); f2 = g * (1 - sqrt(f1/g));end2. ZDT2 - 凹Pareto前沿function [f1, f2] = ZDT2(x) n = length(x); f1 = x(1); g = 1 + 9 * sum(x(2:n)) / (n-1); f2 = g * (1 - (f1/g)^2);end3. ZDT3 - 不连续Pareto前沿function [f1, f2] = ZDT3(x) n = length(x); f1 = x(1); g = 1 + 9 * sum(x(2:n)) / (n-1); f2 = g * (1 - sqrt(f1/g) - (f1/g)*sin(10*pi*f1));end二、DTLZ系列(Deb-Thiele-Laumanns-Zitzler)1. DTLZ1 - 线性Pareto前沿function f = DTLZ1(x, M) k = length(x) - M + 1; g = 100*(k + sum((x(M:end)-0.5).^2 - cos(20*pi*(x(M:end)-0.5)))); f = zeros(M,1); f(1) = 0.5 * prod(x(1:M-1)) * (1 + g); for i = 2:M-1 f(i) = 0.5 * prod(x(1:M-i)) * (1 - x(M-i+1)) * (1 + g); end f(M) = 0.5 * (1 - x(1)) * (1 + g);end2. DTLZ2 - 凹球面Pareto前沿function f = DTLZ2(x, M) k = length(x) - M + 1; g = sum((x(M:end) - 0.5).^2); f = zeros(M,1); f(1) = (1 + g) * prod(cos(pi/2 * x(1:M-1))); for i = 2:M-1 f(i) = (1 + g) * prod(cos(pi/2 * x(1:M-i))) * sin(pi/2 * x(M-i+1)); end f(M) = (1 + g) * sin(pi/2 * x(1));end三、WFG系列(Walking Fish Group)WFG1 - 混合形状,参数依赖function f = WFG1(x, M) n = length(x); k = 2 * (M - 1); y = x; % 变换 for i = k+1:n y(i) = s_linear(y(i), 0.35); end % 形状函数 f = zeros(M,1); for i = 1:M-1 f(i) = y(i) * (1 + cos(pi/2 * y(i))); end f(M) = 1 - y(M-1) * (1 + sin(3*pi*y(M-1)));endfunction y = s_linear(x, A) y = abs(x - A) / abs(floor(A - x) + A);end四、UF系列(CEC 2009竞赛函数)UF1 - 旋转的复杂Pareto前沿function [f1, f2] = UF1(x) n = length(x); count1 = 0; count2 = 0; sum1 = 0; sum2 = 0; for j = 2:n if mod(j,2) == 1 sum1 = sum1 + (x(j) - sin(6*pi*x(1) + j*pi/n))^2; count1 = count1 + 1; else sum2 = sum2 + (x(j) - cos(6*pi*x(1) + j*pi/n))^2; count2 = count2 + 1; end end f1 = x(1) + 2/count1 * sum1; f2 = 1 - sqrt(x(1)) + 2/count2 * sum2;end五、LZ系列(Li-Zhang)LZ1 - 复杂多模态函数function [f1, f2] = LZ1(x) n = length(x); f1 = x(1) + 2/floor((n-1)/2) * sum(arrayfun(@(j) ... (x(2*j) - sin(6*pi*x(1) + j*pi/n))^2, 1:floor((n-1)/2))); f2 = 1 - sqrt(x(1)) + 2/floor((n-1)/2) * sum(arrayfun(@(j) ... (x(2*j+1) - cos(6*pi*x(1) + j*pi/n))^2, 1:floor((n-1)/2)));endMATLAB可视化代码function plotAllTestFunctions() % ZDT系列可视化 figure('Position', [100, 100, 1200, 800]); subplot(2,3,1); plotZDTFront('ZDT1', @ZDT1); title('ZDT1 - 凸Pareto前沿'); subplot(2,3,2); plotZDTFront('ZDT2', @ZDT2); title('ZDT2 - 凹Pareto前沿'); subplot(2,3,3); plotZDTFront('ZDT3', @ZDT3); title('ZDT3 - 不连续前沿'); % DTLZ系列可视化 subplot(2,3,4); plotDTLZFront('DTLZ2', 3); title('DTLZ2 - 3目标球面前沿'); % UF系列可视化 subplot(2,3,5); plotUFFront('UF1'); title('UF1 - 复杂旋转前沿'); % 3D函数景观 subplot(2,3,6); plot3DLandscape(@ZDT1); title('ZDT1 3D函数景观');endfunction plotZDTFront(name, func) f1_true = linspace(0, 1, 1000); if strcmp(name, 'ZDT1') f2_true = 1 - sqrt(f1_true); elseif strcmp(name, 'ZDT2') f2_true = 1 - f1_true.^2; elseif strcmp(name, 'ZDT3') f2_true = 1 - sqrt(f1_true) - f1_true .* sin(10*pi*f1_true); end plot(f1_true, f2_true, 'r-', 'LineWidth', 2); xlabel('f1'); ylabel('f2'); grid on;endfunction plotDTLZFront(name, M) if M == 2 theta = linspace(0, pi/2, 100); f1 = cos(theta); f2 = sin(theta); plot(f1, f2, 'b-', 'LineWidth', 2); elseif M == 3 [theta, phi] = meshgrid(linspace(0, pi/2, 20), linspace(0, pi/2, 20)); f1 = cos(theta) .* cos(phi); f2 = cos(theta) .* sin(phi); f3 = sin(theta); scatter3(f1(:), f2(:), f3(:), 'filled'); view(3); end xlabel('f1'); ylabel('f2'); if M == 3, zlabel('f3'); end grid on;endfunction plotUFFront(name) x1 = linspace(0, 1, 100); if strcmp(name, 'UF1') f1 = x1; f2 = 1 - sqrt(x1); plot(f1, f2, 'm-', 'LineWidth', 2); end xlabel('f1'); ylabel('f2'); grid on;endfunction plot3DLandscape(func) [X1, X2] = meshgrid(linspace(0,1,50), linspace(0,1,50)); F1 = zeros(size(X1)); F2 = zeros(size(X1)); for i = 1:numel(X1) [f1, f2] = func([X1(i), X2(i)]); F1(i) = f1; F2(i) = f2; end surf(X1, X2, F1 + F2); xlabel('x1'); ylabel('x2'); zlabel('f1+f2'); shading interp;end性能对比测试代码function performanceComparison() functions = {@ZDT1, @ZDT2, @ZDT3, @UF1}; names = {'ZDT1', 'ZDT2', 'ZDT3', 'UF1'}; nPoints = 1000; figure('Position', [100, 100, 1000, 800]); for i = 1:length(functions) subplot(2,2,i); f1_all = zeros(nPoints, 1); f2_all = zeros(nPoints, 1); for j = 1:nPoints x = rand(1, 30); % 30维决策变量 [f1, f2] = functions{i}(x); f1_all(j) = f1; f2_all(j) = f2; end scatter(f1_all, f2_all, 10, 'filled', 'MarkerFaceAlpha', 0.6); title(sprintf('%s - 随机解分布', names{i})); xlabel('f1'); ylabel('f2'); grid on; % 添加性能指标 hv = calculateHypervolume(f1_all, f2_all); gd = calculateGenerationalDistance(f1_all, f2_all, names{i}); text(0.05, 0.95, sprintf('HV: %.3f\nGD: %.3f', hv, gd), ... 'Units', 'normalized', 'BackgroundColor', 'white'); endendfunction hv = calculateHypervolume(f1, f2) ref_point = [max(f1)*1.1, max(f2)*1.1]; [sorted_f1, idx] = sort(f1); sorted_f2 = f2(idx); hv = 0; for i = 1:length(sorted_f1)-1 hv = hv + (sorted_f1(i+1) - sorted_f1(i)) * (ref_point(2) - sorted_f2(i)); endendfunction gd = calculateGenerationalDistance(f1, f2, funcName) % 计算与真实Pareto前沿的世代距离 if strcmp(funcName, 'ZDT1') pf_f1 = linspace(0, 1, 1000); pf_f2 = 1 - sqrt(pf_f1); elseif strcmp(funcName, 'ZDT2') pf_f1 = linspace(0, 1, 1000); pf_f2 = 1 - pf_f1.^2; else gd = NaN; return; end min_distances = zeros(length(f1), 1); for i = 1:length(f1) distances = sqrt((f1(i) - pf_f1).^2 + (f2(i) - pf_f2).^2); min_distances(i) = min(distances); end gd = sqrt(sum(min_distances.^2)) / length(f1);end测试函数选择指南

函数系列

特点

适用场景

ZDT

2目标,不同形状前沿

基本算法性能测试

DTLZ

可扩展目标数

多目标算法测试

WFG

复杂形状,参数可调

高级算法测试

UF

现实问题特征

竞赛算法评估

LZ

多模态,复杂地形

全局搜索能力测试

完整测试程序% 主测试程序function main() % 绘制所有测试函数 plotAllTestFunctions(); % 性能对比分析 figure; performanceComparison(); % 3D可视化 figure; plot3DMultiObjective(@DTLZ2, 3);endfunction plot3DMultiObjective(func, M) if M == 3 n = 1000; points = rand(n, M + 4); % M+4维决策变量 F = zeros(n, M); for i = 1:n F(i,:) = func(points(i,:), M)'; end scatter3(F(:,1), F(:,2), F(:,3), 20, 'filled'); xlabel('f1'); ylabel('f2'); zlabel('f3'); title(sprintf('%d目标优化问题', M)); grid on; rotate3d on; endend% 运行主程序main();多目标优化算法测试函数大全:从ZDT到WFG的完整指南

多目标优化算法测试函数大全:从ZDT到WFG的完整指南

转载请注明来自海坡下载,本文标题:《优化算法比较(多目标优化算法测试函数大全从ZDT到WFG的完整指南)》

每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,20人围观)参与讨论

还没有评论,来说两句吧...