分布估计算法(Estimation of distribution algorithm,EDA)

news2024/9/24 4:29:49

概论

分布估计算法(Estimation of distribution algorithm,EDA)是一种新兴的基于统计学原理的随机优化算法。

为什么要叫这个名字呢?

首先,“分布”指的就是概率分布。

其次,“估计”指的是这个概率分布是我们根据数据以及算法的迭代过程中估算出来的,是一个近似,并不是真实的分布。

但是大数定律告诉我们,样本足够大的情况下,样本出现频率会无限接近于真实概率。因此,这种估计的方法是具有一定的理论依据的。


EDA v.s. GA

其实这两个算法整体思路非常相似。

不同的是,GA通过交叉、变异产生新解,EDA则通过估计截至目前,群体中最优解的概率分布(即较优个体主要都分布在哪一区间),这样做的好处是,可以使得搜索具有一定的方向性。

两种算法的流程图如下:

在这里插入图片描述

图1:遗传算法的流程图
 

在这里插入图片描述

图2:分布估计算法的流程图
 

算法原理

概率模型是EDA的核心, EDA通过概率模型及其更新来描述解空间分布以及种群整体进化趋势. 按概率模型的结构及变量间的相互关系, 可分为变量无关、双变量相关和多变量相关 EDA。1

上面已经提到,分布估计算法与遗传算法非常相似,关于选择过程可以参考这篇文章:遗传算法(附简单案例及matlab详细代码),因此不再介绍其相同的流程,只介绍不同点。

EDA算法是一个大类的算法,根据采用不同的概率模型,还有很多细分。相比于遗传算法,EDA最大的特点就是种群产生的方式,通过概率分布来产生。因此,了解其中的概率模型的细节很重要。

Univariate marginal distribution algorithm (UMDA)

UMDA是一种简单的EDA,它通过估计所选择个体的边界概率,来建立模型。

从当前群体中选择 λ \lambda λ 个个体组成繁殖群体 S ( t ) S(t) S(t)

依据 S ( t ) S(t) S(t) 建立模型如下:

p t + 1 ( x i ) = 1 λ ∑ x ∈ S ( t ) x i , i = 1 , 2 , . . . , n p_{t+1}(x_i)=\frac{1}{\lambda}\sum_{x\in S(t)}x_i,i=1,2,...,n pt+1(xi)=λ1xS(t)xi,i=1,2,...,n


Population-based incremental learning (PBIL)

PBIL算法是UMDA的一种改进,它通过增量的方式来建立概率模型。

同样,从当前群体中选择 λ \lambda λ 个个体组成繁殖群体 S ( t ) S(t) S(t)

依据 S ( t ) S(t) S(t) 建立模型如下:

p t + 1 ( x i ) = ( 1 − γ ) ⋅ p t ( x i ) + γ ⋅ 1 λ ∑ x ∈ S ( t ) x i p_{t+1}(x_i)=(1-\gamma)\cdot p_t(x_i)+\gamma\cdot \frac{1}{\lambda}\sum_{x\in S(t)}x_i pt+1(xi)=(1γ)pt(xi)+γλ1xS(t)xi

其中, γ ∈ ( 0 , 1 ] \gamma \in (0,1] γ(0,1]是学习因子(learning rate)。


基于高斯模型的EDA:算法流程

  1. 随机生成初始种群 P ( 0 ) P(0) P(0),初始化高斯模型的均值 μ \mu μ和方差 δ \delta δ。假设每维变量的高斯模型为: { N ( μ 1 , δ 1 ) , . . . , N ( μ n , δ n ) } \{N(\mu_1,\delta_1),...,N(\mu_n,\delta_n)\} {N(μ1,δ1),...,N(μn,δn)},n为自变量的维数;
  2. 抽样:根据各位自变量对应的高斯模型,抽样产生新种群 T ( t ) T(t) T(t)
  3. 选择:从新种群种选择优秀个体集合 S ( t ) S(t) S(t)
  4. 建模:计算 S ( t ) S(t) S(t)在各个变量上的均值与方差,对原有模型进行更新。
  5. 算法未达到结束条件,返回2,否则,退出。

均值更新模型如下:

μ j t + 1 = ( 1 − α ) ⋅ μ j t + α ⋅ ( x j b e s t , 1 + x j b e s t , 2 − x j w o r s t ) \mu_j^{t+1}=(1-\alpha)\cdot \mu_j^t+\alpha\cdot(x_{j}^{best,1}+x_{j}^{best,2}-x_{j}^{worst}) μjt+1=(1α)μjt+α(xjbest,1+xjbest,2xjworst)

方差更新模型如下:

δ j t + 1 = ( 1 − α ) ⋅ δ j t + α ⋅ ∑ k = 1 K ( x j k − x ˉ j ) K \delta_j^{t+1}=(1-\alpha)\cdot \delta_j^t+\alpha\cdot \sqrt{\frac{\sum_{k=1}^K(x_j^k-\bar{x}_j)}{K}} δjt+1=(1α)δjt+αKk=1K(xjkxˉj)

其中, α ∈ [ 0 , 1 ] \alpha\in [0,1] α[0,1]是学习因子,K为所选择的优秀个体数目, x ˉ \bar{x} xˉ是所选择的优秀个体的平均值, x b e s t , 1 , x b e s t , 1 x^{best,1},x^{best,1} xbest,1,xbest,1是当前群体种最好的两个个体, x w o r s t x^{worst} xworst是当前群体中的最差个体;

更新方式多种多样,也可以直接用优秀个体的均值和防擦好来替代原来的均值和方差。


Matlab 仿真实例

问题

求解下列函数的最大值:

y = x 1 ⋅ c o s ( 2 π x 2 ) + x 2 ⋅ c o s ( 2 π x 1 ) y=x_1\cdot cos(2\pi x_2)+x_2\cdot cos(2\pi x_1) y=x1cos(2πx2)+x2cos(2πx1)


分析

该问题可以采用PBIL算法进行实现,因为是求最大值,所以就选取目标函数作为适应度函数。


代码实现

代码参考博客2,我已经逐行注释,感兴趣的可以阅读一下代码细节,供参考学习使用。

% 问题 -2<x1, x2<2 y=x1 * cos(2*pi*x2) + x2 * cos(2*pi*x1)
%%%%%%%%%%%%PBIL algorithm
clc
clear
clf
tic         %开始计时
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参数设置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Pop_Size=40;                                            % 种群中个体数量
Variable_Num=2;                                         % 每个个体中种群的变量数
Individual_Len=20;                                      % 每个变量的长度(相当于一个二进制数)
Iteration_Times=1000;                                   % 进化次数
I=1;                                                    % 表示第几次进化过程
Learning_Rate=0.01;                                     % 学习速率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%产生初始种群%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Binary_X=zeros(Pop_Size,Variable_Num,Individual_Len);   % 生成值为0的种群矩阵Binary_X
for i=1:1:Pop_Size                                      % Pop_Size=40
    for j=1:1:Variable_Num                              % Variable_Num=2
        for k=1:1:Individual_Len                        % Individual_Len=20
            Binary_X(i,j,k)=round(rand());              % round函数用于四舍五入随机产生的值 rand()
        end                                             % 函数随机产生 0到1 之间的小数 round函数将小数四舍五入为0或1
    end
end
% zeros是MATLAB内的一个函数。
% 其功能是返回一个m×n×p×...的double类零矩阵。注意:m, n, p,...必须是非负整数
% 负整数将被当做0看待。
% 二维用法:zeros(m,n)或zeros(n)
% 功能:zeros(m,n)产生m×n的double类零矩阵,zeros(n)产生n×n的全0方阵。
Best_Individual=zeros(1,Iteration_Times);                               % 初始化值为0的优势种群矩阵,用于记录每次进化最好情况
Probability_Vector=zeros(Iteration_Times,Variable_Num,Individual_Len);  % 初始化概率向量矩阵
traces=zeros(3,Iteration_Times);                                        % 追踪每一代的最优值,trace为最优值矩阵,用来记录每一代的最优值
%%%%%%%%%%%%%%%%%%%%%%%%%%开始进行迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while I<=Iteration_Times    
%%%%%%%%%%%%%%%%%%%%%%%将采样的值,由二进制转化到十进制%%%%%%%%%%%%%%%%%%%%%%
  Decimal_X=zeros(Pop_Size,Variable_Num);                               % 初始化十进制矩阵
    for i=1:1:Pop_Size
        for j=1:1:Variable_Num  
            k=Individual_Len;                                           % Individual_Len=20
            t=1;
            while k>=1%将二进制矩阵转化为十进制矩阵,便于后面进行排序
               Decimal_X(i,j)=Decimal_X(i,j)+Binary_X(i,j,k)*2^(t-1);   % 将一位二进制转化为十进制
               k=k-1;                                                   % 向左切换到下一位,进行进制转换
               t=t+1; 
            end
        end
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%将十进制映射到解空间中%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Solution=zeros(Pop_Size,Variable_Num);                              % 初始化解空间矩阵(二维)
    for i=1:1:Pop_Size
        for j=1:1:Variable_Num
            Solution(i,j)= -2 + Decimal_X(i,j) * 4 / (2^Individual_Len-1);     % 存储每个个体对应变量的解
        end
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算适应值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Fitness_Value=zeros(1,Pop_Size);                                    % 初始化适应值矩阵(一维表针对每个个体)
    for i=1:1:Pop_Size                                                  % .*表示矩阵之间元素按位置相乘
        Fitness_Value(i)=Solution(i,1).*cos(2*pi*Solution(i,2))+Solution(i,2).*cos(2*pi*Solution(i,1));
    end                                                                 % 计算每个个体的适应值,相当于求f(x)的值,这里是求解函数的最大值
%%%%%%%%%%%%%%%%将适应值按照从小到大的顺序排序,并选出最优个体%%%%%%%%%%%%%%%
    [FitnessValue,index]=sort(Fitness_Value);                           % 排序适应值(升序),FinnessValue存储排序好的值,index存储对应值在原函数的索引
    Best_Individual(I)=Fitness_Value(index(Pop_Size));                  % 存储本次进化最优个体(升序)对应索引位置的值(最大的值)
    traces(1,I)=Solution(index(Pop_Size),1);                            % 存储每代最优个体各变量的值及最优值
    traces(2,I)=Solution(index(Pop_Size),2);
    traces(3,I)=Fitness_Value(index(Pop_Size));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%选出优势群体%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Superiority_Polution=zeros(Pop_Size/2,Variable_Num,Individual_Len); % 只从所有个体选择一半作为优势个体,初始化优势种群矩阵
    for i=1:1:Pop_Size/2                                                % Pop_Size/2决定优势种群个体数
        for j=1:1:Variable_Num
            for k=1:1:Individual_Len
                Superiority_Polution(i,j,k)=Binary_X(index(i+Pop_Size/2),j,k);
            end                                                         % 由于之前是升序排序,且是选择一半优势个体所以优势个体都是从中间开始向后才有的
        end                                                             % 索引在这里起到了很重要的作用,不能使用FitnessValue矩阵因为矩阵内是十进制数
    end                                                                 % 而索引在这里可以帮助寻找原矩阵中的二进制数
%%%%%%%%%%%%%%%%从优势群体中统计基因位的值,来更新概率向量%%%%%%%%%%%%%%%%%%%
    Ones_Number=zeros(Variable_Num,Individual_Len);
    for i=1:1:Pop_Size/2
        for j=1:1:Variable_Num
            for k=1:1:Individual_Len
                if Superiority_Polution(i,j,k)==1                       % 如果优势种群中某个体中某变量中二进制串某一位为1
                    Ones_Number(j,k)=Ones_Number(j,k)+1;                % 让对应变量对应位在下次产生1的概率增加1
                end
            end
        end
    end
    for j=1:1:Variable_Num
        for k=1:1:Individual_Len
            Probability_Vector(I,j,k)=Ones_Number(j,k)/(Pop_Size/2);    % 更新每一变量每一位可能出现1概率向量采用百分比形式
        end                 
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%更新概率向量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       
if I>1                                                                  % 如果这不是第一次进化,进行增量学习
       for j=1:1:Variable_Num
           for k=1:1:Individual_Len
               % 这里结合了最优个体(此处只选择了一个,当然也可以选择多个)和上一代的概率得到这一带的概率
               Probability_Vector(I,j,k)=Learning_Rate.*Binary_X(index(Pop_Size),j,k)+(1-Learning_Rate).*Probability_Vector(I-1,j,k);
           end
       end
end
%%%%%%%%%%%%%%%%%%%%%%%%根据概率向量对解空间采样%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:1:Pop_Size                          % 这里针对上面得到的最新概率,重新产生新的种群
        for j=1:1:Variable_Num
            for k=1:1:Individual_Len
                r=rand();                       % 随机生成数0到1之间的小数r
                if r<Probability_Vector(I,j,k)  % 如果r小于概率向量的值,对应为1
                    Binary_X(i,j,k)=1;          % 种群矩阵为1
                else    
                    Binary_X(i,j,k)=0;          % 否种群矩阵为0
                end
            end
        end
    end                 % 执行如上操作就得到了下一代群体
   I=I+1;               % 进化次数+1
end                     % 迭代终止
toc                     % 计时终止,显示程序运行所用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成种群演化图%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
figure(1)                       % 生成画图窗口
hold on
%hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存
%hold off使当前轴及图像不再具备被刷新的性质,新图出现时,取消原图。即关闭图形保持功能。
xlabel('进化代数')              % X轴名称为进化代数
ylabel('最优解的变化')          % Y轴名称为最优解的变化
title('进化过程')               % 图像名为进化过程
plot(Best_Individual);          % 根据每代种群中最优个体绘制函数图像
grid on                         % grid on为显示函数网格线  grid off 为隐藏函数网格线
[Best_Polution,xuhao_Iteration]=max(Best_Individual);   % 获取最优个体
bestx1=traces(1,xuhao_Iteration);                       % 获取最优个体参数1
bestx2=traces(2,xuhao_Iteration);                       % 获取最优个体参数2
bestz=traces(3,xuhao_Iteration);                        % 获取最优个体值
% 打印结果
fprintf(['最优解:\nx1=',num2str(bestx1),'\nx2=',num2str(bestx2),'\nf=',num2str(bestz),'\niteration=',num2str(xuhao_Iteration),'\n']);
hold off
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  1. 百度百科——分布估计算法 ↩︎

  2. https://blog.csdn.net/basketball616/article/details/102715280 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年【河北省安全员B证】新版试题及河北省安全员B证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 河北省安全员B证新版试题根据新河北省安全员B证考试大纲要求&#xff0c;安全生产模拟考试一点通将河北省安全员B证模拟考试试题进行汇编&#xff0c;组成一套河北省安全员B证全真模拟考试试题&#xff0c;学员可通过…

C++STL----list的模拟实现

文章目录 list模拟实现的大致框架节点类的模拟实现迭代器类的模拟实现迭代器类存在的意义迭代器类的模板参数说明运算符的重载--运算符的重载&#xff01;与运算符的重载*运算符的重载->运算符的重载 list的模拟实现默认成员函数迭代器相关函数元素修改相关函数front和backi…

“KeyarchOS:国产Linux新星的崛起与创新之路“

简介 KOS&#xff0c;也就是KeyarchOS&#xff0c;是一款由国内团队开发的服务器操作系统。它因为几个特点而受到我的青睐和一些用户的关注。 首先&#xff0c;KOS注重安全性和稳定性。它有一些防护和隔离功能&#xff0c;来帮助系统稳定运行&#xff0c;而且是中文语言更接地…

从零开始的LINUX(三)

bc&#xff1a;进行浮点数运算 uname&#xff1a;查看当前的操作系统 ctrlc&#xff1a;中止当前正在执行的程序 ctrld&#xff1a;退出xshell shutdown&#xff1a;关机 reboot&#xff1a;重启 shell外壳&#xff1a; 作用&#xff1a;1、命令解释&#xff08;将输入的程序…

QSS 自定义QLineEdit

QSS 自定义QLineEdit Chapter1 QSS 自定义QLineEdit简述常用属性和伪状态效果图QSS源码参考 Chapter1 QSS 自定义QLineEdit 原文链接&#xff1a;https://blog.csdn.net/Staranywhere/article/details/107306276 简述 本文将通过简单示例介绍QLineEdit样式如何自定义。 常用…

Linux高性能服务器编程——ch9笔记

第9章 I/O复用 同时监听多个文件描述符&#xff0c;但本身是阻塞的。 9.1 select系统调用 在一段指定时间内&#xff0c;监听用户感兴趣的文件描述符上的可读、可写和异常等事件是否就绪。 :::tips int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* except…

掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)

JavaScript基础知识 1. JavaScript对象1.1.1 基本对象1.1.1.1 Array对象语法格式特点属性和方法 1.1.1.2 String对象语法格式属性和方法 1.1.1.3 JSON对象自定义对象json对象 1. JavaScript对象 可以大体分页3大类&#xff1a; 第一类&#xff1a;基本对象,我们主要学习Array…

Python---小海龟会画画---利用turtle(海龟)模块

1、小海龟模块 在Python3版本中&#xff0c;新增加了一个模块叫做turtle&#xff08;海龟&#xff09;&#xff0c;专门用于绘制图形图像 2、模块如何使用 ① 导入模块 import turtle② 使用turtle模块中已经定义好的方法 turtle.forward(数值) # 从左向右&#xff0c;绘制一…

docker 部署 若依 Ruoyi springboot+vue分离版 dockerCompose

本篇从已有虚拟机/服务器 安装好dokcer为基础开始讲解 1.部署mysql 创建conf data init三个文件夹 conf目录存放在mysql配置文件 init目录存放着若依数据库sql文件&#xff08;从navicat导出的并非若依框架自带sql&#xff09; 创建一个属于本次若依部署的网段&#xff08;只…

python:使用Scikit-image对遥感影像进行梯度特征提取(gradient)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-Image来进行梯度特征提取(gradient),并且提供一个示例代码,演示了如何在单波段遥感图像上应用这些方法。 梯度特征是指用于表示图像中亮度或颜色变化的特征。它包括两个关键成分:梯度幅值和梯度方向。梯度幅…

吴恩达《机器学习》1-3:监督学习

一、监督学习 例如房屋价格的数据集。在监督学习中&#xff0c;我们将已知的房价作为"正确答案"&#xff0c;并将这些价格与房屋的特征数据一起提供给学习算法。学习算法使用这些已知答案的数据来学习模式和关系&#xff0c;以便在未知情况下预测其他房屋的价格。这就…

底层驱动day8作业

代码&#xff1a; //驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/timer.h>struct device_node *dnode; //unsigned int gpiono; …

内存管理:TLSF算法

动态内存分配DSA DSA&#xff1a;Dynamic Storage Allocation&#xff0c;用于动态管理程序运行时所需的内存。动态内存分配涉及在程序运行时根据需要分配和释放内存&#xff0c;以存储数据结构和数据。 内存管理方式&#xff1a;动态内存分配与静态内存分配相对应&#xff0…

json格式存储b64编码的rgb raw数据

1.rgb raw数据准备 利用python将jpg里面的rgb raw数据提取出来。 import cv2# 读取 JPG 图像 image_path 1.jpg image cv2.imread(image_path)#imread读出来的顺序是BGR print("image shape:",image.shape)# 将图像由BGR转换为 RGB 数据 rgb_data cv2.cvtColor(im…

什么是水坑攻击

水坑攻击 1. 水坑攻击的概念1. 水坑攻击的原理2. 水坑攻击的常用手段3. 典型水坑攻击事件 1. 水坑攻击的概念 水坑攻击&#xff08;Watering Hole Attack&#xff09;是一种网络攻击方法&#xff0c;其名称来源于自然界的捕食方式。 攻击者会通过前期的调查或各种社会工程手段…

2023年【河北省安全员B证】免费试题及河北省安全员B证作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 河北省安全员B证免费试题考前必练&#xff01;安全生产模拟考试一点通每个月更新河北省安全员B证作业考试题库题目及答案&#xff01;多做几遍&#xff0c;其实通过河北省安全员B证在线考试很简单。 1、【多选题】一般…

计算机中了faust勒索病毒怎么办,faust勒索病毒解密,数据恢复

近年来网络技术得到了飞速发展&#xff0c;为人们的企业生产生活提供了极大便利&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心收到了很多企业的求助&#xff0c;企业的计算机服务器遭到了faust勒索病毒攻击&#xff0c;导致企业…

【java学习—九】内部类(7)

文章目录 1. 概念2. 内部类特性3. 内部类实现多重继承的应用 1. 概念 &#xff08;1&#xff09;在 Java 中&#xff0c;允许一个类的定义位于另一个类的内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类。     &#xff08;2&#xff09;Inner class 一般用在定…

亚马逊哪个站点好做?亚马逊全球站点介绍!

前言 亚马逊全球有18个站点&#xff0c;其中七大站点分别为&#xff1a;北美站、欧洲站、日本站、澳洲站、印度站、中东站、新加坡站。按照国家和地区分为中国、美国、加拿大、墨西哥、英国、德国、法国、西班牙、意大利、澳大利亚、日本、印度、土耳其、中东和巴西。不同的站…