您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 投融资/租赁 > 遗传算符MATLAB程序-入门必看
1/8%下面举例说明遗传算法%%求下列函数的最大值%%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]中的一个二值数。%M文件函数定义语句:function输出变量=函数名称(输入变量1,输入变量2,…)语句;%输入变量与输出变量的关系end;%非必须的例如:functionc=myadd(a,b)c=a+b;调用方式:c=myadd(1,2)%输出结果为c=a+b=1+2=3%2.1初始化(编码)%initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),%长度大小取决于变量的二进制编码的长度(在本例中取10位)。%遗传算法子程序%Name:initpop.m(实现群体的初始化)%初始化functionpop=initpop(popsize,chromlength)%定义M文件函数(实现种群初始化的函数)pop=round(rand(popsize,chromlength));%rand()随机产生函数。rand随机产生每个单元为{0,1}行数为popsize,列数为chromlength的矩阵,此式子为输出变量pop与输入变量popsize和chromlength的关系式。%round对矩阵的每个单元进行圆整,round函数的作用是按指定的位数对数值进行四舍五入。这样产生的初始种群。%r%2.2计算目标函数值%2.2.1将二进制数转化为十进制数(1)%遗传算法子程序%Name:decodebinary.m%产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为十进制functionpop2=decodebinary(pop)%定义M文件函数(将二进制数转化为十进制数的函数)[px,py]=size(pop);%求pop的行数和列数。px为种群数,染色体的长度为pyfori=1:pypop1(:,i)=2.^(py-i).*pop(:,i);%pop1(:,i)表示pop1矩阵的第i列全部元素endpop2=sum(pop1,2);%求pop1的每行之和%matlab中sum()函数的用法%a=sum(x);%对x矩阵的列求和a=sum(x,2);%对x矩阵的行求和a=sum(x(:));%x矩阵的所有元素求和%A(:,j)表示提取A矩阵的第j列全部元素A(i,:)表示提取A矩阵的第i行元素,A(i,j)表示提取A矩阵的第i行第j列的元素。2/8%2.2.2将二进制编码转化为十进制数(2)%decodechrom.m函数的功能是将染色体(或二进制编码)的特定位置转换为十进制,参数spoint表示待解码的二进制串的起始位置%(对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1),%参数1ength表示所截取的长度(本例为10)。%遗传算法子程序%Name:decodechrom.m(将染色体二进制编码转换成十进制)functionpop2=decodechrom(pop,spoint,length)%参数spoint表示待解码的二进制串的起始位置pop1=pop(:,spoint:spoint+length-1);%提取矩阵pop的第spoint到spoint+length-1列,形成一个新矩阵pop1。pop2=decodebinary(pop1);%解二进制码%2.2.3计算目标函数值%calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。%遗传算法子程序%Name:calobjvalue.m%实现目标函数的计算function[objvalue]=calobjvalue(pop)temp1=decodechrom(pop,1,10);%将pop每行转化成十进制数,1代表待解码的二进制串起始位置,10代表截取的长度x=temp1*10/1023;%将二值域中的数转化为变量域的数objvalue=10*sin(5*x)+7*cos(4*x);%计算目标函数值%2.3计算个体的适应值%遗传算法子程序%Name:calfitvalue.m%计算个体的适应值%A=[342;153;471]A=342153471A(1)=3;A(2)=1;A(3)=4;A(4)=4;A(5)=5%根据2.2.3计算出的目标函数值计算个体的适应值functionfitvalue=calfitvalue(objvalue)%定义函数globalCmin;%global表示全局Cmin=0;[px,py]=size(objvalue);%objvalue为列向量矩阵fori=1:pxifobjvalue(i)+Cmin0%objvalue(i)表示矩阵objvalue的第i个元素(从上往下数)temp=Cmin+objvalue(i);elsetemp=0.0;endfitvalue(i)=temp;%列向量矩阵fitvalue为px个循环中temp的值构成的。3/8endfitvalue=fitvalue';%运算符'表示向量的复共轭,最终的fitvalue为行向量矩阵%2.4选择复制其算法为:①设置选择算法执行次数j=0②在区间(0,totalFitness)内产生一随机数rands,totalFitness表示种群个体适应度之和③i=0,sum=0;其中i表示第i个个体,sum表示0~i的个体的适应度值之和④sum=sum+fitness(i),如果sumrands,转⑥;否则转⑤⑤i++,转④⑥返回第i个个体indivals[i]⑦j++,如果j=个体总数totalIndavial,选择操作结束,否则转①%选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。%根据方程pi=fi/∑fi=fi/fsum(fsum表示总概率和,一般设为1),选择步骤:%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%选择复制%A=[123;456]A=123456cumsum(A)ans=123579B=[123];cumsum(B)ans=136%rand(m,n)表示产生m*n矩阵,rand(m,n,p)表示产生p个m*n矩阵,rand(m,n,p,q)表示产生p*q个m*n矩阵%%function[newpop]=selection(pop,fitvalue)%定义选择函数,[]有没有都可。totalfit=sum(fitvalue);%求适应值之和fitvalue=fitvalue/totalfit;%适应值=单个个体被选择的概率fitvalue=cumsum(fitvalue);%fitvalue为行向量矩阵,cumsum(fitvalue)表示元素依次累加的新行矩阵。[px,py]=size(pop);%px为种群数,染色体的长度为pyms=sort(rand(px,1));%sort()从小到大排列。rand(px,1)是任意产生px个元素的行向量矩阵。i=1;j=1;whilej=px4/8if(ms(j))fitvalue(i)%ms为产生的随机的行矩阵;fitvalue为元素依次累加的新的行矩阵。newpop(j)=pop(i);%newpop()为输出函数,pop为初始种群2.1中。j=j+1;elsei=i+1;endend%2.5交叉交叉算法步骤可描述为:①设置交叉次数j=0;②在群体的范围内随机产生两个整数,其值在区间[1,totalIndival]之间③产生一个随机数randc,randc∈[0,1]④若rands≥pc,不执行交叉操作,直接转⑥⑤随机产生在区间[0,indavalLength]内的整数crossSite作为交叉点,执行交叉操作⑥j++;如果j≥countIndival/2,终止交叉操作,否则转2%交叉(crossover),群体中的每个个体之间都以一定的概率pc交叉,即两个个体从各自字符串的某一位置%(一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:%x1=0100110%x2=1010001%从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:%y1=0100001%y2=1010110%这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。%事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。%遗传算法子程序%Name:crossover.m%交叉%pc交叉概率,交叉概率过大(0.75-1),高适应值的个体容易被破坏,交叉率过小(0-0.25),算法退化成随机搜索,合适的范围在0.25-0.75之间。function[newpop]=crossover(pop,pc)[px,py]=size(pop);newpop=ones(size(pop));%newpop为px*py阶元素都为1的矩阵,目的就是产生一个px*py阶矩阵fori=1:2:px-1%是for循环,i间隔一个数取值,为1,3,5,…,px-1,防止重复交叉。if(randpc)cpoint=round(rand*py);%cpoint交叉点,随机产生交叉点。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%若rand≥pc,不执行交叉操作newpop(i,:)=pop(i);newpop(i+1,:)=pop(i+1);end5/8end%2.6变异变异算法描述如下:①j=0②产生一个随机数randm∈[0,1]③如果randmPm,则不进行变异操作,直接转⑤,否则转④④随机产生一整数mut∈[0,indivalLength],将该位的数值翻转或进行替换操作⑤j++,如果jcountIndival(个体总数),则退出变异操作,否则转②%变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率pm翻转,即由“1”变为“0”,%或由“0”变为“1”。遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。%遗传算法子程序%Name:mutation.m%变异%all函数:检测矩阵中是否全为非零元素,如果是,则返回1,否则,返回0。any函数:检测矩阵中是否有非零元素,如果有,则返回1,否则,返回0。用法和all一样function[newpop]=mutation(pop,pm)[px,py]=size(pop);newpop=ones(size(pop));fori=1:pxif(randpm)%随机产生0-1的数值小于变异概率pm,则执行变异操作。mpoint=round(rand*py);%mpoint变异点,round()作用对数值进行四舍五入。ifmpoint=0%变异点≤0时mpoint=1;endnewpop(i)=pop(i);ifany(newpop(i,mpoint))==0%any函数的用法,any(n
本文标题:遗传算符MATLAB程序-入门必看
链接地址:https://www.777doc.com/doc-6716659 .html