for i=1:N
if(mask(i)<=bitnum) t=unit1(i); unit1(i)=unit2(i); unit2(i)=t; end end end
%交叉操作
% pregen:交叉操作前种群 % unitnum:进行交叉操作的个体数 % bitnum:交叉的位数 % nextgen:交叉操作后的种群
function nextgen=crossover(pregen,unitnum,bitnum) %种群个体数目 row=size(pregen,1); cross=randperm(row); i=1; %交叉操作 while i*2<=unitnum row1=find(cross==i); unit1=pregen(row1,:); row2=find(cross==(row-i));
unit2=pregen(row2,:); if(numel(unit1)*numel(unit2)~=0) [unit1,unit2]=crossoverunit(unit1, unit2,bitnum); end
pregen(row1,:)=unit1; pregen(row2,:)=unit2; i=i+1; end %更新种群 nextgen=pregen; end
%变异操作
% pregen:进行变异操作前种群 % unitnum:进行变异的个体数 % bitnum:变异的位数
% nextgen:进行变异操作后的种群
function nextgen=mutation(pregen,unitnum,bitnum)
% row:种群个体数 column:个体的位数
[row,column]=size(pregen); needmutation=randperm(row); for i=1:row
%判断该个体是否需要变异 if needmutation(i)<=unitnum %取出该个体进行变异操作 unit=pregen(i,:);
%随机生成一个 1xN 的0-1数组bitseq,其中1的个数为 bitnum
bitseq=randperm(column); for j=1:column
if(bitseq(j)<=bitnum) bitseq(j)=0; else bitseq(j)=1; end end
%对 bitseq中的0对应的unit位进行变异操作
for k=1:column if(bitseq(k)==0) %变异:0变1,1变0 unit(k)=1-unit(k); end end
pregen(i,:)=unit; end end
%更新种群 nextgen=pregen; end
%计算适应值数组
function fitness=computefitness(population) fitness=[];
count=size(population,1); for i=1:count
[x1,x2]=codemap(population(i,:),
16,-10,10);
fitness(i)=destfun(x1,x2); end end
%计算实际复制数
function virtualcopy=computecopy(fitness) copy=[];
-5-
count=numel(fitness); meanvalue=mean(fitness); for i=1:count
copy(i)=fitness(i)/meanvalue; if(copy(i)<0) copy(i)=0; end end
virtualcopy=round(copy); end
%选择和复制操作
% pregen:复制前种群 nextgen:复制后种群 % maxfitness:最大适应度 function
[nextgen,max_x,max_y,maxfitness]=selection(pregen) nextgen=[];
fitness=computefitness(pregen); %适应值函数 maxposition=
find(fitness==max(fitness)); [max_x,max_y]=
codemap(pregen(maxposition(1),:), 16,-10,10);
maxfitness=max(fitness);
virtualcopy=computecopy(fitness); %个体期望的复制数 count=numel(fitness);
%如果 virtualcopy 总和个数小于原种群个体数,全部复制
if(sum(virtualcopy)<count) nextgen=pregen; return; end
%如果 virtualcopy 总和个数大于原种群个体数,优先复制适应值较大的个体 if(sum(virtualcopy)>count)
%还可以复制的个体数目 rest=count;
while rest>0
maxnum=max(virtualcopy);
if maxnum<rest
for i=1:maxnum
nextgen=[nextgen; pregen(maxindex(1),:)]; end virtualcopy(maxindex(1))=0; rest=rest-maxnum; else
for j=1:rest
nextgen=[nextgen; pregen(maxindex(1),:)];
end rest=0; end end return; end
if(sum(virtualcopy)==count)
for k=1:count if virtualcopy(k)>0
for l=1:virtualcopy(k) nextgen=[nextgen;pregen(k,:)]; end end end end
end
%最大适应值个体应该复制的个数 maxindex=find(virtualcopy==maxnum); %最大适应值个体的位置
-6-
遗传算法求解函数最值
——by 孤鸿原野
摘要:遗传算法是一种十分常见的智能算法,它通过模拟生物进化过程,来求解最优化问题。本文主要介绍如何利用遗传算法求解函数的极值问题,并通过MATLAB编程,实现了对两个二元函数的最值的求解。
关键字:遗传算法 MATLAB编程 函数最值
1 引言
遗传算法(Genetic Algorith,GA)最先是由美国Michgan大学的John Holland于1975年提出的。遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的一种计算模型,常被用来求解最优化问题。遗传算法从一组随机产生的称之为“种群(Population)”的初始解开始搜索过程。根据问题的性质,对种群的每个个体进行适应性评价,得到适应值(fitness),适应值代表着该个体是问题解的适合程度。同时对该种群中好的个体进行复制和选择,并随机交叉(crossover)和变异(mutation),从而得到下一代种群。如此往复,经过一代代的选择和淘汰,最终得到问题的最优解或次优解。
3 遗传算法MATLAB程序实现
根据遗传算法的操作步骤,得到MATLAB实现遗传算法的程序流程图,如图1所示。