为了验证群体智能优化算法的性能,研究者通常会在一组标准化的测试函数上进行实验。这些函数具有明确的数学性质,如多峰性、非线性、约束性等,能够全面衡量算法的搜索能力和收敛性能。本文整理了20个经典的优化测试函数,并提供了统一接口函数和对应目标函数定义,适用于算法开发与比较实验。
一、模块功能介绍
该模块主要由以下两部分构成:
-
Get_Functions_details(F):根据输入的编号(如'F1'、'F2'),返回该测试函数的:- 函数句柄
fobj - 搜索空间下界
lb - 上界
ub - 变量维度
dim
- 函数句柄
-
一组已定义的测试函数
F1 ~ F20,均封装为匿名函数格式,可直接用于优化算法调用。
使用方式简单,例如:
[lb, ub, dim, fobj] = Get_Functions_details('F11'); % 获取Rastrigin函数配置
二、常用测试函数列表与说明
| 编号 | 函数名称 | 特性 | 维度 | 搜索范围 |
|---|---|---|---|---|
| F1 | Schwefel-like | 多峰函数 | 30 | [-600, 600] |
| F2 | 绝对值+乘积函数 | 多峰,非凸 | 30 | [-10, 10] |
| F3 | Shekel’s Foxholes | 多极值,二维 | 2 | [-65.536, 65.536] |
| F4 | 最大绝对值函数 | 单峰函数 | 30 | [-100, 100] |
| F5 | Rosenbrock | 非线性单谷函数 | 30 | [-30, 30] |
| F6 | Branin | 多极值函数 | 2 | [-5, 20] |
| F7 | 有约束惩罚函数 | 含惩罚项 | 30 | [-100, 100] |
| F8 | 不等式约束函数 | 带不等式约束 | 3 | [0, 1] |
| F9 | 等式约束函数 | 带等式约束 | 3 | [0, 2] |
| F10 | Sphere | 简单凸函数 | 30 | [-100, 100] |
| F11 | Rastrigin | 多峰函数 | 30 | [-5.12, 5.12] |
| F12 | Griewank | 多峰,复杂形状 | 30 | [-600, 600] |
| F13 | Ackley | 多极值,难收敛 | 30 | [-32, 32] |
| F14 | Zakharov | 单峰 | 30 | [-5, 10] |
| F15 | Levy | 多极值函数 | 10 | [-10, 10] |
| F16 | Schaffer N.2 | 非常尖锐的函数 | 2 | [-100, 100] |
| F17 | Eggholder | 非常复杂多峰 | 2 | [-512, 512] |
| F18 | Drop-Wave | 多峰,波动型 | 2 | [-5.12, 5.12] |
| F19 | Schwefel | 多峰,全局最优远离原点 | 30 | [-500, 500] |
| F20 | Michalewicz | 非常复杂 | 10 | [0, π] |
部分测试函数示例:







三、函数结构说明
1. 主函数
该函数根据输入字符串 'F1' ~ 'F20',输出目标函数的配置信息和对应函数句柄,方便统一调用。示例:
function [lb,ub,dim,fobj] = Get_Functions_details(F)
switch F
case 'F11'
fobj = @F11;
lb = -5.12;
ub = 5.12;
dim = 30;
...
end
end
2. 测试函数定义示例:
function o = F10(x) % Sphere函数
o = sum(x.^2); % 函数最优值为0,x=0时取得
end
function o = F13(x) % Ackley函数
o = -20*exp(-0.2*sqrt(mean(x.^2))) - exp(mean(cos(2*pi*x))) + 20 + exp(1);
end
function o = F19(x) % Schwefel函数
o = 418.9829*length(x) - sum(x .* sin(sqrt(abs(x))));
end
3. 约束函数示例:
function o = F7(x)
o = sum(abs((x + 0.5)).^2);
g1 = ... % 约束1
g2 = ... % 约束2
o = o + 10000*(g1 + g2); % 惩罚项
end
四、如何使用本模块进行算法测试
1. 获取测试函数信息
[F_lb, F_ub, F_dim, F_fobj] = Get_Functions_details('F15');
2. 在优化算法中调用:假设你有一个算法函数 MyOptimizer,可以这样写:
[bestScore, bestSol] = MyOptimizer(F_fobj, F_dim, F_lb, F_ub, 100, 500);
3. 记录收敛曲线、可视化结果等
五、完整代码
function [lb,ub,dim,fobj] = Get_Functions_details(F)
% 此函数用于根据输入的函数编号F,返回对应的测试函数句柄fobj,
% 以及该函数的变量下界lb、上界ub和维度dim。
% 在群体智能优化算法中用于统一测试平台。
switch F
case 'F1' % Griewank函数
fobj = @F12;
lb = -600;
ub = 600;
dim = 30;
case 'F2' % Ackley函数
fobj = @F13;
lb = -32;
ub = 32;
dim = 30;
case 'F3' % Sphere函数
fobj = @F10;
lb = -100;
ub = 100;
dim = 30;
case 'F4' % Zakharov函数
fobj = @F14;
lb = -5;
ub = 10;
dim = 30;
case 'F5' % 带约束的函数
fobj = @F9;
lb = [0,0,0];
ub = 2.*[1,1,1];
dim = 3;
case 'F6' % 带约束的函数
fobj = @F7;
lb = -100;
ub = 100;
dim = 30;
case 'F7' % F2函数(abs+prod)
fobj = @F2;
lb = -10;
ub = 10;
dim = 30;
case 'F8' % 带约束的函数
fobj = @F8;
lb = [0,0,0];
ub = [1,1,1];
dim = 3;
case 'F9' % Branin函数
fobj = @F6;
lb = -5;
ub = 20;
dim = 2;
case 'F10' % Levy函数
fobj = @F15;
lb = -10;
ub = 10;
dim = 10;
case 'F11' % Rastrigin函数
fobj = @F11;
lb = -5.12;
ub = 5.12;
dim = 30;
case 'F12' % F4函数(最大绝对值)
fobj = @F4;
lb = -100;
ub = 100;
dim = 30;
case 'F13' % F1函数(Schwefel变种)
fobj = @F1;
lb = -50;
ub = 50;
dim = 10;
case 'F14' % F3函数(Shekel's Foxholes)
fobj = @F3;
lb = -65.536;
ub = 65.536;
dim = 2;
case 'F15' % Rosenbrock函数
fobj = @F5;
lb = -30;
ub = 30;
dim = 30;
case 'F16'
fobj = @F16;
lb = -100;
ub = 100;
dim = 2;
case 'F17'
fobj = @F17;
lb = -512;
ub = 512;
dim = 2;
case 'F18'
fobj = @F18;
lb = -5.12;
ub = 5.12;
dim = 2;
case 'F19'
fobj = @F19;
lb = -500;
ub = 500;
dim = 30;
case 'F20'
fobj = @F20;
lb = 0;
ub = pi;
dim = 10;
end
end
%% === 测试函数定义区域 ===
function o = F1(x) % F1: Schwefel-like 函数
o = sum(-x .* sin(sqrt(abs(x))));
end
function o = F2(x) % F2: 绝对值加乘积函数
o = sum(abs(x)) + prod(abs(x));
end
function o = F3(x) % F3: Shekel’s Foxholes
aS = [...
-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;...
-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];
for j = 1:25
bS(j) = sum((x' - aS(:,j)).^6);
end
o = (1/500 + sum(1./([1:25] + bS))).^(-1);
end
function o = F4(x) % F4: 取绝对值最大值
o = max(abs(x));
end
function o = F5(x) % F5: Rosenbrock函数
dim = size(x,2);
o = sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2 + (x(1:dim-1)-1).^2);
end
function o = F6(x) % F6: Branin函数
o = (x(2) - (x(1)^2)*5.1/(4*pi^2) + 5/pi*x(1) - 6)^2 + 10*(1 - 1/(8*pi))*cos(x(1)) + 10;
end
function o = F7(x) % F7: 带约束的罚函数
o = sum(abs((x + 0.5)).^2);
alpha = 10000;
g1 = (x(1) + x(2)^2 - x(3) > 0) * (x(1) + x(2)^2 - x(3))^2 * alpha;
g2 = (x(6)^3 + x(7)^2 + x(8)^3 > 0) * (x(6)^3 + x(7)^2 + x(8)^3)^2 * alpha;
o = o + g1 + g2;
end
function o = F8(x) % F8: 带约束的函数(不等式约束)
o1 = -(x(1)^2 - x(2)^2 + x(2)*x(3));
alpha = 10000;
c(1) = 2*x(1) + x(2) + 3*x(3) - 6;
c(2) = x(1)^2 + x(1)*x(2) + x(3)*x(2) - x(2) - 6;
ceq = 0;
o = o1 + alpha * sum((c > 0).*c.^2) + alpha * sum(ceq.^2);
end
function o = F9(x) % F9: 带等式约束的函数
o1 = -x(1) - 2*x(2) + 3*x(3);
alpha = 10000;
c(1) = -x(1) - x(2) + 3;
c(2) = -x(3) - x(2) + 3;
ceq(1) = x(1) + x(3) - 4;
o = o1 + alpha * sum((c > 0).*c.^2) + alpha * sum(ceq.^2);
end
function o = F10(x) % F10: Sphere函数
o = sum(x.^2);
end
function o = F11(x) % F11: Rastrigin函数
o = sum(x.^2 - 10*cos(2*pi*x) + 10);
end
function o = F12(x) % F12: Griewank函数
o = sum(x.^2)/4000 - prod(cos(x./sqrt(1:length(x)))) + 1;
end
function o = F13(x) % F13: Ackley函数
o = -20*exp(-0.2*sqrt(mean(x.^2))) - exp(mean(cos(2*pi*x))) + 20 + exp(1);
end
function o = F14(x) % F14: Zakharov函数
o = sum(x.^2) + (sum(0.5*(1:length(x)).*x))^2 + (sum(0.5*(1:length(x)).*x))^4;
end
function o = F15(x) % F15: Levy函数
w = 1 + (x - 1)/4;
o = sin(pi*w(1))^2 + sum((w(1:end-1)-1).^2 .* (1 + 10*sin(pi*w(1:end-1)+1).^2)) + ...
(w(end)-1)^2 * (1 + sin(2*pi*w(end))^2);
end
% F16 - Schaffer Function N.2
function o = F16(x)
o = 0.5 + (sin(x(1)^2 - x(2)^2)^2 - 0.5) / (1 + 0.001*(x(1)^2 + x(2)^2))^2;
end
% F17 - Eggholder Function
function o = F17(x)
o = -(x(2)+47)*sin(sqrt(abs(x(2)+x(1)/2+47))) - x(1)*sin(sqrt(abs(x(1)-(x(2)+47))));
end
% F18 - Drop-Wave Function
function o = F18(x)
r = sqrt(sum(x.^2));
o = -(1 + cos(12*r)) / (0.5*r^2 + 2);
end
% F19 - Schwefel Function
function o = F19(x)
o = 418.9829*length(x) - sum(x .* sin(sqrt(abs(x))));
end
% F20 - Michalewicz Function
function o = F20(x)
m = 10;
o = -sum(sin(x) .* (sin(((1:length(x)) .* x.^2) / pi)).^(2*m));
end
六、总结
本文整理了一套适用于群体智能优化算法的标准测试函数模块,支持 20 个经典函数的调用,涵盖了常见的单峰、多峰、约束、无约束函数,可用于算法开发、调试与对比实验。函数实现遵循标准格式,搭配 Get_Functions_details 接口,可便捷地集成进任何优化框架。
9947

被折叠的 条评论
为什么被折叠?



