遗传算法(Genetic Algorithm)是借鉴生物界的进化规律(适者生存,优胜劣汰)演化而来的随机优化搜寻算法。
主要特点:
1 GA从由很多的个体组成的一个初始化群体开始最优化的搜索过程.
2 遗传算法的选择,交叉,变异等运算都是以一种概率的方式进行的
3 具有并行的特点,适合大规模复杂问题的优化
主要算法:
1. 种群的创建. 这个是最开始需要做的. 定义一个种群包括多少个体,一个个体包含多少的染色体,个体的适应度(fitness). 这步骤之后,需要选择全局最优适应度和个体最佳适应度(这个群体本身).
popsize=100; %种族规模(个体的数量,表示有100个染色体)
lenchrom=7; %变量字符串长度,一个个体染色体数量
%染色体的取值范围
popmax=50;
popmin=0;
bound=[popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax];
%产生1个群体,群体还有100个个体
for i=1:popsize
GApop(i,:)=Code(lenchrom,bound); %随机产生个体
fitness(i)=fun(GApop(i,:)); %染色体的适应度
end
function ret=Code(lenchrom,bound)
%将变量编码为染色体,随机初始化一个群体
flag=0;
while flag==0
pick=rand(1,lenchrom);
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick;
flag=test_here(lenchrom,bound,ret);
end
%初始化
%找到最好的染色体
[bestfitness bestindex]=min(fitness);
zbest=GApop(bestindex,:); %全局最优
gbest=GApop; %个体最佳
fitnessgbest=fitness; %个体最佳适应值(最优的一个个体)
fitnesszbest=bestfitness; %全局最佳适应度值(最优的一个整体)
2.迭代寻优.定义了种群进化的次数,每一次进化,个体的选择,染色体的交叉和变异就会出现。每一次的迭代寻优,个体最佳适应值和全局最佳适应值就会被计算和筛选.
%迭代寻优,对100个种群,迭代100次
maxgen=100; %进化次数
for i=1:maxgen
i
%种群的更新,GA选择更新
GApop=Selection(GApop,fitness,popsize);
%交叉操作GA
GApop=CrossGA(pc,lenchrom,GApop,popsize,bound);
%变异操作GA变异
GApop=Mutation(pm,lenchrom,GApop,popsize,[i,maxgen],bound);
pop=GApop;
%适应值判断
for j=1:popsize
if 0.072*pop(j,1)+0.063*pop(j,2)++0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7)<=264.4
if 128*pop(j,1)+78.1*pop(j,2)++64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719
fitness(j)=fun(pop(j,:));
end
end
%个体最优更新,保存所有最优的个体到一个群体中
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
y(i)=fitnesszbest;
end
3种群的更新GA,选择更新.对每个种群,都会筛选个体根据个体的适应性。一个个体的适应性越高,被选择的机会越大和次数越多.
function ret=Selection(individuals, fitness, sizepop)
%对每一代个体进行选择,已进行后面的交叉和变异
fitness=1./fitness;
sumfitness=sum(fitness);
sumf=fitness./sumfitness;
index=[];
%转100次转盘,选择个体
for i=1: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;
4交叉操. 让两个个体的染色体的交换,从而改变个体的适应性.
pc=0.7; %交叉概率
function ret=CrossGA(pcross,lenchrom,chrom, sizepop, bound)
for i=1:sizepop
%随机选择两个个体的染色体进行交叉
pick=rand(1,2);
if 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*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_here(lenchrom,bound, chrom(index(1),:));%检验交叉的可行性
flag2=test_here(lenchrom,bound, chrom(index(2),:));
if flag1*flag2==0%不可行,重新交叉
flag=0;
else flag=1;
end
end
end
ret=chrom;
5 变异操作. 让个体的染色体的变异,从而改变个体的适应性.
pm=0.3; %变异概率
function ret=Mutation(pmutation, lenchrom, chrom, sizepop,pop,bound)
%本函数完成变异操作
for i=1:sizepop
pick=rand;
while pick==0
pick=rand;
end
pick=rand;
if pick>pmutation%变异概率是否进行
continue;%变异概率不进行
end
%变异概率进行
flag=0;
while flag==0
pick=rand;
while pick==0
pick=rand;
end
%随机选择位置
pos=ceil(pick*lenchrom);
v=chrom(i,pos);%获得当前群体的的第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_here(lenchrom, bound, chrom(i,:));
end
end
ret=chrom;
%%可行性检验
function flag=test_here(lenchrom, bound, code)
[n,m]=size(code);
flag=1;
[n,m]=size(code);
for i=1:n
if code(i)<bound(i,1)||code(i)>bound(i,2)
flag=0;
end
end
Reference
MATLAB 智能算法超级学习手册