遗传算法Word下载.docx
《遗传算法Word下载.docx》由会员分享,可在线阅读,更多相关《遗传算法Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
40000<
216
,这里ni取16。
例如0000110110000101就表示一个解空间中的基因串。
表示所有自变量x=(x1,x2,…,xk)的二进制串的总长度称为一个染色体(Chromosome)的长度或者一个个体(Individual)的长度,
。
编码过程一般在实现遗传算法之前需要指定。
解码:
解码即将编码空间中的基因串翻译成解空间中的自变量的实际值的过程。
对于二进制编码而言,每个二进制基因串都可以这样翻译成一个十进制实数值,
例如基因串0000110110000101,可以翻译为
,这里二进制基因串转变成十进制是从左至右进行的。
1.2初始化种群
在开始遗传算法迭代过程之前,需要对种群进行初始化。
设种群大小为pop_size,每个染色体或个体的长度为chromo_size,种群的大小决定了种群的多样性,而染色体的长度则是由前述的编码过程决定的。
一般随机生成初始种群,但是如果知道种群的实际分布,也可以按照此分布来生成初始种群。
假设生成的初始种群为(v1,v2,…,vpop_size)。
1.3选择操作
选择操作即从前代种群中选择个体到下一代种群的过程。
一般根据个体适应度的分布来选择个体。
以初始种群(v1,v2,…,vpop_size)为例,假设每个个体的适应度为(fitness(v1),fitness(v2),…,fitness(vpop_size)),一般适应度可以按照解码的过程进行计算。
以轮盘赌的方式选择个体,如下图
随机转动一下轮盘,当轮盘停止转动时,若指针指向某个个体,则该个体被选中。
很明显,具有较高适应度的个体比具有较低适应度的个体更有机会被选中。
但是这种选择具有随机性,在选择的过程中可能会丢失掉比较好的个体,所以可以使用精英机制,将前代最优个体直接选到下一代中。
轮盘赌选择具体算法如下(这里假定种群中个体是按照适应度从小到大进行排列的,如果不是,可以按照某种排序算法对种群个体进行重排):
SelectionAlgorithm
varpop,pop_new;
/*pop为前代种群,pop_new为下一代种群*/
varfitness_value,fitness_table;
/*fitness_value为种群的适应度,fitness_table为种群累积适应度*/
fori=1:
pop_size
r=rand*fitness_table(pop_size);
/*随机生成一个随机数,在0和总适应度之间,因为fitness_table(pop_size)为最后一个个体的累积适应度,即为总适应度*/
first=1;
last=pop_size;
mid=round((last+first)/2);
idx=-1;
/*下面按照排中法选择个体*/
while(first<
=last)&
&
(idx==-1)
ifr>
fitness_table(mid)
first=mid;
elseifr<
last=mid;
else
idx=mid;
break;
endif
if(last-first)==1
idx=last;
endwhile
forj=1:
chromo_size
pop_new(i,j)=pop(idx,j);
endfor
endfor
/*是否精英选择*/
ifelitism
p=pop_size-1;
else
p=pop_size;
endif
p
pop(i,j)=pop_new(i,j);
/*若是精英选择,则只将pop_new前pop_size-1个个体赋给pop,最后一个为前代最优个体保留*/
1.3交叉操作
交叉操作是对任意两个个体进行的(在这里我们实现的算法是直接对相邻的两个个体进行的)。
随机选择两个个体,如下图所示
然后随机生成一个实数0<
=r<
=1,如果r<
cross_rate,0<
cross_rate<
1为交叉概率,则对这两个个体进行交叉,否则则不进行。
如果需要进行交叉,再随机选择交叉位置(rand*chromo_size),如果等于0或者1,将不进行交叉。
否则将交叉位置以后的二进制串进行对换(包括交叉位置)。
(注意:
有时候还可以进行多点交叉,但是这里只讨论单点交叉的情况)
单点交叉具体算法如下:
Crossoveralgorithm
2:
if(rand<
cross_rate)/*cross_rate为交叉概率*/
cross_pos=round(rand*chromo_size);
/*交叉位置*/
ifor(cross_pos==0,cross_pos==1)
continue;
/*若交叉位置为0或1,则不进行交叉*/
forj=cross_pos:
pop(i,j)<
->
pop(i+1,j);
/*交换*/
1.4变异操作
变异操作是对单个个体进行的。
首先生成一个随机实数0<
mutate_rate,则对此个体进行变异操作,0<
mutate_rate<
1为变异概率,一般为一个比较小的实数。
对每一个个体,进行变异操作,如下图所示
如个体需要进行变异操作,首先需要确定变异位置(rand*chromo_size),若为0则不进行变异,否则则对该位置的二进制数字进行变异:
1变成0,0变成1.(当然也可以选择多点进行变异)
单点变异的具体算法描述如下:
Mutationalgorithm
ifrand<
mutate_rate/*mutate_rate为变异概率*/
mutate_pos=round(rand*chromo_size);
/*变异位置*/
ifmutate_pos==0
/*若变异位置为0,则不进行变异*/
pop(i,mutate_pos)=1-pop(i,mutate_pos);
/*将变异位置上的数字至反*/
1.5遗传算法流程
遗传算法计算流程图如下图所示
1.6MATLAB程序实现
初始化:
%初始化种群
%pop_size:
种群大小
%chromo_size:
染色体长度
functioninitilize(pop_size,chromo_size)
globalpop;
pop(i,j)=round(rand);
end
end
cleari;
clearj;
计算适应度:
(该函数应该根据具体问题进行修改,这里优化的函数是前述的一维函数)
%计算种群个体适应度,对不同的优化目标,此处需要改写
functionfitness(pop_size,chromo_size)
globalfitness_value;
globalG;
fitness_value(i)=0.;
ifpop(i,j)==1
fitness_value(i)=fitness_value(i)+2^(j-1);
end
fitness_value(i)=-1+fitness_value(i)*(3.-(-1.))/(2^chromo_size-1);
fitness_value(i)=-(fitness_value(i)-1).^2+4;
对个体按照适应度大小进行排序:
%对个体按适应度大小进行排序,并且保存最佳个体
functionrank(pop_size,chromo_size)
globalfitness_table;
globalfitness_avg;
globalbest_fitness;
globalbest_individual;
globalbest_generation;
pop_size
fitness_table(i)=0.;
min=1;
temp=1;
temp1(chromo_size)=0;
min=i;
forj=i+1:
iffitness_value(j)<
fitness_value(min);
min=j;
ifmin~=i
temp=fitness_value(i);
fitness_value(i)=fitness_value(min);
fitness_value(min)=temp;
fork=1:
temp1(k)=pop(i,k);
pop(i,k)=pop(min,k);
pop(min,k)=temp1(k);
ifi==1
fitness_table(i)=fitness_table(i)+fitness_value(i);
fitness_table(i)=fitness_table(i-1)+fitness_value(i);
fitness_table
fitness_avg(G)=fitness_table(pop_size)/pop_size;
iffitness_value(pop_size)>
best_fitness
best_fitness=fitness_value(pop_size);
best_generation=G;
best_individual(j)=pop(pop_size,j);
cleark;
clearmin;
cleartemp;
cleartemp1;
选择操作:
%轮盘赌选择操作
%cross_rate:
是否精英选择
functionselection(pop_size,chromo_size,elitism)
r=rand*fitness_table(pop_size);
clearpop_new;
clearfirst;
clearlast;
clearidx;
clearmid;
交叉操作:
%单点交叉操作
交叉概率
functioncrossover(pop_size,chromo_size,cross_rate)
cross_rate)
temp=pop(i,j);
pop(i,j)=pop(i+1,j);
pop(i+1,j)=temp;
clearcross_pos;
变异操作:
%单点变异操作
变异概率
functionmutation(pop_size,chromo_size,mutate_rate)
mutate_rate
clearmutate_pos;
打印算法迭代过程:
%打印算法迭代过程
%generation_size:
迭代次数
functionplotGA(generation_size)
x=1:
1:
generation_size;
y=fitness_avg;
plot(x,y)
算法主函数:
%遗传算法主函数
输入种群大小
输入染色体长度
输入迭代次数
输入交叉概率
输入变异概率
%elitism:
输入是否精英选择
%m:
输出最佳个体
%n:
输出最佳适应度
%p:
输出最佳个体出现代
%q:
输出最佳个体自变量值
function[m,n,p,q]=GeneticAlgorithm(pop_size,chromo_size,generation_size,cross_rate,mutate_rate,elitism)
globalG;
%当前代
%当前代适应度矩阵
%历代最佳适应值
%历代平均适应值矩阵
%历代最佳个体
%最佳个体出现代
fitness_avg=zeros(generation_size,1);
disp"
hhee"
fitness_value(pop_size)=0.;
best_fitness=0.;
best_generation=0;
initilize(pop_size,chromo_size);
%初始化
forG=1:
generation_size
fitness(pop_size,chromo_size);
%计算适应度
rank(pop_size,chromo_size);
%对个体按适应度大小进行排序
selection(pop_size,chromo_size,elitism);
%选择操作
crossover(pop_size,chromo_size,cross_rate);
%交叉操作
mutation(pop_size,chromo_size,mutate_rate);
%变异操作
plotGA(generation_size);
m=best_individual;
%获得最佳个体
n=best_fitness;
%获得最佳适应度
p=best_generation;
%获得最佳个体出现代
%获得最佳个体变量值,对不同的优化目标,此处需要改写
q=0.;
forj=1:
ifbest_individual(j)==1
q=q+2^(j-1);
q=-1+q*(3.-(-1.))/(2^chromo_size-1);
2.
案例研究
对上一节中的函数进行优化,设置遗传算法相关参数,程序如下
functionrun_ga()
elitism=true;
%选择精英操作
pop_size=20;
%种群大小
chromo_size=16;
%染色体大小
generation_size=200;
%迭代次数
cross_rate=0.6;
%交叉概率
mutate_rate=0.01;
%变异概率
[m,n,p,q]=GeneticAlgorithm(pop_size,chromo_size,generation_size,cross_rate,mutate_rate,elitism);
最优个体"
m
最优适应度"
n
最优个体对应自变量值"
q
得到最优结果的代数"
clear;
结果如下:
"
m=
1111111111111110
n=
4.0000
q=
1.0000
p=
74
此结果非常准确。
算法迭代过程图形:
从上图中可以看出,随着迭代次数的增加,算法逐渐收敛。
3.总结
本文详细的介绍了简单遗传算法的实现过程,并以一个简单的函数优化作为案例说明了其应用。
但是由于该测试函数过于简单,在实际的应用过程中,还需要对相关参数进行调整,使其效率得到更大的提高。