您的位置:首页 > 编程语言 > MATLAB

多变异位自适应遗传算法(MMAdapGA)的算法原理、算法步骤和matlab实现

2016-08-27 00:06 537 查看

算法原理

自适应遗传算法是交叉概率和变异概率能够随使用度自动改变,以求得相对某个解的最佳交叉概率和变异概率。本算法是在自适应遗传算法中引进多变异位,以增加种群的多样性。

自适应遗传算法中的交叉概率和变异概率的计算公式为:

Pc=K1(fmax−f)fmax−favg,若f>=fvag

Pc=k2,若f<fvag

Pm=K3(fmax−f′)fmax−f′,若f′=fvag

Pm=k4,若f′<fvag

fmax,群体中的最大适应值,favg,群体平均适应值,f,要交叉的两个个体中较大的适应值,f′要变异个体的适应值,k1,k2,k3和k4是常数

多变异位是指变异位的二进制表示的编码的多个位取反。

算法步骤

1、随机产生种群,

2、用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步

3、依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰

4、按照一定的交叉概率和交叉方法,生成新的个体

5、通过自适应方法产生变异概率,若最大适应率等于最小适应率,则只产生一个变异位,否则,随机产生变异位的个数和位置,对选中的个体进行变异

6、由交叉和变异产生新一代种群,返回步骤2

算法的matlab实现

% 解决一维无约束优化问题:多变异位自适应遗传算法
function [ xv,fv ] = MMAdapGA( fitness,a,b,NP,NG,Pc1,Pc2,Pm1,Pm2,eps )
% 待优化的目标函数:fitness
% 自变量下界:a
% 自变量上界:b
% 种群个体数:NP
% 最大进化代数:NG
% 杂交常数1:Pc1
% 杂交常数2:Pc2
% 变异常数1:Pm1
% 变异常数2:Pm2
% 自变量离散精度:eps
% 目标函数取最大值是的自变量值:xv
% 目标函数的最小值:fv

L=ceil(log2((b-a)/eps+1));  %码长
x=zeros(NP,L);
for i=1:NP
x(i,:)=Initial(L);
fx(i)=fitness(Dec(a,b,x(i,:),L));
end
for k=1:NG
sumfx=sun(fx);
Px=fx/sumfx;
PPx=0;
PPx(1)=Px(1);
for i=2:NP  %根据轮盘赌确定父亲
PPx(i)=PPx(i-1)+PPx(i);
end
for i=1:NP
sita=rand();
for n=1:NP
if sita <=PPx(n)
SelFather = n;
break;
end
end
Selmother=floor(rand()*(NP-1))+1;   %随机选择母亲
posCut=floor(rand()*(L-2))+1;   %随机确定交叉点
favg=sumfx/NP;
fmin=min(fx);
fmax=max(fx);
Fitness_f=fx(SelFather);
Fitness_m=fx(Selmother);
Fm=max(Fitness_f,Fitness_m);
if Fm>=favg
Pc=Pc1*(fmax-Fm)/(fmax-favg);
else
Pc=Pc2;
end
r1=rand();
if ra<=Pc
nx(i,1:posCut)=x(SelFather,1:posCut);
nx(I,(posCut+1):L)=x(Selmother,(posCut+1):L);
fmu=fitness(Dec(a,b,nx(i,:),L));
if r1<=Pc
Pm=Pm1*(fmax-fmu)/(fmax-favg);
else
Pm=Pm2;
end
r2=rand();
if r2<=Pm   %变异
if fmax~=fmin
numMut=round(L*(fmax-fmu)/(fmax-fmin)/3);
else
numMut=1;
end
intArr=1:L;
posMut=zeros(1,numMut);
for j=1:numMut
tmp=round(rand()*(L-j)+1);
posMut(j)=intArr(tmp);
intArr=[intArr(1:tmp-1)) intArr((tmp+1):(L-j+1))];
end
for j=1:numMut
nx(i,posMut(j))=~nx(i,posMut(j));
end
end
else
nx(i,:)=x(SelFather,:);
end
end
x=nx;
for i=1:NP
fx(i)=fitness(Dec(a,b,x(i,:),L);
end
end
fv=-inf;
for i=1:NP
fitx=fitness(Dec(a,b,x(i,:),L));
if fitx > fv
fv=fitx;
xv=Dec(a,b,x(i,:),L);
end
end
end

function result=Initial(length)     %初始化函数
for i=1:length
r=round();
result(i)=round(r);
end
end
function y=Dec(a,b,x,L)     %二进制转十进制
base=2.^((L-1):-1:0);
y=dot(base,x);
y=a+y*(b-1)/(2^L-1)'
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: