算法原理
在遗传算法的基础上的改进
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