Matlab遗传算法性能测试

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

遗传算法,结合生物学遗传规则用于问题最优解求解,具有广泛的用途。

然而,由于其属于不确定性算法,故在搜索性能和最优解的稳定性上仍有待改善。

利用Matlab的遗传算法,编写代码如下:

function [ output_args ] = ga_test
clear;

%解: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, ...]
%nVar: 30
    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个变量
%nVar = 2
    function fitness = Rastrigin (X)
        v = X.^2 - 10 .* cos(2 * pi .* X) + 10;
        fitness = sum(v, 2);
    end

%参数
popSize = 50; 				% 群规模
Run = 4;                    % 测试轮次
option = gaoptimset('PopulationSize', popSize); %, 'UseParallel', true);

Ans = {};
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 = 30;
        case 3
            nVar = 30;
            Func = @RosenBroek
            Xmin = -100;
            Xmax = 100;
        case 4
            nVar = 2;
            Func = @Rastrigin
            Xmin = -5.12;
            Xmax = 5.12;
    end;
    tic;
    [Ans{r}.bestGene, Ans{r}.bestFit] = ga(Func, nVar, [], [], [], [], repmat(Xmin, nVar, 1), repmat(Xmax, nVar, 1), [], option);
    costt = toc
    Ans{r}.costtime = costt;
end %可运行30轮,查看结果
for r = 1:Run
    fprintf('fit=%f, costtime=%f(s) \n', Ans{r}.bestFit, Ans{r}.costtime);
    %Ans{r}.bestGene
end;
end
运行结果:

Func = 


    @ga_test/sphere


Optimization terminated: average change in the fitness value less than options.TolFun.


costt =


    4.2468




Func = 


    @ga_test/griewank


Optimization terminated: average change in the fitness value less than options.TolFun.


costt =


    4.2952




Func = 


    @ga_test/RosenBroek


Optimization terminated: maximum number of generations exceeded.


costt =


   14.4236




Func = 


    @ga_test/Rastrigin


Optimization terminated: average change in the fitness value less than options.TolFun.


costt =


    0.2880


fit=0.000100, costtime=4.246814(s) 
fit=0.000150, costtime=4.295222(s) 
fit=1.511176, costtime=14.423554(s) 
fit=0.000000, costtime=0.288025(s) 


从运行时间来看,算法的性能不好。

故类似遗传算法、微分进化等方法,仍有待提出新的机制和算法以解决此类问题。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值