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

微分进化(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 秒。

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

时间: 2024-11-10 01:10:30

Matlab微分进化算法及优化函数测试的相关文章

MATLAB工具箱及算法实例

核心函数: (1) function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 [输出参数] pop--生成的初始种群 [输入参数] num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precisionF_or_B],如precision--变量进行二进制编码时指定的

[Evolutionary Algorithm] 进化算法简介

进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编码,种群初始化,交叉变异算子,经营保留机制等基本操作.与传统的基于微积分的方法和穷举方法等优化算法(具体介绍见博客[Math] 常见的几种最优化方法中的其他数学优化方法)相比,进化计算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织.自适应.自学习的特性,能够不受问题性质的限制,有效地

什么是遗传/进化算法?

这是基於 进化论 而启发出来的一种很特别的 机器学习 技巧.  我最近渐渐明白到它可能是破解 strong AI 的关键.  Ben Goertzel 和我见面的谈话中也特别注重这一方向.  原来 Alan Turing 很早就看到 进化 和 machine learning 之间有明显关系,而现时机器学习的一个很有名的研究者 Leslie Valiant 也在新书 (English version) 中谈论这课题. 进化论 首先,要理解什么是进化论.  举例来说,假设某只动物的基因变异 令牠比

2. Genetic Algorithm(1) ——进化算法

本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法. 内容依然来自博主的听课记录和教授的PPT. Outline 简单基因算法 个体表示 变异 重组 1. 简单基因算法(Simple Genetic Algorithm) Holland's早期的基因算法被认为是“简单的基因算法”或是“权威的基因算法”.(simple genetic algorithm or canonical genetic algorithm) 1. 直接举例说明 问题描述:利用遗传算法求

差分进化算法 (Differential Evolution)

Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化的随机模型,通过反复迭代,使得那些适应环境的个体被保存了下来.但相比于进化算法,DE保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和一对一的竞争生存策略,降低了遗传操作的复杂性.同时,DE特有的记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,具有较强的全局收敛能力和鲁棒性,且不需要借助问题的特征信息,适于求解一些利用常规的数学规划方法所

1. Introduction ——进化算法

本系列博客开始介绍进化算法. 知识内容来源于本人在硕士阶段听的课程以及阅读的文献书籍.算是听课笔记或是读书笔记吧. 博主在国外读的书,可能就中英文混杂了. Outline 什么是进化算法 能够解决什么样的问题 进化算法的重要组成部分 八皇后问题(实例) 1. 什么是进化算法 遗传算法(GA)是模拟生物进化过程的计算模型,是自然遗传学与计算机科学相互结合的新的计算方法. <图片来源于,Frank Neumann, The University of Adelaide> 2. 能够解决什么样的问题

自动阈值法:Otsu法 用MATLAB实现Otsu算法:

%自动阈值法:Otsu法 用MATLAB实现Otsu算法: clc;clear;close; I=imread('e:\role0\003i.bmp'); subplot(1,2,1),imshow(I); title('原始图像') grid on; %显示网格线 axis on; %显示坐标系 level=graythresh(I); %确定灰度阈值 BW=im2bw(I,level); subplot(1,2,2),imshow(BW); title('Otsu 法阈值分割图像') gri

常见比较排序算法的耗时测试

一直知道插入排序在输入规模比较小时会有比较好的效率,但这个输入规模多少才算少却无从知晓,今天特意写了几个小程序分别测试了几种排序算法随输入规模增长的耗时情况. 测试环境 CPU 3.0GHz 双核  1G内存   centos虚拟机 g++ 4.9.1 预先构造100W个随机生成的整数数组,计算使用各种排序算法时的总耗时 插入排序  vs  冒泡排序 不出所料,插入排序基本在任何输入规模均优于冒泡排序. 插入排序  vs 快速排序 vs 归并排序 由下图可以看出,在输入规模小于100时,插入排序

差分进化算法优化集成参数

一.差分进化的思想 差分进化是在遗传算法的基础上发展而来的,与遗传算法相似,有变异.交叉.选择等操作,但是实现简单,收敛速度快.差分进化的过程是随机生成一个初始化群体,经过交叉.变异.选择三个操作,反复迭代,保留有用的个体,寻找最优解. 差分进化利用了贪婪的思想,在每一次的迭代中,保留最优解.通过当前种群个体跟经过交叉.变异后的个体以适应度值为标准,进行比较,保留最优的个体. (1)初始化 (2)变异 (3)交叉 (4)选择 其中,F是变异因子,用来控制两个随机个体差分向量的缩放程度.CR是交叉