分布估计法+Matlab代码

算法原理

在遗传算法的基础上的改进

Matlab代码

clear;
N = 4; %种群规模
M= 2; %变量个数
V0 = [-8,3;-2,9;0,-5;6,1]; %初始种群
K = 2;
alpha = 0.3;

%%
[mu,sigma] = canShu(V0); %求均值方差
mark = [];

for i = 1:50
    p = f(V0); %求适应值
    [mu,sigma] = update(V0,p,K,alpha,mu,sigma);
    V0 = sig2Mat(mu,sigma,N,M);
    mark = [mark,max(p)];
end
plot(mark);

%%
function [mu,sigma] = canShu(V)
mu = mean(V);
sigma = std(V,1); %按照N的个数求标准差
end

function y = f(x) %计算适应值,x为矩阵
y = x(:,1).^2-2*x(:,2)+5;
end

function [mu,sigma] = update(V,p,K,alpha,miu0,sigma0) %更新
[~,i] = sort(p,'descend');
mu = (1-alpha).*miu0+alpha.*(sum(V(i(1:K),:))-V(i(end),:));
sigma = (1-alpha)*sigma0+alpha*std(V(i(1:K),:),1);
end

function [V0] = sig2Mat(mu,sigma,N,M) %根据均值方差生成数据
sigMat = diag(sigma);
R = chol(sigMat);
V0 = repmat(mu,N,1) + randn(N,M)*R; %to-do,2?
id = sum(V0>=-10 & V0 <=10,2)==size(V0,2);
V0 = V0(id,:);
while size(V0,1) < N
    V1 = repmat(mu,N,1) + randn(N,M)*R;
    id = sum(V1>=-10 & V1 <=10,2)==size(V1,2);
    V0 = [V0;V1(id,:)];
end
V0 = V0(1:N,:);
end

猜你喜欢

转载自www.cnblogs.com/kexve/p/11766979.html