分布估计算法(Estimation of Distribution Algorithm,EDA)介绍及MATLAB代码(求解背包问题KP)

EDA算法

EDA算法原理

      通过一个概率模型描述候选解在空间得分布,采用统计学习手段从群体宏观的角度建立一个描述解分布得概率模型,然后对概率模型随机采样产生新的种群,如此反复进行,实现种群得进化,直到终止条件。(—建模-采用-建模-采样----循环)

EDA的不同变体

      EDA有很多不同的变体,包括如下一些,想详细了解可以参照参考文献。
      变量无关:PBIL、UMDA、cGA算法
      双变量相关:MIMIC、BMDA算法
      多变量相关:ECGA、FDA、BOA算法

EDA算法流程

通用算法步骤为:
      Step1 随机生成M个个体作为初始种群 ;
      Step2 对第L代种群计算个体适应度,判断是否满足终止条件,若满足,终止循环;若不满足,继续进行。
      Step3 根据适应度数值从种群中选出前N个(N≤M)优势个体,组成第L+1代的优势子种群 ;
      Step4 根据优势子种群更新概率模型 ;
      Step5 对概率模型进行随机采样,生成新种群(规模M),返回Step2.

具体介绍两个变体UMDA(Univariate marginal distribution algorithm)和PBIL(Population based incremental learning),主要区别在于更新概率模型的公式不同

EDA算法变体UMDA

      由德国学者Muhlenbein在1996年提出,算法描述:
      Step1 随机产生M个个体作为初始种群;
      Step2 然后计算M个个体的适应值,如果符合终止条件,算法结束,否则继续进行;
      Step3 选择最优的N个个体用来更新概率向量p(x), N <= M
更新过程:
p_l (x)=p(x│D_l^S )=1/N ∑_(k=1)N▒x_lk
      Step4 由新的概率模型采样M次,得到新一代群体,返回Step2

EDA算法变体PBIL

     由美国卡耐基梅隆大学的Baluja在1994年提出,算法描述:
     Step1 随机产生M个个体作为初始种群;
     Step2 然后计算M个个体的适应值,如果符合终止条件,算法结束,否则继续进行;
     Step3 选择最优的N个个体用来更新概率向量p(x), N <= M
更新过程:
在这里插入图片描述
     Step4 由新的概率模型采样M次,得到新一代群体,返回Step2

测试算例:KP

     本测试算例为背包问题,来源自https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html
算例如下表:
在这里插入图片描述

MATLAB代码

UMDA代码

function [bestFit]=binaryUMDA(weightMax,weight_Individual,value_Individual)
%EDA_UMDA Algorithm,二进制编程
%参数
iterations = 500;%迭代最大次数
populationSize = 200;%种群规模
dimensionality = size(weight_Individual,2);%维度
dominantNum = 20;%优势群体个数
% weightMax             背包最大容量/重量
% weight_Individual     每个变量的体积/重量
% value_Individual      每个变量的价值
  
%初始化种群
probability = 0.5*ones(1,dimensionality);%初始化概率0.5
Best_Individual=zeros(iterations,dimensionality+1);%每次迭代中的最优解,(:,1)存储适应度值

%循环迭代
for I=1:iterations
    %按照概率模型创建样本
    flag = 0;i=1;
    while i<=populationSize
        r=rand(1,dimensionality);
        Species(i,:)=1.*(r<probability);
        %判断是否超出容量范围
        weightSum = sum(Species(i,:).*weight_Individual,2);
        if flag>=20
            Species(i,:) = zeros(1,dimensionality);%多次仍未符合要求,舍弃
            flag = 0;
        elseif weightSum>weightMax
            i=i-1;flag=flag+1;
        else
            flag = 0;
        end
        i=i+1;
    end
    %计算适应度
    Fitness_Value=zeros(populationSize,1);%创建适应度计算
    for i=1:populationSize
         Fitness_Value(i,1)=sum(Species(i,:).*value_Individual,2);
    end
    %排序
    [Fitness,index] = sort(Fitness_Value);%=》大排序
    %每次迭代中的最优解
    Best_Individual(I,1) = I;
    Best_Individual(I,2) = Fitness_Value(index(populationSize));
    for i=3:dimensionality+2
        Best_Individual(I,i) = Species(index(populationSize),i-2);
    end
    %选取优势种群
    dominantSpecies=zeros(dominantNum,dimensionality);%创建选取的优势群体<populationSize,(:,1)存储适应度值
    for i=1:dominantNum
        dominantSpecies(i,:) = Species(index(populationSize-dominantNum+i),:);
    end
    %更新概率模型 划重点
    Ones_Number = sum(dominantSpecies);
    probability = Ones_Number/dominantNum;
end

%画图函数
bestFit =Best_Individual(iterations,[2:dimensionality+2]);
% 输出,画出fitness-iterations
plot(Best_Individual(:,1),Best_Individual(:,2));
disp(strcat('最优结果',':',num2str(Best_Individual(iterations,2))));

PBIL代码

function [bestFit]=binaryPBIL(weightMax,weight_Individual,value_Individual)
%EDA_PBIL Algorithm,二进制编程
%参数
iterations = 500;%迭代最大次数
populationSize = 200;%种群规模
dimensionality = size(weight_Individual,2);%维度
learningRate =0.3;% ((0.001*(dimensionality)^2)>1)*1+((0.001*(dimensionality)^2)<=1)*(0.001*(dimensionality)^2);
%学习效率太小会不收敛
dominantNum = 20;%优势群体个数
% weightMax             背包最大容量/重量
% weight_Individual     每个变量的体积/重量
% value_Individual      每个变量的价值
  
%初始化种群
probability = 0.5*ones(1,dimensionality);%初始化概率0.5
Best_Individual=zeros(iterations,dimensionality+1);%每次迭代中的最优解,(:,1)存储适应度值

%循环迭代
for I=1:iterations
    %按照概率模型创建样本
    flag = 0;i=1;
    while i<=populationSize
        r=rand(1,dimensionality);
        Species(i,:)=1.*(r<probability);
        %判断是否超出容量范围
        weightSum = sum(Species(i,:).*weight_Individual,2);
        if flag>=20
            Species(i,:) = zeros(1,dimensionality);%多次仍未符合要求,舍弃
            flag = 0;
        elseif weightSum>weightMax
            i=i-1;flag=flag+1;
        else
            flag = 0;
        end
        i=i+1;
    end
    %计算适应度
    Fitness_Value=zeros(populationSize,1);%创建适应度计算
    for i=1:populationSize
         Fitness_Value(i,1)=sum(Species(i,:).*value_Individual,2);
    end
    %排序
    [Fitness,index] = sort(Fitness_Value);%=》大
    %每次迭代中的最优解
    Best_Individual(I,1) = I;
    Best_Individual(I,2) = Fitness_Value(index(populationSize));
    for i=3:dimensionality+2
        Best_Individual(I,i) = Species(index(populationSize),i-2);
    end
    %选取优势种群
    dominantSpecies=zeros(dominantNum,dimensionality);%创建选取的优势群体<populationSize,(:,1)存储适应度值
    for i=1:dominantNum
        dominantSpecies(i,:) = Species(index(populationSize-dominantNum+i),:);
    end
    %更新概率模型  划重点
    Ones_Number = sum(dominantSpecies);
    probability = (1-learningRate)*probability+learningRate*Ones_Number/dominantNum;    
end

%画图函数
bestFit =Best_Individual(iterations,[2:dimensionality+2]);
% 输出,画出fitness-iterations
% plot(Best_Individual(:,1),Best_Individual(:,2));
disp(strcat('最优结果',':',num2str(Best_Individual(iterations,2))));

实验结果展示

UMDA结果

运行结果在如下参数的前提下得出
种群规模:200
优势群体个数:20
种群计算迭代次数:500
备注:算法运行结果为求50次运算结果的平均值,误差=(理论最优解-算法运行结果)/理论最优解*100%

在这里插入图片描述

PBIL结果

运行结果在如下参数的前提下得出
学习效率:0.3
种群规模:200
优势群体个数:20
种群计算迭代次数:500
备注:算法运行结果为求50次运算结果的平均值,误差=(理论最优解-算法运行结果)/理论最优解*100%

在这里插入图片描述

参考文献

[1] 周树德, 孙增圻. 分布估计算法综述[J]. 自动化学报, 2007, 33(2).

### 分布计算法概述 分布计算法Estimation of Distribution Algorithm, EDA),是一种进化算法,它通过构建一个概率模型来描述整个群体的分布情况,并利用该模型指导后续代个体的选择与生成过程[^1]。 #### 原理说明 EDA的核心在于对种群中的优良特性进行捕捉并推广到下一代。具体来说,在每一代迭代过程中,首先会依据当前种群的状态建立相应的概率模型;接着按照此模型随机抽样得到新一代成员。随着演化轮次增加,所形成的概率模型能够越来越精确地反映优质解决方案的特点,从而引导搜索朝着更优的方向前进[^4]。 #### 实现方式 实现上,EDA涉及几个关键环节: - **建模阶段**:根据现有优秀样本构造合适的概率表示形式; - **采样操作**:基于已有的概率结构生成新个体集合; - 循环执行上述两步直至满足预设停止准则为止。 针对不同问题领域以及复杂度需求,可以设计多种类型的概率模型用于EDA框架下,比如单变量或多变量间的相互关系等都可以被纳入考量范围之内[^2]。 #### 应用场景举例 在实际应用方面,EDA已被广泛应用于解决各类优化难题之中,特别是那些具有高度非线性特征或者存在多个局部极值点的情况尤为适用。例如求解背包问题(KP),即如何挑选物品使得总价值最大而不超过给定容量限制这一经典组合最优化案例中就成功运用到了EDA技术。 此外,在处理多目标优化任务时也有着出色表现——通过对决策变量同性能指标间关联性的综合考虑建立起更为精细的概率表达模式,进而有效提升全局寻优效率与质量[^3]。 ```matlab % UMDA (Univariate Marginal Distribution Algorithm) Example Code Snippet for KP Problem function umda_kp() % Initialization code here... end ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值