Matlab微分进化算法及优化函数测试

326 篇文章 2 订阅
26 篇文章 0 订阅

微分进化(Difference Evolution,DE)算法是一种优化算法,据称其比GA(遗传算法)等更为优秀。

借鉴网上实现的DE算法,用Matlab实现了对若干函数优化问题的解法,代码如下:

function [] = de_test
clear all;
close all;
clc;


%解:X = [0, 0, ...]
%nVar = 30
%dims: [-30, 30]
    function fitness = sphere(vals)
        prod = vals .* vals;
        fitness = sum(prod, 2);
    end


%f(x) = 1/4000 * sum^n_1(x_i)^2 - prod^n_1 * cos(x_i/sqrt(i)) + 1
%f* = 0, x* = [0, 0, ...];
%nVar = 30
%dims: [-600, 600]
    function fitness = griewank(vals)
        [h w] = size(vals);
        p1 = vals.^2;
        p1 = 1/4000 .* sum(p1, 2);
        
        t = sqrt([1:w]);
        p2 = vals ./ repmat(t, h, 1);
        p2 = cos(p2);
        p2 = prod(p2, 2);
        fitness = p1 - p2 + 1;
    end


%解: X = [1, 1, 1, ...]
    function fitness = RosenBroek(vals)
        [k n] = size(vals);
        vals1 = vals(:, 1:n-1);
        vals2 = vals(:, 2:n);
        tmp = vals2 - vals1 .* vals1;
        tmp = 100 * tmp .* tmp;
        tmp1 = (vals1 - 1).^2;
        fitness = sum(tmp, 2) + sum(tmp1, 2);
    end


%许多局部最小值,最优解:X = [0, 0], 固定2个变量
    function fitness = Rastrigin (X)
        v = X.^2 - 10 .* cos(2 * pi .* X) + 10;
        fitness = sum(v, 2);
        %fitness = 20 + X(:, 1).^2 + X(:, 2).^2 - 10 .* (cos(2 * pi * X(:, 1)) + cos(2 * pi * X(:, 2)));
    end


%参数
popSize = 100; % 群规模
F = 0.5;                    % 突变因子
C = 0.9;                    % 交叉率
iterTimes = 300;% 迭代次数
Run = 4;        % 测试轮次
id = [1:popSize];


%结果
bestFit = 1e5;  %设取最小值
bestGene = [];


for r = 1:Run  %轮次
    Func = r;     % 测试适应度函数
    switch Func
        case 1
            Func = @sphere;
            Xmin = -100;
            Xmax = 100;
            nVar = 30;
        case 2
            Func = @griewank;
            Xmin = -600;
            Xmax = 600;
            nVar = 2;
        case 3
            nVar = 2;
            Func = @RosenBroek;
            Xmin = -100;
            Xmax = 100;
        case 4
            nVar = 2;
            Func = @Rastrigin
            Xmin = -5.12;
            Xmax = 5.12;
    end;
    Func
    tic;
    
    %1.初始化种群
    X = Xmin + rand(popSize, nVar) * Xmax;
    
    %2.每轮迭代
    for i = 1:iterTimes
        X0 = X;
        %             F = 2 * (1 - (i-1)/iterTimes);
        %个体突变得到V
        for j = 1:popSize
            ids = id;
            ids(j) = [];
            
            rids = randperm(popSize - 1, 3);
            rids = ids(rids);
            V = X(rids(1), :) + F * (X(rids(2), :) - X(rids(3), :));
            
            %对V(j, :)值域检查
            ids = find(V < Xmin);
            if length(ids) > 0
                V(ids) = Xmin;
            end;
            ids = find(V > Xmax);
            if length(ids) > 0
                V(ids) = Xmax;
            end;
            
            %对每个X和V的配对,进行交叉操作,结果存在U中
            jrand = floor(rand() * nVar + 1);  %必交叉项,保证至少一个交叉
            for n = 1:nVar
                R1 = rand();
                if (R1 < C || n == jrand)
                    U = V;    %保留子代基因
                else
                    U = X(j, :);    %保留父代基因
                end
            end
            
            %在子代和父代间做选择运算
            if Func(U) < Func(X(j, :))
                Tr = U;
            else
                Tr=X(j, :);
            end
            % 更新种群基因
            X(j,:) = Tr;
            %计算新的适应度
            fitness = Func(X(j,:));
            
            %记录全局最优解
            if fitness < bestFit
                bestFit = fitness;
                bestGene = X(j, :);
            end;
        end  %结束个体更新
    end
    bestGene
    bestFit
    toc
end 
end
运行结果如下:



Func = 


    @de_test/sphere




bestGene =


  Columns 1 through 15


   -7.5570  -11.9099    9.9957  -37.8403  -17.9445   -7.1438  -21.4304  -33.6260  -22.1812  -66.1438    0.9014  -39.6724   -0.3175  -56.4815   26.5422


  Columns 16 through 30


    6.5446  -31.9653   -9.3640  -37.1629  -23.7325    2.7271   -6.3413  -21.3204  -13.1450   28.7402  -28.8170  -22.6226   10.9031  -16.6128  -14.7637




bestFit =


   2.0583e+04  (从此结果看,算法效果不佳)


时间已过 2.285354 秒。


Func = 


    @de_test/griewank




bestGene =


   1.0e-08 *


    0.1702    0.1424




bestFit =


     0


时间已过 3.337347 秒。


Func = 


    @de_test/RosenBroek




bestGene =


   1.0e-08 *


    0.1702    0.1424




bestFit =


     0


时间已过 1.747765 秒。


Func = 


    @de_test/Rastrigin




Func = 


    @de_test/Rastrigin




bestGene =


   1.0e-08 *


    0.1702    0.1424




bestFit =


     0


时间已过 1.403871 秒。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微分进化算法是一种基于生物进化论的优化算法,它结合了全局搜索能力和多目标优化的需求。在多目标优化,每个目标都有不同的权重,而微分进化算法可以通过全局搜索来避免陷入局部最优解,从而保持解个体的多样性。因此,基于微分进化算法的多目标寻优策略已经被广泛应用于各个领域\[1\]。 在使用微分进化算法进行多目标优化时,首先需要对种群进行初始化。种群初始化的目的是为了生成一组初始的变量集合,以便后续的优化过程。在MATLAB,可以使用初始化函数来实现种群的初始化。该函数接受种群大小和变量个数作为输入,并返回初始化好的变量集合\[2\]。 在计算个体对应目标函数的值时,可以使用目标函数来评估每个个体的适应度。在MATLAB,可以使用目标函数来计算变量对应的目标函数值,并将目标函数值与变量合并成一个新的变量。这样可以方便后续的优化过程\[3\]。 综上所述,使用MATLAB进行微分进化算法的多目标优化,需要进行种群初始化和计算个体对应目标函数的值。通过这些步骤,可以得到一组多样性的解个体,以满足多目标优化的需求。 #### 引用[.reference_title] - *1* *2* *3* [微分进化算法基本原理与关键代码的实现(解决多目标优化)](https://blog.csdn.net/weixin_44563460/article/details/109374461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值