算法原理
遗传算法可以用来求函数的极值。
(1)用二进制编码来离散自变量,码长根据离散精度来确定。码长为
log2[(max−min)/精度+1]
(2)交叉方法采用单点交叉
(3)变异是根据变异概率反转子代某个位的值
(4)选择策略采用轮盘赌策略,令
PPi=∑ij=1pi,PP0=0
,其中
PPi
为累计概率,
pi
为个体的选择概率,公式为:
pi=fitness(xi)∑NPi=1fitness(xi)
,其中
fitnessxi
为个体的适应度,共轮转
NP
次,每次轮转时,产生随机数
r
,当PPi−1<=r<PPi时选择个体
i
<script type="math/tex" id="MathJax-Element-10">i</script>。
算法步骤
基本遗传算法的基本步骤是:
- 随机产生种群,
- 用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步
- 依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰
- 按照一定的交叉概率和交叉方法,生成新的个体
- 按照一定的变异概率和变异方法,生成新的个体
- 由交叉和变异产生新一代种群,返回步骤2
算法的实现
function [ xv,fv ] = mGA( fitness,a,b,NP,NG,Pc,Pm,eps )
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;
r1=rand();
if r1<=Pc
nx(i,1:posCut)=x(SelFather,1:posCut);
nx(I,(posCut+1):L)=x(Selmother,(posCut+1):L);
r2=rand();
if r2<=Pm
posMut=round(rand()*(L-1)+1);
nx(i,posMut)=~nx(i,posMut);
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=rand();
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)