MATLAB遗传算法一:遗传算法简介:遗传算法(GeneticAlgorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。二:遗传算法的基本步骤a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。b)个体评价:计算群体P(t)中各个个体的适应度。c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。d)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。三:matlab实现例子:f(x)=10*sin(5x)+7*cos(4x)x∈[0,10]将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023。1.初始化initpop.mfunctionpop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength));%rand随机产生每个单元为0或者1行数(种群数量)为popsize,列数为chromlength(个体所含基因数)的矩阵,2.计算目标函数值2.1将二进制数转化为十进制数(1)decodebinary.m%产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为十进制functionpop2=decodebinary(pop)[px,py]=size(pop)%Pop的行和列数fori=1:pxpop2(i)=0forj=1:pypop2(i)=pop2(i)+2.^(py-j)*pop(i,j)endend2.2将二进制编码转化为十进制数(2)Decodechrom.m%函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置functionpop2=decodechrom(pop,spoint,length)pop1=pop(:,spoint:spoint+length-1)%pop1取pop的第spoint列到spoint+length-1列为止pop2=decodebinary(pop1)2.2.3计算目标函数值%calobjvalue.m函数的功能是实现目标函数的计算function[objvalue]=calobjvalue(pop)temp1=decodechrom(pop,1,10)%将pop每行转换成十进制x=temp1*10/1023%将二值域中的数转化为变量域的数objvalue=10*sin(5*x)+7*cos(4*x)%变量域是从1到10m=max(objvalue)b=0fori=1:100ifobjvalue(i)==mb=b+1endendfigurefplot('10*sin(5*x)+7*cos(4*x)',[010])holdonplot(x,objvalue,'or')xlabel(sprintf('%2d',b))gridon3计算个体的适应值calfitvalue.m%计算个体的适应值functionfitvalue=calfitvalue(objvalue)[px,py]=size(objvalue)fori=1:pyifobjvalue(i)0;temp=objvalue(i)elsetemp=0.0endfitvalue(i)=tempEnd4选择复制selection.m%根据方程pi=fi/∑fi=fi/fsum,选择步骤:%1)在第t代,计算fsum和pi%2)产生{0,1}的随机数rand(.),求s=rand(.)*fsum%3)求∑fi≥s中最小的k,则第k个个体被选中%最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1代种群function[newpop]=selection(pop,fitvalue)totalfit=sum(fitvalue)%求适应值的和fitvalue=fitvalue/totalfit%单个个体被选择的概率%如fitvalue=[1234],则cumsum(fitvalue)=[13610]fitvalue=cumsum(fitvalue)[px,py]=size(pop)ms=sort(rand(px,1))%从小到大排列列向量fitin=1newin=1whilenewin=px%得到px个个体if(ms(newin))fitvalue(fitin)newpop(newin,:)=pop(fitin,:)%将pop的第fitin行复制给newpop中的newin行newin=newin+1elsefitin=fitin+1endEnd5交叉crossover.m%交叉的概率为pcfunction[newpop]=crossover(pop,pc)[px,py]=size(pop)newpop=ones(size(pop))%所有元素为1fori=1:2:px-1if(randpc)cpoint=round(rand*py)newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)];newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];elsenewpop(i,:)=pop(i,:)newpop(i+1,:)=pop(i+1,:)endend6变异mutation.m%每个个体的每一位都以概率pm翻转,即由“1”变为“0”,function[newpop]=mutation(pop,pm)[px,py]=size(pop)newpop=popfori=1:px*py%对每一个元素进行判断if(randpm)newpop(i)=1-pop(i)endend7求出群体中最大得适应值及其个体best.m%求出群体中适应值最大的值function[bestindividual,bestfit]=best(pop,fitvalue)[px,py]=size(pop)bestindividual=pop(1,:)bestfit=fitvalue(1);fori=2:pxiffitvalue(i)bestfitbestindividual=pop(i,:)bestfit=fitvalue(i)endend8主程序main.m%遗传算法主程序popsize=100%种群大小chromlength=10%字符串长度,即个体长度pc=0.6%交叉概率pm=0.001%变异概率pop=initpop(popsize,chromlength)%随机产生初始群体[objvalue]=calobjvalue(pop)%计算目标函数值,形成一个20*1的列向量fitvalue=calfitvalue(objvalue)%计算群体中每个个体的适应度fori=1:20%20次迭代[newpop]=selection(pop,fitvalue)%选择[newpop]=crossover(newpop,pc)%交叉[newpop]=mutation(newpop,pm)%变异[objvalue]=calobjvalue(newpop)fitvalue=calfitvalue(objvalue)[bestindividual,bestfit]=best(newpop,fitvalue)%求出群体中适应值最大的个体及适应值y(i)=max(bestfit);n(i)=i;pop5=bestindividual;x(i)=decodechrom(pop5,1,chromlength)*10/1023;pop=newpop;end四:结果分析上面六张图片分别表示的是第1,3,5,10,15,20次迭代之后的结果,其中每张图中间下方的数字表示最大函数值的个数,即每张图片圆点处于最高点的个数,显然看得出来,随着迭代次数的增加,基本上都会往最优解方向收敛。再分析,每一次迭代过程中的最优解,每一对(x,y)表示一次最优解。最大函数值出现在x=7.8592和1.5738附近,这与上面六张图展示也相符。