资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
% 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x0,10 % % 将x 的值用一个10 位的二值形式表示为二值问题,一个10 位的二值数提供的分辨率是每为(10-0)/(210- 1) 0.01 。 % % 将变量域0,10 离散化为二值域0,1023, x=0+10*b/1023, 其中b 是 0,1023 中的一个二值数。% M 文件函数定义语句:function 输出变量 =函数名称(输入变量1,输入变量2,)语句 ; %输入变量与输出变量的关系end; %非必须的例如:function c=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 (实现群体的初始化)%初始化function pop=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 %产生2n 2(n-1) . 1 的行向量,然后求和,将二进制转化为十进制function pop2=decodebinary(pop) % 定义 M 文件函数(将二进制数转化为十进制数的函数)px,py=size(pop); % 求 pop 的行数和列数。px 为种群数,染色体的长度为py for i=1:py pop1(:,i)=2.(py-i).*pop(:,i); %pop1(:,i) 表示 pop1 矩阵的第i 列全部元素end pop2=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.2.2 将二进制编码转化为十进制数(2) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 8 页% decodechrom.m 函数的功能是将染色体 (或二进制编码) 的特定位置转换为十进制,参数spoint 表示待解码的二进制串的起始位置% (对于多个变量而言,如有两个变量,采用20 为表示,每个变量10 为,则第一个变量从1 开始,另一个变量从11 开始。本例为1),% 参数1ength 表示所截取的长度(本例为10) 。%遗传算法子程序%Name: decodechrom.m(将染色体二进制编码转换成十进制)function pop2=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=3 4 2;1 5 3;4 7 1 A = 3 4 2 1 5 3 4 7 1 A(1)=3 ;A(2) =1 ;A(3)=4 ;A(4)=4 ; A(5)=5 %根据 2.2.3 计算出的目标函数值计算个体的适应值function fitvalue=calfitvalue(objvalue) %定义函数global Cmin; %global 表示全局Cmin=0; px,py=size(objvalue); % objvalue 为列向量矩阵for i=1:px if objvalue(i)+Cmin0 % objvalue(i) 表示矩阵objvalue 的第 i 个元素(从上往下数)temp=Cmin+objvalue(i); else temp=0.0; end fitvalue(i)=temp; % 列向量矩阵fitvalue 为 px 个循环中temp 的值构成的。end fitvalue=fitvalue; % 运算符 表示向量的复共轭,最终的fitvalue 为行向量矩阵精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 8 页% 2.4 选择复制其算法为:设置选择算法执行次数j=0 在区间 (0, totalFitness)内产生一随机数rands, totalFitness表示种群个体适应度之和i=0,sum=0;其中 i 表示第 i 个个体, sum 表示 0 i 的个体的适应度值之和sum = sum +fitness(i) ,如果sumrands,转;否则转i+,转返回第i 个个体 indivalsi 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=1 2 3;4 5 6 A = 1 2 3 4 5 6 cumsum(A) ans = 1 2 3 5 7 9 B=1 2 3; cumsum(B) ans = 1 3 6 % 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为种群数,染色体的长度为py ms=sort(rand(px,1); %sort( ) 从小到大排列。rand(px,1)是任意产生px 个元素的行向量矩阵。i=1; j=1; while j=px if(ms(j)fitvalue(i) %ms 为产生的随机的行矩阵;fitvalue 为元素依次累加的新的行矩阵。newpop(j)=pop(i); % newpop( )为输出函数 ,pop 为初始种群2.1 中。j=j+1; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 8 页else i=i+1; end end % 2.5 交叉交叉算法步骤可描述为:设置交叉次数j=0;在群体的范围内随机产生两个整数,其值在区间1,totalIndival 之间产生一个随机数randc, randc 0,1 若 rands pc ,不执行交叉操作,直接转随机产生在区间0,indavalLength 内的整数crossSite作为交叉点,执行交叉操作j+ ;如果j countIn dival/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 阶矩阵for i=1:2:px-1 % 是 for 循环, i 间隔一个数取值,为1,3,5, px-1,防止重复交叉。if(randPm ,则不进行变异操作,直接转,否则转随机产生一整数mut 0,indivalLength ,将该位的数值翻转或进行替换操作j+ ,如果j countIndival (个体总数) ,则退出变异操作,否则转% 变异 (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); for i=1:px if(randpm) %随机产生0-1 的数值小于变异概率pm,则执行变异操作。mpoint=round(rand*py); %mpoint变异点, round( ) 作用对数值进行四舍五入 。if mpointbestfit 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); % 随机产生初始群体for i=1: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); % max(A) :返回一个行向量,向量的第i 个元素是矩阵A 的第 i 列上的最大值。%Y,U=max(A) :返回行向量Y 和 U,Y 向量记录 A 的每列的最大值,U 向量记录每列最大值的行号。n(i)=i; % 貌似没啥用pop5=bestindividual; x(i)=decodechrom(pop5,1,chromlength)*10/1023;%对矩阵 pop5 进行解码,变成十进制数pop=newpop; end fplot(10*sin(5*x)+7*cos(4*x),0 10) % fplot(fun,limits)在指定的范围limits 内画出函数名为fun 的图像。hold on plot(x,y,r*) % 画出来的点有重合的,其实与循环次数是相同的。hold off z index=max(y); % 计算最大值及其位置x5=x(index)% 计算最大值对应的x 值y=z 【问题】求f(x)=x 10*sin(5x) 7*cos(4x)的最大值,其中0=x=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95, 变异概率为0.08 【程序清单】%编写目标函数functionsol,eval=fitness(sol,options) x=sol(1); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 8 页eval=x 10*sin(5*x) 7*cos(4*x); %把上述函数存储为fitness.m 文件并放在工作目录下initPop=initializega(10,0 9,fitness);%生成初始种群,大小为10 x endPop,bPop,trace=ga(0 9,fitness,initPop,1e-6 1 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3) %次遗传迭代运算借过为:x = 7.8562 24.8553(当 x 为 7.8562 时, f(x)取最大值24.8553) 注:遗传算法一般用来取得近似最优解,而不是最优解。遗传算法实例2 【问题】在5=Xi=5,i=1,2 区间内,求解f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.2 x2.2)-exp(0.5*(cos(2*pi*x1) cos(2*pi*x2) 22.71282 的最小值。【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】源函数的matlab 代码function eval=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.2)/numv)-exp(sum(cos(2*pi*x)/numv) 22.71282; %适应度函数的matlab 代码function sol,eval=fitness(sol,options) numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的matlab 代码bounds=ones(2,1)*-5 5; p,endPop,bestSols,trace=ga(bounds,fitness) 注:前两个文件存储为m 文件并放在工作目录下,运行结果为p = 0.0000 -0.0000 0.0055 大家可以直接绘出f(x) 的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab 命令行执行命令:fplot(x 10*sin(5*x) 7*cos(4*x),0,9) evalops 是传递给适应度函数的参数,opts 是二进制编码的精度,termops 是选择maxGenTerm 结束函数时传递个maxGenTerm 的参数,即遗传代数。xoverops 是传递给交叉函数的参数。mutops 是传递给变异函数的参数。【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0=x=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95, 变异概率为0.08 【程序清单】%编写目标函数functionsol,eval=fitness(sol,options) x=sol(1); eval=x+10*sin(5*x)+7*cos(4*x); %把上述函数存储为fitness.m 文件并放在工作目录下initPop=initializega(10,0 9,fitness);%生成初始种群,大小为10 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 8 页x endPop,bPop,trace=ga(0 9,fitness,initPop,1e-6 1 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3) %次遗传迭代运算借过为:x = 7.8562 24.8553(当 x 为 7.8562 时, f(x)取最大值24.8553) 注:遗传算法一般用来取得近似最优解,而不是最优解。遗传算法实例2 【问题】在5=Xi=5,i=1,2 区间内,求解f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.2+x2.2)-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)+22. 71282 的最小值。【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】源函数的matlab 代码function eval=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.2)/numv)-exp(sum(cos(2*pi*x)/numv)+22.71282; %适应度函数的matlab 代码function sol,eval=fitness(sol,options) numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的matlab 代码bounds=ones(2,1)*-5 5; p,endPop,bestSols,trace=ga(bounds,fitness) 注:前两个文件存储为m 文件并放在工作目录下,运行结果为p = 0.0000 -0.0000 0.0055 大家可以直接绘出f(x) 的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab 命令行执行命令:fplot(x+10*sin(5*x)+7*cos(4*x),0,9) evalops 是传递给适应度函数的参数,opts 是二进制编码的精度,termops 是选择maxGenTerm 结束函数时传递个maxGenTerm 的参数,即遗传代数。xoverops 传递给交叉函数的参数。mutops 是传递给变异函数的参数。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 8 页
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号