用Matlab实现遗传算法.docx

上传人:b****6 文档编号:5735405 上传时间:2022-12-31 格式:DOCX 页数:12 大小:22.65KB
下载 相关 举报
用Matlab实现遗传算法.docx_第1页
第1页 / 共12页
用Matlab实现遗传算法.docx_第2页
第2页 / 共12页
用Matlab实现遗传算法.docx_第3页
第3页 / 共12页
用Matlab实现遗传算法.docx_第4页
第4页 / 共12页
用Matlab实现遗传算法.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

用Matlab实现遗传算法.docx

《用Matlab实现遗传算法.docx》由会员分享,可在线阅读,更多相关《用Matlab实现遗传算法.docx(12页珍藏版)》请在冰豆网上搜索。

用Matlab实现遗传算法.docx

用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(rand

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)];

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(rand

mpoint=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)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1