用Matlab实现遗传算法.docx
《用Matlab实现遗传算法.docx》由会员分享,可在线阅读,更多相关《用Matlab实现遗传算法.docx(12页珍藏版)》请在冰豆网上搜索。
![用Matlab实现遗传算法.docx](https://file1.bdocx.com/fileroot1/2022-12/30/c467546f-20ed-40a7-a0e8-67d33f2d1278/c467546f-20ed-40a7-a0e8-67d33f2d12781.gif)
用Matlab实现遗传算法
用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的用法。
x=ga(problem)
在problem下找到最小值,problem是包含下表的结构。
fitnessfcn
Fitnessfunction适应度函数
nvars
Numberofdesignvariables设计变量的数目
Aineq
Amatrixforlinearinequalityconstraints
线性不等式约束矩阵
Bineq
bvectorforlinearinequalityconstraints
线性不等式约束向量
Aeq
Amatrixforlinearequalityconstraints
线性等式约束矩阵
Beq
bvectorforlinearequalityconstraints
线性等式约束向量
lb
Lowerboundonx最小边界
ub
Upperboundonx最大边界
nonlcon
Nonlinearconstraintfunction非线性约束函数
randstate
Optionalfieldtoresetrandstate
重新设置均匀分布状态选项栏
randnstate
Optionalfieldtoresetrandnstate
重新设置正态分布状态选项栏
solver
'ga'
options
Optionsstructurecreatedusinggaoptimset
正如在使用者向导的优化工具ImportingandExportingYourWork描述的一样,它依靠从优化工具导出一个问题来创建结构问题。
[x,fval]=ga(...)
在x下,返回适应度函数的值fval。
[x,fval,exitflag]=ga(...)
返回exitflag(终止条件值),整体识别算法的终止条件,下面列出了exitflag的值和算法相应的终止条件。
∙1—Averagecumulativechangeinvalueofthefitnessfunctionoveroptions.StallGenLimitgenerationslessthanoptions.TolFunandconstraintviolationlessthanoptions.TolCon.
∙2—Fitnesslimitreachedandconstraintviolationlessthanoptions.TolCon.
∙3—Thevalueofthefitnessfunctiondidnotchangeinoptions.StallGenLimitgenerationsandconstraintviolationlessthanoptions.TolCon.
∙4—Magnitudeofstepsmallerthanmachineprecisionandconstraintviolationlessthanoptions.TolCon.
∙0—Maximumnumberofgenerationsexceeded.
∙-1—Optimizationterminatedbytheoutputorplotfunction.
∙-2—Nofeasiblepointfound.
∙-4—Stalltimelimitexceeded.
∙-5—Timelimitexceeded.
[x,fval,exitflag,output]=ga(...)
返回output的值,它是一个包含了每一代的输出和关于算法的其他性能信息,它的结构包括下面的范围。
∙randstate—Thestateofrand,theMATLABrandomnumbergenerator,justbeforethealgorithmstarted.
∙randnstate—ThestateofrandntheMATLABnormalrandomnumbergenerator,justbeforethealgorithmstarted.Youcanusethevaluesofrandstateandrandnstatetoreproducetheoutputofga.SeeReproducingYourResults.
∙generations—Thenumberofgenerationscomputed.
∙funccount—Thenumberofevaluationsofthefitnessfunction
∙message—Thereasonthealgorithmterminated.
∙maxconstraint—Maximumconstraintviolation,ifany.
[x,fval,exitflag,output,population]=ga(...)
返回population的矩阵,它的行是最后一代。
[x,fval,exitflag,output,population,scores]=ga(...)
返回最后一代的scores的值。
注意:
(默认下)对于族群类型使用DoubleVector的问题,GA不会接受任何那些输入类型复杂的函数。
为了解决复杂数据所涉及的问题,靠分开你的实部和虚部,写下你的函数使他们接收实向量。
例子:
根据软件提供的lincontest6(一个二元二次目标函数,此处即是适应度函数),上述程序找到了函数的最小值。
终止条件为:
适应度值得平均变化小于选项TolFun。
A=[11;-12;21];
b=[2;2;3];
lb=zeros(2,1);
[x,fval,exitflag]=ga(@lincontest6,2,A,b,[],[],lb)
Optimizationterminated:
averagechangeinthefitnessvaluelessthanoptions.TolFun.
x=
0.77941.2205
fval=
-8.03916(适应度函数的值)
exitflag=
1(终止条件值)
求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
f=inline('-(x+10*sin(5*x)+7*cos(4*x))');
[x,fval]=ga(f,1,[],[],[],[],0,9);
x,fval=-fval
(1)Optimizationterminated:
averagechangeinthefitnessvaluelessthanoptions.TolFun.
x=
1.5735
fval=
18.5722
(2)Optimizationterminated:
averagechangeinthefitnessvaluelessthanoptions.TolFun.
x=
0.2272
fval=
13.5996
注:
由于遗传法的不确定性,每次得到的解可能不同。
ga是matlab自带的遗传工具箱中的遗传算法函数,其中已经用到了选择、交叉、变异,你如果想知道其具体是怎么实现的,可以自己打开ga的源程序去看。
遗传算法的MATLAB程序之option设置研究:
functionmy_ga()
options=gaoptimset;
%设置变量范围
options=gaoptimset(options,'PopInitRange',[0;9]);
%设置种群大小
options=gaoptimset(options,'PopulationSize',100);
%设置迭代次数
options=gaoptimset(options,'Generations',100);
%选择选择函数
options=gaoptimset(options,'SelectionFcn',@selectionroulette);
%选择交叉函数
options=gaoptimset(options,'CrossoverFcn',@crossoverarithmetic);
%选择变异函数
options=gaoptimset(options,'MutationFcn',@mutationuniform);
%设置绘图:
解的变化、种群平均值的变化
options=gaoptimset(options,'PlotFcns',{@gaplotbestf});
%执行遗传算法,fitness.m是函数文件
[x,fval]=ga(@fitness,1,options)
例子:
A=[11;-12;21];b=[2;2;3];lb=zeros(2,1);
%Usemutationfunctionwhichcanhandleconstraints
options=gaoptimset('MutationFcn',@mutationadaptfeasible);
[x,fval,exitflag]=ga(@lincontest6,2,A,b,[],[],lb,[],[],options);
Optimizationterminated:
averagechangeinthefitnessvaluelessthanoptions.TolFun.
x,fval=fval
x=
0.70431.2967
fval=
-8.1725
注意:
由于GA是一个概率过程,所以每次迭代的情况是不一样的;系统参数不同,迭代情况也不同。
在实验中参数一般选取如下:
个体数n=50-200,变异概率Pm=0.03,交叉概率Pc=0.6。
变异概率太大,会导致不稳定。
求matlab编的遗传算法源程序,用于求解带约束的优化问题。
要源程序啊,不要使用matlab工具箱的。
对于初学者,尤其是还没有编程经验的非常有用的一个文件
遗传算法实例
%下面举例说明遗传算法%
%求下列函数的最大值%
%f(x)=10*sin(5x)+7*cos(4x)x∈[0,10]%
%将x的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。
%
%将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023,其中b是[0,1023]中的一个二值数。
%
%%
%--------------------------------------------------------------------------------------------------------------%
%--------------------------------------------------------------------------------------------------------------%
%编程
%-----------------------------------------------
%2.1初始化(编码)
%initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),
%长度大小取决于变量的二进制编码的长度(在本例中取10位)。
%遗传算法子程序
%Name:
initpop.m
%初始化
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));%rand随机产生每个单元为{0,1}行数为popsize,列数为chromlength的矩阵,
%roud对矩阵的每个单元进行圆整。
这样产生的初始种群。
%2.2计算目标函数值
%2.2.1将二进制数转化为十进制数
(1)
%遗传算法子程序
%Name:
decodebinary.m
%产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为十进制
functionpop2=decodebinary(pop)
[px,py]=size(pop);%求pop行和列数
fori=1:
py
pop1(:
i)=2.^(py-i).*pop(:
i);
end
pop2=sum(pop1,2);%求pop1的每行之和
%2.2.2将二进制编码转化为十进制数
(2)
%decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
%(对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。
本例为1),
%参数1ength表示所截取的长度(本例为10)。
%遗传算法子程序
%Name:
decodechrom.m
%将二进制编码转换成十进制
functionpop2=decodechrom(pop,spoint,length)
pop1=pop(:
spoint:
spoint+length-1);
pop2=decodebinary(pop1);
%2.2.3计算目标函数值
%calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。
%遗传算法子程序
%Name:
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);%计算目标函数值
%2.3计算个体的适应值
%遗传算法子程序
%Name:
calfitvalue.m
%计算个体的适应值
functionfitvalue=calfitvalue(objvalue)
globalCmin;
Cmin=0;
[px,py]=size(objvalue);
fori=1:
px
ifobjvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
%2.4选择复制
%选择或复制操作是决定哪些个体可以进入下一代。
程序中采用赌轮盘选择法选择,这种方法较易实现。
%根据方程pi=fi/∑fi=fi/fsum,选择步骤:
%1)在第t代,由
(1)式计算fsum和pi
%2)产生{0,1}的随机数rand(.),求s=rand(.)*fsum
%3)求∑fi≥s中最小的k,则第k个个体被选中
%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1代种群
%遗传算法子程序
%Name:
selection.m
%选择复制
function[newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue);%求适应值之和
fitvalue=fitvalue/totalfit;%单个个体被选择的概率
fitvalue=cumsum(fitvalue);%如fitvalue=[1234],则cumsum(fitvalue)=[13610]
[px,py]=size(pop);
ms=sort(rand(px,1));%从小到大排列
fitin=1;
newin=1;
whilenewin<=px
if(ms(newin))newpop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end
%2.5交叉
%交叉(crossover),群体中的每个个体之间都以一定的概率pc交叉,即两个个体从各自字符串的某一位置
%(一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。
例如,假设2个父代个体x1,x2为:
%x1=0100110
%x2=1010001
%从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
%y1=0100001
%y2=1010110
%这样2个子代个体就分别具有了2个父代个体的某些特征。
利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
%事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name:
crossover.m
%交叉
function[newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop=ones(size(pop));
fori=1:
2:
px-1
if(randcpoint=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)];
else
newpop(i,:
)=pop(i);
newpop(i+1,:
)=pop(i+1);
end
end
%2.6变异
%变异(mutation),基因的突变普遍存在于生物的进化过程中。
变异是指父代中的每个个体的每一位都以概率pm翻转,即由“1”变为“0”,
%或由“0”变为“1”。
遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。
%遗传算法子程序
%Name:
mutation.m
%变异
function[newpop]=mutation(pop,pm)
[px,py]=size(pop);
newpop=ones(size(pop));
fori=1:
px
if(randmpoint=round(rand*py);
ifmpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
ifany(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
else
newpop(i)=pop(i);
end
end
%2.7求出群体中最大得适应值及其个体
%遗传算法子程序
%Name:
best.m
%求出群体中适应值最大的值
function[bestindividual,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindividual=pop(1,:
);
bestfit=fitvalue
(1);
fori=2:
px
iffitvalue(i)>bestfit
bestindividual=pop(i,:
);
bestfit=fitvalue(i);
end
end
%2.8主程序
%遗传算法主程序
%Name:
genmain05.m
clear
clf
popsize=20;%群体大小
chromlength=10;%字符串长度(个体长度)
pc=0.6;%交叉概率
pm=0.001;%变异概率
pop=initpop(popsize,chromlength);%随机产生初始群体
fori=1:
20%20为迭代次数
[objvalue]=calobjvalue(pop);%计算目标函数
fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue);%复制
[newpop]=crossover(pop,pc);%交叉
[newpop]=mutation(pop,pc);%变异
[bestindividual,bestfit]=best(pop,fitvalue);%求出群体中适应值最大的个体及其适应值
y(i)=max(bestfit);
n(i)=i;
pop5=bestindividual;
x(i)