群体智能优化算法-测试函数1(免费,代码可下载)

        为了验证群体智能优化算法的性能,研究者通常会在一组标准化的测试函数上进行实验。这些函数具有明确的数学性质,如多峰性、非线性、约束性等,能够全面衡量算法的搜索能力和收敛性能。本文整理了20个经典的优化测试函数,并提供了统一接口函数和对应目标函数定义,适用于算法开发与比较实验。

一、模块功能介绍

该模块主要由以下两部分构成:

  1. Get_Functions_details(F):根据输入的编号(如 'F1''F2'),返回该测试函数的:

    • 函数句柄 fobj
    • 搜索空间下界 lb
    • 上界 ub
    • 变量维度 dim
  2. 一组已定义的测试函数 F1 ~ F20,均封装为匿名函数格式,可直接用于优化算法调用。

使用方式简单,例如:

[lb, ub, dim, fobj] = Get_Functions_details('F11');  % 获取Rastrigin函数配置

二、常用测试函数列表与说明

编号函数名称特性维度搜索范围
F1Schwefel-like多峰函数30[-600, 600]
F2绝对值+乘积函数多峰,非凸30[-10, 10]
F3Shekel’s Foxholes多极值,二维2[-65.536, 65.536]
F4最大绝对值函数单峰函数30[-100, 100]
F5Rosenbrock非线性单谷函数30[-30, 30]
F6Branin多极值函数2[-5, 20]
F7有约束惩罚函数含惩罚项30[-100, 100]
F8不等式约束函数带不等式约束3[0, 1]
F9等式约束函数带等式约束3[0, 2]
F10Sphere简单凸函数30[-100, 100]
F11Rastrigin多峰函数30[-5.12, 5.12]
F12Griewank多峰,复杂形状30[-600, 600]
F13Ackley多极值,难收敛30[-32, 32]
F14Zakharov单峰30[-5, 10]
F15Levy多极值函数10[-10, 10]
F16Schaffer N.2非常尖锐的函数2[-100, 100]
F17Eggholder非常复杂多峰2[-512, 512]
F18Drop-Wave多峰,波动型2[-5.12, 5.12]
F19Schwefel多峰,全局最优远离原点30[-500, 500]
F20Michalewicz非常复杂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 接口,可便捷地集成进任何优化框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值