遗传算法GA的MATLAB代码
- 格式:doc
- 大小:28.50 KB
- 文档页数:3
GA(遗传算法)的Matlab程序原理(转载于六分之一工作室)z=f(x,y)1、编码(解决初始化种群),先创建一个数组pop(popsize stringlenth)有popsize表示染色体个数列stringlenth的前一部分代表x的染色体,后一部分代表y的染色体。
计算x,y 染色体对所对应的十进制数值并记数组pop的第stringlenth+1,stringlenth+2列,计算f(x,y)的值并计为数组pop的第stringlenth+3列,计算每个染色体的复制概率并计为数组pop 的第stringlenth+4列function[pop1 f d pe stringlenth]=initialize(popsize stringlenth pop),pop=round(rand(popsize stringlenth)),pop(.stringlenth+1=((2.^(size(pop(.1.stringlenth1).2)-1.-1.0)*pop(.1.stringlenth)).*( )/(2.^stri nglenth1-1)+ ),pop(.stringlenth+3)=fun(pop(.stringlenth+1)pop(.stringlenth+2)),pop(.stringlenth+4)=pop(.stringlenth+4)=pop(.stringlenth+3)./sum(pop(.stringlenth+3)),其中fun(x)为目标函数的matlab.m文件.2、确保复制过程中染色体个数保持不变的情况下确定每个染色体复制数,如果是某一染色体的复制数为负数,则令此染色体的复制数为0,复制概率为止的染色体的复制数根据其占正值总体的比率来确定,复制数=比率popsizepop(.stringlenth+5)=round(pop. Stringlenth+4).*popsize),A=sort(pop(.stringlenth+5)),b=sum(A((11-a).10),(其中a为复制概率为正值的染色体个数)pop(.stringlenth+6)=round(pop(.stringlenth+5)./b).*popsize).pop(.stringlenth+6)表示每个染色体复制数.3、染色体复制数,根据每个染色体的复制数重新创建新的染色体数组pop1function[parent1 parent2 stringlenth]=parent(f d pop stringlenth),Ci=repmat(pop(i 1. stringlenth)[pop(i stringlenth+6)1 1]).(i=1 2 …popsize)pop1=[C1] [C2] … [Cpopsize],pop1=round([C1] [C2] … [Cpopsize]).每个初始染色体按其复制数进行复制.4、选择父代进行父叉,在数组pop1中随机地使各染色体两两配对,作为父代进行父叉,创建新的数组child1和child2父叉点cpoint随机选取父叉概率pc根据实际情况人为选取function[child1 child2 pm parent stringlenth]=crossover(parent1 parent2 pc stringlenth ),f=round(9*rand(1.10))+1,d=[1 2 3 4 5 6 7 8 9 10],parent1=pop1(f.),parent2=pop1(d.),if(randcpoint=round(rand*(stringlenth-2))+1,child1=[parent1(.1.cpoint)][parent2(.cpoint+1. stringlenth)],child2=[parent2(.1.cpoint)][parent1(.cpoint+1. stringlenth)],elsechild1=parent1,child2=parent2.5、染色体变异随机选取染色体中某一个或几个基因进行变异创建新的数组child作为父代function[child]=mutation(parent pm),parent=child,if(randmpoint=round(rand*(stringlenth-1))+1,child=parent,child(.mpoint)=abs(parent(.mpoint)-1),elsechild=parent,end6、保留上一代的优良染色体作为部分初始值和随机染色体组成新的染色体组function[pop2 m W]=best(child child1 child2 pop),Q1=child(.stringlenth+3),for i=1.10if(Q1(i)>(max(Q1)-0.0001))q1=i,endendW=round(9.*rand(1 4)+1,pop2(W 1. stringlenth+3)=[child(q1.)child(q2.).child2(q3.).pop(q4 1. stringlenth+3)],m=max([max(Q1)max(Q2)max(Q3)max(Q4)]),end其中m为最好染色体值,循环执行上述程序即可关于2元约束问题先根据约束力方程求解2元函数fun1(x)再只需要将单约束程序中的y的下限b2换成fun1(x)即可,因为这样能限制当x取值后y的取值。
matlabga例子【篇一:matlabga例子】x = ga(fitnessfcn,nvars,a,b,aeq,beq)termfn,termops,selectfn,selectops,xoverfns,xoverops,mutfns, mutops)--遗传算法函数【输出参数】x--求得的最优解endpop--最终得到的种群bpop--最优种群的一个搜索轨迹【输入参数】bounds--代表变量上下界的矩阵evalfn--适应度函数evalops--传递给适应度函数的参数startpop-初始种群opts[epsilonprob_opsdisplay]--opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。
如[1e-610] termfn--终止函数的名称,如[maxgenterm]termops--传递个终止函数的参数,如[100]selectfn--选择函数的名称,如[normgeomselect]selectops--传递个选择函数的参数,如[0.08]xoverfns--交叉函数名称表,以空格分开,如[arithxoverheuristicxoversimplexover]xoverops--传递给交叉函数的参数表,如[20;23;20]mutfns--变异函数表,如[boundarymutationmultinonunifmutationnonunifmutationunifm utation]mutops--传递给交叉函数的参数表,如[400;61003;41003;400]【注意】matlab工具箱函数必须放在工作目录下【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0 =x =9【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08【程序清单】%编写目标函数。
用MATLAB实现遗传算法程序一、本文概述遗传算法(Genetic Algorithms,GA)是一种模拟自然界生物进化过程的优化搜索算法,它通过模拟自然选择和遗传学机制,如选择、交叉、变异等,来寻找问题的最优解。
由于其全局搜索能力强、鲁棒性好以及易于实现并行化等优点,遗传算法在多个领域得到了广泛的应用,包括函数优化、机器学习、神经网络训练、组合优化等。
本文旨在介绍如何使用MATLAB实现遗传算法程序。
MATLAB作为一种强大的数学计算和编程工具,具有直观易用的图形界面和丰富的函数库,非常适合用于遗传算法的实现。
我们将从基本的遗传算法原理出发,逐步介绍如何在MATLAB中编写遗传算法程序,包括如何定义问题、编码、初始化种群、选择操作、交叉操作和变异操作等。
通过本文的学习,读者将能够掌握遗传算法的基本原理和MATLAB编程技巧,学会如何使用MATLAB实现遗传算法程序,并能够在实际问题中应用遗传算法求解最优解。
二、遗传算法基础遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传学机制的优化搜索算法。
它借鉴了生物进化中的遗传、交叉、变异等机制,通过模拟这些自然过程来寻找问题的最优解。
遗传算法的核心思想是将问题的解表示为“染色体”,即一组编码,然后通过模拟自然选择、交叉和变异等过程,逐步迭代搜索出最优解。
在遗传算法中,通常将问题的解表示为一个二进制字符串,每个字符串代表一个个体(Individual)。
每个个体都有一定的适应度(Fitness),适应度越高的个体在下一代中生存下来的概率越大。
通过选择(Selection)、交叉(Crossover)和变异(Mutation)等操作,生成新一代的个体,并重复这一过程,直到找到满足条件的最优解或达到预定的迭代次数。
选择操作是根据个体的适应度,选择出适应度较高的个体作为父母,参与下一代的生成。
常见的选择算法有轮盘赌选择(Roulette Wheel Selection)、锦标赛选择(Tournament Selection)等。
matlab遗传算法代码
1 、算法概述
遗传算法(Genetic Algorithms,GA)是一种仿生学优化算法,它借用遗传学中物
竞天择的进化规则,模拟“自然选择”与“遗传进化”得出选择最优解的过程。
其基本原
理是对现有的种群中的各个个体,将其表示成某种形式的编码,然后根据自变量与约束条件,利用杂交、变异等操作,产生新一代解的种群,不断重复这一过程,最终求出收敛到
最优解的种群。
2、遗传算法的作用
遗传算法的主要作用在于优化多元函数,能够在大量的变量影响目标函数值的情况下
寻求最优解。
和其它现有的数值优化技术比较,如梯度下降法等,遗传算法更能适应“凸”和“非凸”都能解决,不受约束条件与搜索空间的影响较大,又叫做“智能搜索法”。
在
计算机视觉等计算机技术领域,经常用遗传算法来对一系列特征参数进行搜索和调节,成
功优化提高了系统的正确处理率。
3、matlab遗传算法的实现
Matlab的遗传算法应用是基于GA Toolbox工具箱,它提供了一个功能强大的、可扩
展的包装器,可用于构建遗传算法模型。
(1)编写最优化函数:
使用和设置最优化表达式或函数、变量;
(2)设置参数编码:
设置变量的编码,比如选择0-1二进制、0-10十进制;
(3)选择遗传算法的方法
选择遗传算法的方法,可以在多个选择中选择,比如变异、杂交等;
(4)设置运算参数:
设置每代的种群数、最大进化的世代数;
(5)运行遗传算法:
根据设定的参数运行遗传算法,算出收敛到最优解的种群;
(6)获得最优解:
获得收敛到最优解的条件下的最优解,得出最优解所在位置等参数,完成整个优化搜索。
Matlab遗传算法,ga函数的应用:%%% omiga : N*1 %目标是求omiga%%function [x,fval,exitflag] = track_error_optmizationload .\DD.matNs = size(RpI);N = Ns(1);T = Ns(2);%x0 = 0.1*rand(1,1)*ones(T,1); %%%%% ???????alpha = zeros(T,1);beta = 1*ones(T,1);A = [];b = [];pars = ones(1,T); % 1*NAeq = pars;beq = 1;%beq = ones(T,1);%Aeq = [];%beq = [];lb = alpha;ub = beta;% [x,fval,exitflag,output,lambda,grad,hessian] =fmincon(@track_error_optmization_obj, x0, A, b, Aeq, beq, lb, ub);options = gaoptimset;%设置变量范围options=gaoptimset(options,'PopInitRange',[alpha,beta]');%设置种群大小options=gaoptimset(options,'PopulationSize',100);%设置迭代次数options=gaoptimset(options,'Generations',100);%设置绘图:解的变化、种群平均值的变化¯%options=gaoptimset(options,'PlotFcns',{@gaplotbestf});%执行遗传算法,fitness.m是函数文件% [x,fval]=ga(@track_error_optmization_obj,2,options)[x,fval,exitflag] = ga(@track_error_optmization_obj, T, A, b, Aeq, beq, lb, ub, @weightcon, options);%下面是目标函数方程function res = track_error_optmization_obj(omiga)load .\DD.matNs = size(RpI);N = Ns(1);T = Ns(2);R_IT = RII; %%%%% ???????R_it = RpI; %%%%% ???????disp(omiga)% res = sqrt( sum( (R_IT - sum( R_it * omiga)).^2 ) )/T;% % res = sqrt( sum( abs( (R_IT - sum( R_it * omiga)) ) ) )/T;TE = 0;for n = 1:Nwr = 0;for t = 1:Twr = wr + omiga(t) * R_it(n,t);endrwr = R_IT(n) - wr;rwr = rwr*rwr;%rwr = abs(rwr);TE = TE + rwr;endres = sqrt(TE)/T;%下面是有关非线性变量限制矩阵设置,详见ga函数matlab2009afunction [c, ce] = weightcon(omiga)c = [];ce = [];。
遗传算法函数ga用法matlab 遗传算法工具箱函数gamatlab 遗传算法工具箱函数及实例讲解核心函数:(1)function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)-- 初始种群的生成函数【输出参数】pop--生成的初始种群【输入参数】num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options-- 选择编码形式( 浮点编码或是二进制编码)[precisionF_or_B],如precision--变量进行二进制编码时指定的精度F_or_B--为1 时选择浮点编码,否则为二进制编码,由precision指定精度)(2)function[x,endPop,bPop,traceInfo]=ga(bounds,evalFN,ev alOps,startPop,opts,...termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFN s,mutOps)--遗传算法函数【输出参数】x--求得的最优解endPop--最终得到的种群bPop--最优种群的一个搜索轨迹【输入参数】bounds--代表变量上下界的矩阵evalFN--适应度函数evalOps--传递给适应度函数的参数startPop-初始种群opts[epsilon prob_ops display]--opts(1:2)等同于initializega 的options 参数,第三个参数控制是否输出,一般为0。
如[1e-6 1 0]termFN--终止函数的名称,如['maxGenTerm']termOps--传递个终止函数的参数,如[100]selectFN--选择函数的名称,如['normGeomSelect']selectOps--传递个选择函数的参数,如[0.08]xOverFNs-- 交叉函数名称表,以空格分开,如['arithXover heuristicXoversimpleXover'] xOverOps--传递给交叉函数的参数表,如[2 0;2 3;2 0]mutFNs-- 变异函数表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation'] mutOps--传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0]注意】matlab 工具箱函数必须放在工作目录下运算借过为:x =同的初始群体)一定可以得到近似最优解。
遗传算法matlab程序代码
遗传算法(GA)是一种用于求解优化问题的算法,其主要思想是模拟
生物进化过程中的“选择、交叉、变异”操作,通过模拟这些操作,来寻
找最优解。
Matlab自带了GA算法工具箱,可以直接调用来实现遗传算法。
以下是遗传算法Matlab程序代码示例:
1.初始化
首先定义GA需要优化的目标函数f,以及GA算法的相关参数,如种
群大小、迭代次数、交叉概率、变异概率等,如下所示:
options = gaoptimset('PopulationSize',10,...
'Generations',50,...
2.运行遗传算法
运行GA算法时,需要调用MATLAB自带的ga函数,将目标函数、问
题的维度、上下界、约束条件和算法相关参数作为输入参数。
其中,上下
界和约束条件用于限制空间,防止到无效解。
代码如下:
[某,fval,reason,output,population] = ga(f,2,[],[],[],[],[-10,-10],[10,10],[],options);
3.结果分析
最后,将结果可视化并输出,可以使用Matlab的plot函数绘制出目
标函数的值随迭代次数的变化,如下所示:
plot(output.generations,output.bestf)
某label('Generation')
ylabel('Best function value')
总之,Matlab提供了方便易用的GA算法工具箱,开发者只需要根据具体问题定义好目标函数和相关参数,就能够在短时间内快速实现遗传算法。
用GA找到函数最小值x = ga(fitnessfcn,nvars)局部无约束最小值,x是目标函数的适应度函数,nvars是适应度函数的尺寸(设计变量的数量)。
目标函数和适应度函数接受了1×N大小的x矢量,在x返回一个标量的计算值。
x = ga(fitnessfcn,nvars,A,b)在线性不等式约束下,适应度函数的局部最小值。
如果这个问题有m个线性不等式和n个变量,则A是m×n矩阵,b是m×1矩阵。
注意:当人口类型选项设置为“位串”或者“自定义”,线性约束不满足。
x = ga(fitnessfcn,nvars,A,b,Aeq,beq)存在线性等式约束下,适应度函数的局部最小值。
如果没有不等式存在,设置A=[] 和 b=[]。
如果问题存在r个线性等式约束和n个变量,那么Aeq 是r ×n矩阵的大小,beq是r大小的矢量。
注意:当人口类型选项设置为“位串”或者“自定义”,线性约束不满足。
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB)定义了一系列设计变量x的最小和最大边界。
以至于在范围内找到一个解。
如果没有边界存在,LB 和 UB设置为空矩阵。
如果x(i)无下界,设置LB(i) = -Inf;如果x(i)无上界,设置UB(i) = Inf。
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon)服从在非线性约束条件下的最小值,非线性函数接收x,返回C和Ceq向量,分别代表非线性的不等式和等式。
GA最小化适应度函数,在C(x)≤0和Ceq(x)=0的条件下。
如果无边界存在,设置 LB=[] 和 UB=[]。
注意:当人口类型选项设置为“位串”或者“自定义”,非线性约束不满足。
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)用在结构选项中的值代替默认的优化参数来进行最小化,它也可以用gaoptimset函数来创建,具体参考gaoptimset的用法。
MATLAB实现算法代码:GA(遗传算法)——整数编码
function [BestGene,aa] = GA(MaxGeneration,GeneSize,GeneNum,pcross,pmute,minGene,maxGene)
Parent = Init(GeneSize,GeneNum,minGene,maxGene);
[BestGene,Parent] = KeepBest(Parent);
aa = [];
for i = 1:MaxGeneration
[i 1/value(BestGene)]
Child = chose(Parent);
Child = cross(Child,pcross);
Child = mute(Child,pmute,maxGene);
[BestGene,Parent] = KeepBest(Child);
aa = [aa;value(BestGene)];
end
function GeneInit = Init(GeneSize,GeneNum,minGene,maxGene)
GeneInit = [];
for i = 1:GeneSize
x = []; x = ceil(rand(1,GeneNum).*(maxGene-minGene)) + minGene;
GeneInit = [GeneInit;x];
end
GeneInit = [GeneInit;x];
function Child = chose(Parent)
GeneSize = size(Parent,1);
for i = 1:GeneSize
x = Parent(i,:);
val(i) = value(x);
end
ValSum = sum(val);
val = val / ValSum;
for i = 2:GeneSize
val(i) = val(i) + val(i-1);
end
for i = 1:GeneSize
randval = rand;
if randval <= val(1)
Child(i,:) = Parent(1,:);
end
for j = 2:GeneSize
if randval > val(j-1) && randval <= val(j)
Child(i,:) = Parent(j,:);
break;
end
end
end
Child(end,:) = Parent(end,:);
function Child = cross(Parent,pcross)
[GeneSize,GeneNum] = size(Parent);
GeneSize = GeneSize - 1;
Child = Parent;
for i = 1:GeneSize/2
if rand < pcross
flag = 0;
while( flag==0 )
randval1 = floor((GeneNum-1)*rand) + 1;
randval2 = floor((GeneNum-1)*rand) + 1;
if randval1 ~= randval2
flag = 1;
end
end
temp = Child(2*i-1,randval1:randval2);
Child(2*i-1,randval1:randval2) = Child(2*i,randval1:randval2);
Child(2*i,randval1:randval2) = temp;
end
end
function Child = mute(Parent,pmute,maxGene)
[GeneSize,GeneNum] = size(Parent);
GeneSize = GeneSize - 1;
Child = Parent;
for i = 1:GeneSize
if rand < pmute
randval = ceil((GeneNum-1)*rand) + 1;
Child(i,randval) = maxGene(randval) - Child(i,randval) + 1;
end
end
function [BestGene,Parent] = KeepBest(Child)
[GeneSize,GeneNum] = size(Child);
for i = 1:GeneSize
x = Child(i,:);
val(i) = value(x);
end
BigVal = val(1);
flag = 1;
for i = 2:GeneSize
if BigVal < val(i)
BigVal = val(i);
flag = i;
end
end
BestGene = Child(flag,:); Parent = Child;
Parent(1,:) = BestGene; Parent(end,:) = BestGene;。