介绍
模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法。它借用生物遗传学的观点,通过自然选择,遗传变异等作用机制,实现各个个体适应性的提高。
优点
由于遗传算法的整体搜索策略和优化搜索方法在计算时不依赖于梯度信息或其它辅助知识,而只需要影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架,所以应用领域比较广。
基本步骤
基本参数说明
种群规模
种群规模影响着优化算法最终的结果以及效率,和粒子群算法一样,种群规模小的时候,容易陷入局部最优,性能不会很好。种群规模大的时候,算法执行的时间会很长。需要在二者之间进行权衡,一般选择为10-200。
交叉概率
交叉频率控制交叉操作的频率,较大的交叉频率有利于开辟新的区域来寻找最优值,但如果交叉过度对性能破坏也是很大的。交叉频率小搜索的性能会很低。一般取值在0.25-1.00之间。
变异概率
变异概率的主要目的是保持·群体的多样性。变异频率过高可能会导致重要的基因丢失,我们一般将概率取小一点,定在0.01-0.1 之间。
迭代次数
只是表征算法结束的一个参数,当达到一定迭代次数的时候就停止运行。一般设置为100-1000.当达到1000仍不收敛的话可以适当提升迭代次数。
选择算子
根据个体的适应度,按照一定的规则或者方法,从一代群体中选出优良的个体中遗传到下一代群体中。
选择的规则广泛采用的是轮盘赌法,它是一种基于比例的选择,利用各个个体适应度所占比例的大小来决定其子孙保留的可能性。若某一个个体的适用度为fi,种群大小为NP,则它被选取的概率为
P
i
=
f
i
/
∑
i
=
1
N
P
f
i
(
i
=
1
,
2
,
⋯
,
N
P
)
P_{i} = f_{i}/\sum_{i=1}^{NP}f_{i} (i=1,2,\cdots ,NP)
Pi=fi/i=1∑NPfi(i=1,2,⋯,NP)
由公式可知,个体的适应度越高,被选取的概率就会越高。
function ret=Select(individuals,fitness,sizepop)
fitness= 1./(fitness);
sumfitness=sum(fitness);
sumf=fitness./sumfitness;
index=[];
for i=1:sizepop %转sizepop次轮盘
pick=rand;
while pick==0
pick=rand;
end
for j=1:sizepop
pick=pick-sumf(j);
if pick<0
index=[index j];
break;
end
end
end
individuals=individuals(index,:);
fitness=fitness(index);
ret=individuals;
变异算子
对于群体中的每一个个体,都会以一定得概率将其中的某一个或者某些基因,改变为其他的等位基因。
- 根据变异概率决定是否进行变异。
- 根据要进行变异的个体随机选择变异位置进行变异。
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound)
for i=1:sizepop
% 随机选择一个染色体进行变异
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 变异概率决定该轮循环是否进行变异
pick=rand;
if pick>pmutation
continue;
end
flag=0;
while flag==0
% 变异位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
v=chrom(i,pos);
v1=v-bound(pos,1);
v2=bound(pos,2)-v;
pick=rand; %变异开始
if pick>0.5
delta=v2*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v+delta;
else
delta=v1*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v-delta;
end %变异结束
flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性
end
end
ret=chrom;
交叉算子
将群体P中的各个个体随机搭配,对于每一个个体,以一定概率交换它们之间的部分染色体。
- 从群体中随机选择一对要进行交叉的个体,在染色体上随机选取一个或者多个位置,作为交叉位置。
- 根据交叉概率实施交叉操作,相互交换各自的基因,形成新的个体。
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
for i=1:sizepop
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率决定是否进行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
flag=0;
while flag==0
% 随机选择交叉位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom));
pick=rand; %交叉开始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果两个染色体不是都可行,则重新交叉
end
end
ret=chrom;
应用于函数最优值计算
这里以Griewank函数为例,使用遗传算法来进行函数最优值求解。
clc % 清屏
clear all; % 删除workplace变量
close all; % 关掉显示图形窗口
warning off
%% 参数初始化
popsize=100; %种群规模
lenchrom=3; %变量字串长度
pc=0.7; %设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率
pm=0.3; %设置变异概率,同理也可设置为变化的
maxgen=100; % 进化次数
%种群
popmax=50;
popmin=0;
bound=[popmin popmax;popmin popmax;popmin popmax];
%% 产生初始粒子和速度
for i=1:popsize
%随机产生一个种群
GApop(i,:)=Code(lenchrom,bound); %随机产生个体
%计算适应度
fitness(i)=Griewank(GApop(i,:)); %染色体的适应度
end
%找最好的染色体
[bestfitness bestindex]=min(fitness);
zbest=GApop(bestindex,:); %全局最佳
gbest=GApop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
%种群更新 GA选择更新
GApop=Select2(GApop,fitness,popsize);
% 交叉操作 GA
GApop=Cross(pc,lenchrom,GApop,popsize,bound);
% 变异操作 GA变异
GApop=Mutation(pm,lenchrom,GApop,popsize,[i maxgen],bound);
pop=GApop;
for j=1:popsize
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
%% 结果
disp '*************best particle number****************'
zbest
%%
plot(yy,'linewidth',2);
title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
grid on
结果如下:
zbest =
28.2689 0.2750 15.8455
最值为
0.3187
实际最值为 0