简单的遗传算法MATLAB实现【精品毕业设计】(完整版)

合集下载

遗传算法的原理及MATLAB程序实现.

遗传算法的原理及MATLAB程序实现.

1 遗传算法的原理1.1 遗传算法的基本思想遗传算法(genetic algorithms,GA)是一种基于自然选择和基因遗传学原理,借鉴了生物进化优胜劣汰的自然选择机理和生物界繁衍进化的基因重组、突变的遗传机制的全局自适应概率搜索算法。

遗传算法是从一组随机产生的初始解(种群)开始,这个种群由经过基因编码的一定数量的个体组成,每个个体实际上是染色体带有特征的实体。

染色体作为遗传物质的主要载体,其内部表现(即基因型)是某种基因组合,它决定了个体的外部表现。

因此,从一开始就需要实现从表现型到基因型的映射,即编码工作。

初始种群产生后,按照优胜劣汰的原理,逐代演化产生出越来越好的近似解。

在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。

这个过程将导致种群像自然进化一样,后代种群比前代更加适应环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。

计算开始时,将实际问题的变量进行编码形成染色体,随机产生一定数目的个体,即种群,并计算每个个体的适应度值,然后通过终止条件判断该初始解是否是最优解,若是则停止计算输出结果,若不是则通过遗传算子操作产生新的一代种群,回到计算群体中每个个体的适应度值的部分,然后转到终止条件判断。

这一过程循环执行,直到满足优化准则,最终产生问题的最优解。

图1-1给出了遗传算法的基本过程。

1.2 遗传算法的特点1.2.1 遗传算法的优点遗传算法具有十分强的鲁棒性,比起传统优化方法,遗传算法有如下优点:1. 遗传算法以控制变量的编码作为运算对象。

传统的优化算法往往直接利用控制变量的实际值的本身来进行优化运算,但遗传算法不是直接以控制变量的值,而是以控制变量的特定形式的编码为运算对象。

这种对控制变量的编码处理方式,可以模仿自然界中生物的遗传和进化等机理,也使得我们可以方便地处理各种变量和应用遗传操作算子。

2. 遗传算法具有内在的本质并行性。

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序一、本文概述遗传算法(Genetic Algorithms,GA)是一种模拟自然界生物进化过程的优化搜索算法,它通过模拟自然选择和遗传学机制,如选择、交叉、变异等,来寻找问题的最优解。

由于其全局搜索能力强、鲁棒性好以及易于实现并行化等优点,遗传算法在多个领域得到了广泛的应用,包括函数优化、机器学习、神经网络训练、组合优化等。

本文旨在介绍如何使用MATLAB实现遗传算法程序。

MATLAB作为一种强大的数学计算和编程工具,具有直观易用的图形界面和丰富的函数库,非常适合用于遗传算法的实现。

我们将从基本的遗传算法原理出发,逐步介绍如何在MATLAB中编写遗传算法程序,包括如何定义问题、编码、初始化种群、选择操作、交叉操作和变异操作等。

通过本文的学习,读者将能够掌握遗传算法的基本原理和MATLAB编程技巧,学会如何使用MATLAB实现遗传算法程序,并能够在实际问题中应用遗传算法求解最优解。

二、遗传算法基础遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传学机制的优化搜索算法。

它借鉴了生物进化中的遗传、交叉、变异等机制,通过模拟这些自然过程来寻找问题的最优解。

遗传算法的核心思想是将问题的解表示为“染色体”,即一组编码,然后通过模拟自然选择、交叉和变异等过程,逐步迭代搜索出最优解。

在遗传算法中,通常将问题的解表示为一个二进制字符串,每个字符串代表一个个体(Individual)。

每个个体都有一定的适应度(Fitness),适应度越高的个体在下一代中生存下来的概率越大。

通过选择(Selection)、交叉(Crossover)和变异(Mutation)等操作,生成新一代的个体,并重复这一过程,直到找到满足条件的最优解或达到预定的迭代次数。

选择操作是根据个体的适应度,选择出适应度较高的个体作为父母,参与下一代的生成。

常见的选择算法有轮盘赌选择(Roulette Wheel Selection)、锦标赛选择(Tournament Selection)等。

完整的遗传算法函数Matlab程序【精品毕业设计】(完整版)

完整的遗传算法函数Matlab程序【精品毕业设计】(完整版)

完整的遗传算法函数Matlab程序function [x,endPop,bPop,traceInfo] = ga(bounds,eevalFN,eevalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)n=nargin;if n<2 | n==6 | n==10 | n==12disp('Insufficient arguements')endif n<3 %Default eevalation opts.eevalOps=[];endif n<5opts = [1e-6 1 0];endif isempty(opts)opts = [1e-6 1 0];endif any(eevalFN<48) %Not using a .m fileif opts(2)==1 %Float gae1str=['x=c1; c1(xZomeLength)=', eevalFN ';'];e2str=['x=c2; c2(xZomeLength)=', eevalFN ';'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits); endPop(j,xZomeLength)=',...eevalFN ';'];endelse %Are using a .m fileif opts(2)==1 %Float gae1str=['[c1 c1(xZomeLength)]=' eevalFN '(c1,[gen eevalOps]);'];e2str=['[c2 c2(xZomeLength)]=' eevalFN '(c2,[gen eevalOps]);'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits);[x v]=' eevalFN ...'(x,[gen eevalOps]); endPop(j,:)=[f2b(x,bounds,bits) v];'];endendif n<6 %Default termination informationtermOps=[100];termFN='maxGenTerm';endif n<12 %Default muatation informationif opts(2)==1 %Float GAmutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']; mutOps=[4 0 0;6 termOps(1) 3;4 termOps(1) 3;4 0 0];else %Binary GAmutFNs=['binaryMutation'];mutOps=[0.05];endendif n<10 %默认的交叉信息if opts(2)==1 %浮点编码xOverFNs=['arithXover heuristicXover simpleXover'];xOverOps=[2 0;2 3;2 0];else %Binary GAxOverFNs=['simpleXover'];xOverOps=[0.6];endendif n<9 %Default select opts only i.e. roullete wheel.selectOps=[];endif n<8 %Default select infoselectFN=['normGeomSelect'];selectOps=[0.08];endif n<6 %默认的算法终止准则termOps=[100];termFN='maxGenTerm';endif n<4 %初始种群为空startPop=[];endif isempty(startPop) %随机生成初始种群startPop=initializega(80,bounds,eevalFN,eevalOps,opts(1:2));endif opts(2)==0 %二进制编码bits=calcbits(bounds,opts(1));endxOverFNs=parse(xOverFNs);mutFNs=parse(mutFNs);xZomeLength = size(startPop,2); %Length of the xzome=numVars+fittness numVar = xZomeLength-1; %变量数目popSize = size(startPop,1); %种群中个体数目endPop = zeros(popSize,xZomeLength); %次种群矩阵c1 = zeros(1,xZomeLength); %个体c2 = zeros(1,xZomeLength); %个体numXOvers = size(xOverFNs,1); %交叉操作次数numMuts = size(mutFNs,1); %变异操作次数epsilon = opts(1); %适应度门限值oeval = max(startPop(:,xZomeLength)); %初始种群中的最优值bFoundIn = 1;done = 0;gen = 1;collectTrace = (nargout>3);floatGA = opts(2)==1;display = opts(3);while(~done)[beval,bindx] = max(startPop(:,xZomeLength)); %当前种群的最优值best = startPop(bindx,:);if collectTracetraceInfo(gen,1)=gen; %当前代traceInfo(gen,2)=startPop(bindx,xZomeLength); %最优适应度traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %平均适应度traceInfo(gen,4)=std(startPop(:,xZomeLength));endif ( (abs(beval - oeval)>epsilon) | (gen==1))if displayfprintf(1,'\n%d %f\n',gen,beval);endif floatGAbPop(bFoundIn,:)=[gen startPop(bindx,:)];elsebPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)... startPop(bindx,xZomeLength)];endbFoundIn=bFoundIn+1;oeval=beval;elseif displayfprintf(1,'%d ',gen);endendendPop = feeval(selectFN,startPop,[gen selectOps]); %选择操作if floatGAfor i=1:numXOvers,for j=1:xOverOps(i,1),a = round(rand*(popSize-1)+1); %一个父代个体b = round(rand*(popSize-1)+1); %另一个父代个体xN=deblank(xOverFNs(i,:)); %交叉函数[c1 c2] = feeval(xN,endPop(a,:),endPop(b,:),bounds,[gen… xOverOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseif c1(1:numVar)==endPop(b,(1:numVar))c1(xZomeLength)=endPop(b,xZomeLength);elseeeval(e1str);endif c2(1:numVar)==endPop(a,(1:numVar))c2(xZomeLength)=endPop(a,xZomeLength);elseif c2(1:numVar)==endPop(b,(1:numVar))c2(xZomeLength)=endPop(b,xZomeLength);elseeeval(e2str);endendPop(a,:)=c1;endPop(b,:)=c2;endendfor i=1:numMuts,for j=1:mutOps(i,1),a = round(rand*(popSize-1)+1);c1 = feeval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen mutOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseeeval(e1str);endendPop(a,:)=c1;endendelse %遗传操作的统计模型for i=1:numXOvers,xN=deblank(xOverFNs(i,:));cp=find(rand(popSize,1)if rem(size(cp,1),2) cp=cp(1:(size(cp,1)-1)); endcp=reshape(cp,size(cp,1)/2,2);for j=1:size(cp,1)a=cp(j,1); b=cp(j,2);[endPop(a,:) endPop(b,:)] = feeval(xN,endPop(a,:),endPop(b,:), bounds,[gen xOverOps(i,:)]); endendfor i=1:numMutsmN=deblank(mutFNs(i,:));for j=1:popSizeendPop(j,:) = feeval(mN,endPop(j,:),bounds,[gen mutOps(i,:)]);eeval(e1str);endendend。

遗传算法matlab实现

遗传算法matlab实现

%*****************************************%遗传算法求函数最大值%f(x1,x2)=100(x1^2-x2)^+(1-x1)^2%-2.048<=x i<=2.048;i=1,2%*****************************************c l e a r a l l;c l o s e a l l;c l cs i z e=500;%种群数量G=300;%种群进化代数C o d e L=10;%编码长度u m a x=2.048;u m i n=-2.048;E=r o u n d(r a n d(s i z e,2*C o d e L));%r o u n d取左整,产生s i z e(500)个%20位编码,分别表示x1,x2%遗传进化开始f o r k=1:1:G%k表示进化次数t i m e(k)=k;%为作图时使用f o r s=1:1:s i z em=E(s,:);%提取行的两个参数x1,x2,等待解码y1=0;y2=0;%为x1,x2解码,目的将二进制01代码映射到区间[-2.048,2.048]上的y1,y2m1=m(1:1:C o d e L);%截取前10个二进制码f o r i=1:1:C o d e L%换成十进制数y1=y1+m1(i)*2^(i-1);e n dx1=(u m a x-u m i n)*y1/1023+u m i n;%映射到区间m2=m(C o d e L+1:1:2*C o d e L);%截取后10个二进制码f o r i=1:1:C o d e Ly2=y2+m2(i)*2^(i-1);e n dx2=(u m a x-u m i n)*y2/1023+u m i n;%映射到区间F(s)=100*(x1^2-x2)^2+(1-x1)^2;%计算函数值e n dJ i=1./F;%*****************B e s t J(k)=m i n(J i);%找出每一代进化中,J i最小的值f i=F;%适应度函数,,F有500个[O d e r f i,I n d e x f i]=s o r t(f i);%由小到大的排序B e s t f i=O d e r f i(s i z e);%排在末尾的值是最大的B e s t S=E(I n d e x f i(s i z e),:);%在种群中查找,适应度最大时的参数x1,x2作为暂时最佳参数b f i(k)=B e s t f i;%找出每一代进化中,最佳适应度%***********************选择复制**********************f i_s u m=s u m(f i);%轮盘法选择f i_s i z e=(f i/f i_s u m)*s i z e;f o r i=1:1:s i z ei f f i_s i z e(i)>1%判断适应度,高的个体保留,低的舍去T e m p E(i,:)=E(i,:);e l s eT e m p E(i,:)=B e s t S;%填充舍去基因e n de n dT e m p E=E;%%***********以概率进行染色体交叉********************p c=0.6;n=c e i l(20*r a n d);%产生随机交叉点,%n=19;f o r i=1:2:(s i z e-1)t e m p=r a n d;i f p c>t e m pf o r j=n:1:20T e m p E(i,j)=E(i+1,j);T e m p E(i+1,j)=E(i,j);e n de n de n dT e m p E(s i z e,:)=B e s t S;%防止变异丢掉最优值E=T e m p E;%*********以概率进行基因突变*******************p m=0.1;f o r i=1:1:s i z ef o r j=1:1:2*C o d e Lt e m p=r a n d;i f p m>t e m pi f T e m p E(i,j)==0T e m p E(i,j)=1;e l s eT e m p E(i,j)=0;e n de n de n de n d%*******************************T e m p E(s i z e,:)=B e s t S;E=T e m p E;e n dm a x_V a l u e=B e s t f iB e s t Sx1x2f ig u r e(1);p l o t(t i m e,B e s t J);x l a b e l('T i m e s');y l a b e l('B e s t J');f ig u r e(2);p l o t(t i m e,b f i);x l a b e l('T i m e s');y l a b e l('B e s t F');m a x_V a l u e=3.9059e+003B e s t S=C o l u m n s1t h r o u g h100000000000C o l u m n s11t h r o u g h200000000000 x1=-2.0480x2=-2.0480Published with MATLAB® 7.9。

遗传算法的MATLAB程序设计

遗传算法的MATLAB程序设计

循环:从1到最大代数
选择、交叉、变异生成新群体
调用select,cross,mutation
计算新群体适应度及其最小最大和平均值
调用decode,fitcalculation
记录当前最佳适应度及对应变量值
输出计算结果、打印图形
2、程序设计中几个难点说明 在PDF文稿点评主程序、各子程序及设计要点。
以齿数为例说明:15≤ x1≤ 40, 由上式L=5,但有6个多余码。 定L=5,调整上界为: XU=46
1 x1 8.75 所以,边界 15 x2 46 条件更改为: 8 x3 20.7
0.2 x4 0.9
1 x1 10
原来:15 x2 40
8 x3 20
子程序 2)code:编码。随机生成染色体。 X=0 1 1 1 1 0 1 1
3)decode:解码。将二进制数转换成十进制数。 X=0 1 1 1 1 0 1 1 x1 x2 x3
x1=(0 1)2=0*21+1*20=1 x2=(1 1)2=1*21+1*20=3 x3=(1 0 1 1)2=1*23+0*22 +1*21 +1*20 =11
2L XU XL 1

对模数, 表示精度δ =0.25,取L=5,调整上界为 XU=8.75 ; 对齿数, 表示精度δ =1.00,取L=5,调整上界为 XU=46 ; 对螺旋角,表示精度δ =0.1,取L=7,调整上界为 XU=20.7; 齿宽系数,表示精度δ =0.1,取L=3,调整上界为 XU=0.9;
X
,
r),
if if
Cmin ( X , r) 0 Cmin ( X , r) 0

遗传算法MATLAB程序设计

遗传算法MATLAB程序设计

摘自Matlab在数学建模中的应用,北航出版社,2011.44.2遗传算法MATLAB程序设计4.2.1程序设计流程及参数选取4.2.1.1遗传算法程序设计伪代码BEGINt = 0 ; %Generations NO.初始化P(t) ; %Initial Population or Chromosomes计算P(t) 的适应值;while (不满足停止准则) dobegint = t+1 ;从P(t-1)中选择P(t) ; % Selection重组P(t) ; % Crossover and Mutation计算P(t) 的适应值;endEND4.2.1.2遗传算法的参数设计原则在单纯的遗传算法当中,也并不总是收敛,即使在单峰或单调也是如此。

这是因为种群的进化能力已经基本丧失,种群早熟。

为了避免种群的早熟,参数的设计一般遵从以下原则[5]:(1)种群的规模:当群体规模太小时,很明显会出现近亲交配,产生病态基因。

而且造成有效等位基因先天缺乏,即使采用较大概率的变异算子,生成具有竞争力高阶模式的可能性仍很小,况且大概率变异算子对已有模式的破坏作用极大。

同时遗传算子存在随机误差(模式采样误差),妨碍小群体中有效模式的正确传播,使得种群进化不能按照模式定理产生所预测的期望数量;种群规模太大,结果难以收敛且浪费资源,稳健性下降。

种群规模的一个建议值为0~100。

(2)变异概率:当变异概率太小时,种群的多样性下降太快,容易导致有效基因的迅速丢失且不容易修补;当变异概率太大时,尽管种群的多样性可以得到保证,但是高阶模式被破坏的概率也随之增大。

变异概率一般取0.0001~0.2。

(3)交配概率:交配是生成新种群最重要的手段。

与变异概率类似,交配概率太大容易破坏已有的有利模式,随机性增大,容易错失最优个体;交配概率太小不能有效更新种群。

交配概率一般取0.4~0.99。

(4)进化代数:进化代数太小,算法不容易收敛,种群还没有成熟;代数太大,算法已经熟练或者种群过于早熟不可能再收敛,继续进化没有意义,只会增加时间开支和资源浪费。

使用MATLAB遗传算法工具实例(详细)(精编文档).doc

【最新整理,下载后即可编辑】最新发布的MATLAB 7.0 Release 14已经包含了一个专门设计的遗传算法与直接搜索工具箱(Genetic Algorithm and Direct Search Toolbox,GADS)。

使用遗传算法与直接搜索工具箱,可以扩展MATLAB及其优化工具箱在处理优化问题方面的能力,可以处理传统的优化技术难以解决的问题,包括那些难以定义或不便于数学建模的问题,可以解决目标函数较复杂的问题,比如目标函数不连续、或具有高度非线性、随机性以及目标函数没有导数的情况。

本章8.1节首先介绍这个遗传算法与直接搜索工具箱,其余各节分别介绍该工具箱中的遗传算法工具及其使用方法。

8.1 遗传算法与直接搜索工具箱概述本节介绍MATLAB的GADS(遗传算法与直接搜索)工具箱的特点、图形用户界面及运行要求,解释如何编写待优化函数的M文件,且通过举例加以阐明。

8.1.1 工具箱的特点GADS工具箱是一系列函数的集合,它们扩展了优化工具箱和MATLAB数值计算环境的性能。

遗传算法与直接搜索工具箱包含了要使用遗传算法和直接搜索算法来求解优化问题的一些例程。

这些算法使我们能够求解那些标准优化工具箱范围之外的各种优化问题。

所有工具箱函数都是MATLAB的M文件,这些文件由实现特定优化算法的MATLAB语句所写成。

使用语句type function_name就可以看到这些函数的MATLAB代码。

我们也可以通过编写自己的M文件来实现来扩展遗传算法和直接搜索工具箱的性能,也可以将该工具箱与MATLAB的其他工具箱或Simulink结合使用,来求解优化问题。

工具箱函数可以通过图形界面或MATLAB命令行来访问,它们是用MATLAB语言编写的,对用户开放,因此可以查看算法、修改源代码或生成用户函数。

遗传算法与直接搜索工具箱可以帮助我们求解那些不易用传统方法解决的问题,譬如表查找问题等。

遗传算法与直接搜索工具箱有一个精心设计的图形用户界面,可以帮助我们直观、方便、快速地求解最优化问题。

遗传算法在matlab中的实现

遗传算法是一种模拟自然选择与遗传机制的优化算法,它模拟了生物进化的过程,通过优化个体的基因型来达到解决问题的目的。

在工程和科学领域,遗传算法被广泛应用于求解优化问题、寻找最优解、参数优化等领域。

而MATLAB作为一款强大的科学计算软件,拥有丰富的工具箱和编程接口,为实现遗传算法提供了便利。

下面将通过以下步骤介绍如何在MATLAB中实现遗传算法:1. 引入遗传算法工具箱需要在MATLAB环境中引入遗传算法工具箱。

在MATLAB命令窗口输入"ver",可以查看当前已安装的工具箱。

如果遗传算法工具箱未安装,可以使用MATLAB提供的工具箱管理界面进行安装。

2. 定义优化问题在实现遗传算法前,需要清楚地定义优化问题:包括问题的目标函数、约束条件等。

在MATLAB中,可以通过定义一个函数来表示目标函数,并且可以采用匿名函数的形式来灵活定义。

对于约束条件,也需要进行明确定义,以便在遗传算法中进行约束处理。

3. 设置遗传算法参数在实现遗传算法时,需要对遗传算法的参数进行设置,包括种群大小、交叉概率、变异概率、迭代次数等。

这些参数的设置将会直接影响遗传算法的收敛速度和优化效果。

在MATLAB中,可以通过设置遗传算法工具箱中的相关函数来完成参数的设置。

4. 编写遗传算法主程序编写遗传算法的主程序,主要包括对适应度函数的计算、选择、交叉、变异等操作。

在MATLAB中,可以利用遗传算法工具箱提供的相关函数来实现这些操作,简化了遗传算法的实现过程。

5. 运行遗传算法将编写好的遗传算法主程序在MATLAB环境中运行,并观察优化结果。

在运行过程中,可以对结果进行实时监测和分析,以便对遗传算法的参数进行调整和优化。

通过以上步骤,可以在MATLAB中实现遗传算法,并应用于实际的优化问题与工程应用中。

遗传算法的实现将大大提高问题的求解效率与精度,为工程领域带来更多的便利与可能性。

总结:遗传算法在MATLAB中的实现涉及到了引入遗传算法工具箱、定义优化问题、设置算法参数、编写主程序和运行算法等步骤。

(完整版)遗传算法matlab实现源程序

附页:一.遗传算法源程序:clc; clear;population;%评价目标函数值for uim=1:popsizevector=population(uim,:);obj(uim)=hanshu(hromlength,vector,phen);end%obj%min(obj)clear uim;objmin=min(obj);for sequ=1:popsizeif obj(sequ)==objminopti=population(sequ,:);endendclear sequ;fmax=22000;%==for gen=1:maxgen%选择操作%将求最小值的函数转化为适应度函数for indivi=1:popsizeobj1(indivi)=1/obj(indivi);endclear indivi;%适应度函数累加总合total=0;for indivi=1:popsizetotal=total+obj1(indivi);endclear indivi;%每条染色体被选中的几率for indivi=1:popsizefitness1(indivi)=obj1(indivi)/total;endclear indivi;%各条染色体被选中的范围for indivi=1:popsizefitness(indivi)=0;for j=1:indivifitness(indivi)=fitness(indivi)+fitness1(j);endendclear j;fitness;%选择适应度高的个体for ranseti=1:popsizeran=rand;while (ran>1||ran<0)ran=rand;endran;if ran〈=fitness(1)newpopulation(ranseti,:)=population(1,:);elsefor fet=2:popsizeif (ran〉fitness(fet—1))&&(ran<=fitness(fet))newpopulation(ranseti,:)=population(fet,:);endendendendclear ran;newpopulation;%交叉for int=1:2:popsize-1popmoth=newpopulation(int,:);popfath=newpopulation(int+1,:);popcross(int,:)=popmoth;popcross(int+1,:)=popfath;randnum=rand;if(randnum〈 P>cpoint1=round(rand*hromlength);cpoint2=round(rand*hromlength);while (cpoint2==cpoint1)cpoint2=round(rand*hromlength);endif cpoint1>cpoint2tem=cpoint1;cpoint1=cpoint2;cpoint2=tem;endcpoint1;cpoint2;for term=cpoint1+1:cpoint2for ss=1:hromlengthif popcross(int,ss)==popfath(term)tem1=popcross(int,ss);popcross(int,ss)=popcross(int,term);popcross(int,term)=tem1;endendclear tem1;endfor term=cpoint1+1:cpoint2for ss=1:hromlengthif popcross(int+1,ss)==popmoth(term)tem1=popcross(int+1,ss);popcross(int+1,ss)=popcross(int+1,term);popcross(int+1,term)=tem1;endendclear tem1;endendclear term;endclear randnum;popcross;%变异操作newpop=popcross;for int=1:popsizerandnum=rand;if randnumcpoint12=round(rand*hromlength);cpoint22=round(rand*hromlength);if (cpoint12==0)cpoint12=1;endif (cpoint22==0)cpoint22=1;endwhile (cpoint22==cpoint12)cpoint22=round(rand*hromlength);if cpoint22==0;cpoint22=1;endendtemp=newpop(int,cpoint12);newpop(int,cpoint12)=newpop(int,cpoint22);newpop(int,cpoint22)=temp;。

遗传算法的Matlab实现讲解

x(i)=decodechrom(bestindividual,1,chromlength)*10/(2^chromlength-1); %最佳个体解码 y(i)=bestfit+Cmin; %最佳个体适应度
y_mean(i)=mean(fitvalue+Cmin); %第i代平均适应度
pop=newpop; end fplot('2*x+10*sin(5*x)+7*cos(4*x)',[0 10]) hold on plot(x,y,'r*') hold off
temp1=decodechrom(pop,1,chromlength); %将pop每行转化成十进制数
x=temp1*(Xmax-Xmin)/(2^chromlength-1); %将十进制域 中的数转化为变 量域 的数 objvalue=2*x+10*sin(5*x)+7*cos(4*x); %计算目标函数值
Matlab编程实现GA
计算目标函数值
计算目标函数值 % calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示 例仿真,可根据不同优化问题予以修改。 %遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算 function [objvalue]=calobjvalue(pop,chromlength,Xmax,Xmin)
bestindividual=pop(1,:);
bestfit=fitvalue(1); for i=2:px
if fitvalue(i)>bestfit
bestindividual=pop(i,:); bestfit=fitvalue(i);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法是对达尔文生物进化理论的简单模拟,其遵循“适者生存”、“优胜略汰”的原理。

遗传算法模拟一个人工种群的进化过程,并且通过选择、杂交以及变异等机制,种群经过若干代以后,总是达到最优(或近最优)的状态。

自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。

遗传算法也是当前“软计算”领域的重要研究课题。

本文首先结合MATLAB对遗传算法实现过程进行详细的分析,然后通过1个实际的函数优化案例对其应用进行探讨。

1. 遗传算法实现过程
现实生活中很多问题都可以转换为函数优化问题,所以本文将以函数优化问题作为背景,对GA的实现过程进行探讨。

大部分函数优化问题都可以写成求最大值或者最小值的形式,为了不是一般性,我们可以将所有求最优值的情况都转换成求最大值的形式,例如,求函数f(x)的最大值,
若是求函数f(x)的最小值,可以将其转换成
g(x)=-f(x),然后求g(x)的最大值,
这里x可以是一个变量,也可是是一个由k个变量组成的向量,x=(x1, x2, …, x k)。

每个x i,i=1,2,…,k, 其定义域为D i,D i=[a i, b i]。

一般规定f(x)在其定义域内只取正值,若不满足,可以将其转换成以下形式,
其中C是一个正常数。

1.1 编码与解码
要实现遗传算法首先需要弄清楚如何对求解问题进行编码和解码。

对于函数优化问题,一般来说,有两种编码方式,一是实数编码,一是二进制编码,两者各有优缺点,二进制编码具有稳定性高、种群多样性大等优点,但是需要的存储空间大,需要解码过程并且难以理解;而实数编码直接用实数表示基因,容易理解并且不要解码过程,但是容易过早收敛,从而陷入局部最优。

本文以最常用的二进制编码为例,说明遗传编码的过程。

从遗传算法求解的过程来看,需要处理好两个空间的问题,一个是编码空间,另一个是解空间,如下图所示
从解空间到编码空间的映射过程成为编码过程;从编码空间到解空间的映射过程成为解码过程。

下面就以求解一个简单的一维函数f(x) = -(x-1)^2+4, x的取值范围为[-1,3]最大值为例,来说明编码及解码过程。

编码:
在编码之前需要确定求解的精度,在这里,我们设定求解的精度为小数点后四位,即1e-4。

这样可以将每个自变量x i的解空间划分为个等分。

以上面这个函数为例,即可以将x的解空间划分为
(3-(-1))*1e+4=40000个等分。

使n i满足
,这里n i表示使上式成立的最小整数,即表示自变量x i的基因串的长度。

因为215<40000<216,这里n i取16。

例如0000110110000101就表示一个解空间中的基因串。

表示所有自变量x=(x1, x2, …, x k)的二进制串的总长度称为一个染色体(Chromosome)的
长度或者一个个体(Individual)的长度,。

编码过程一般在实现遗传算法之前需要指定。

解码:
解码即将编码空间中的基因串翻译成解空间中的自变量的实际值的过程。

对于二进制编码而言,每个二进制基因串都可以这样翻译成一个十进制实数值,。

例如基因串0000110110000101,可以翻译为
,这里二进制基因串转变成十进制是从左至右进行的。

1.2 初始化种群
在开始遗传算法迭代过程之前,需要对种群进行初始化。

设种群大小为pop_size,每个染色体或个体的长度为chromo_size,种群的大小决定了种群的多样性,而染色体的长度则是由前述的编码过程决定的。

一般随机生成初始种群,但是如果知道种群的实际分布,也可以按照此分布来生成初始种群。

假设生成的初始种群为(v1, v2, …, v pop_size)。

1.3 选择操作
选择操作即从前代种群中选择个体到下一代种群的过程。

一般根据个体适应度的分布来选择个体。

以初始种群(v1, v2, …, v pop_size)为例,假设每个个体的适应度为(fitness(v1), fitness(v2),…,
fitness(v pop_size)),一般适应度可以按照解码的过程进行计算。

以轮盘赌的方式选择个体,如下图
随机转动一下轮盘,当轮盘停止转动时,若指针指向某个个体,则该个体被选中。

很明显,具有较高适应度的个体比具有较低适应度的个体更有机会被选中。

但是这种选择具有随机性,在选择的过程中可能会丢失掉比较好的个体,所以可以使用精英机制,将前代最优个体直接选到下一代中。

轮盘赌选择具体算法如下(这里假定种群中个体是按照适应度从小到大进行排列的,如果不是,可以按照某种排序算法对种群个体进行重排):
Selection Algorithm
var pop, pop_new;/*pop为前代种群,pop_new为下一代种群*/。

相关文档
最新文档