matlab 有关GA优化的例子
- 格式:doc
- 大小:31.00 KB
- 文档页数:5
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编程的PCA改进GA-BP回归分析PCA改进GA-BP回归分析是一种强大的工具,它结合了PCA分析、GA优化算法和BP神经网络算法。
其基本思想是,先用PCA分析提取出数据集的主成分,然后将主成分作为输入向量,通过GA优化算法优化BP神经网络的权值和偏置,以实现回归分析。
下面我们就来详细介绍一下PCA改进GA-BP回归分析的MATLAB编程实现。
首先,我们需要导入数据集并进行PCA分析。
假设我们的数据集是一个$N\times M$的矩阵,其中$N$表示样本数,$M$表示特征数。
我们可以使用MATLAB的pca函数来实现PCA分析,代码如下:``` matlab[coeff, score, latent] = pca(data);```其中,coeff为主成分系数矩阵,score为主成分得分矩阵,latent为主成分方差向量。
我们可以通过观察latent的大小来确定需要保留的主成分数,一般来说保留累计方差贡献率达到80%以上的主成分即可。
接下来,我们将保留下来的主成分作为输入向量,构建一个BP神经网络。
为了优化BP神经网络的权值和偏置,我们需要使用GA优化算法。
具体来说,我们将BP神经网络的权值和偏置作为基因,将神经网络的误差作为适应度函数,使用遗传算法来搜索最优解。
下面是实现遗传算法的MATLAB代码:``` matlabfunction [best_gen, best_fit] = genetic_algorithm(pop_size, bit_num, generation_num, pc, pm, eval_func)% 初始化种群pop = rand(pop_size, bit_num);% 遗传进化for gen = 1:generation_num% 计算适应度函数值scores = zeros(pop_size, 1);for i = 1:pop_sizescores(i) = eval_func(pop(i, :));end% 选择优秀个体[sorted_scores, sorted_indexes] = sort(scores, 'descend'); elite_num = round(pop_size * 0.1);elites = pop(sorted_indexes(1:elite_num), :);% 交叉操作for i = 1:2:pop_sizeparent1 = elites(randi(elite_num), :);parent2 = elites(randi(elite_num), :);if rand < pc[child1, child2] = crossover(parent1, parent2);pop(i, :) = child1;pop(i + 1, :) = child2;elsepop(i, :) = parent1;pop(i + 1, :) = parent2;endend% 变异操作for i = 1:pop_sizeif rand < pmpop(i, :) = mutation(pop(i, :));endendend% 返回最优个体和适应度函数值best_fit = eval_func(elites(1, :));best_gen = elites(1, :);end```其中,pop_size表示种群大小,bit_num表示染色体长度,generation_num表示迭代次数,pc表示交叉概率,pm表示变异概率,eval_func为适应度函数。
matlab中的遗传算法【原创版】目录一、引言二、遗传算法的基本原理1.种群概念2.适应度函数3.选择操作4.交叉操作5.变异操作三、MATLAB 中遗传算法的实现1.准备工作2.遗传算法的实现四、遗传算法的应用案例1.旅行商问题2.装载问题五、遗传算法的优缺点六、结论正文一、引言遗传算法(Genetic Algorithm,GA)是一种模拟自然界生物进化过程的优化算法,其主要思想是将进化过程中的自然选择、交叉和变异等遗传操作应用到问题的求解过程中,从而实现对问题的优化求解。
遗传算法在解决复杂问题、非线性问题以及大规模问题等方面具有较强的优势,因此在各个领域得到了广泛的应用。
本文将介绍遗传算法的基本原理以及在MATLAB 中的实现。
二、遗传算法的基本原理1.种群概念遗传算法以一个种群作为优化过程的载体。
种群中的个体代表问题的解,每个个体由一组参数表示。
在优化过程中,种群会不断进化,最终收敛到问题的最优解。
2.适应度函数适应度函数是遗传算法的核心部分,用于评价种群中个体的优劣。
适应度函数的取值范围为 [0, 1],其中 1 表示最优解,0 表示最劣解。
在遗传算法的优化过程中,适应度函数用于选择优秀的个体,从而指导种群的进化。
3.选择操作选择操作是基于适应度函数的一种选择策略,用于选择下一代的父代个体。
常见的选择方法有轮盘赌选择、锦标赛选择等。
4.交叉操作交叉操作是遗传算法中产生新个体的主要方式,通过将选中的优秀个体进行交叉操作,产生具有更好适应度的新个体。
常见的交叉方法有单点交叉、多点交叉、均匀交叉等。
5.变异操作变异操作是在遗传算法中引入随机性的一种方式,通过随机改变某些基因的值,使新个体在进化过程中具有一定的多样性。
变异操作的强度由变异概率控制。
三、MATLAB 中遗传算法的实现1.准备工作在 MATLAB 中实现遗传算法,首先需要定义适应度函数、选择操作、交叉操作和变异操作等。
此外,还需要设置遗传算法的参数,如迭代次数、种群大小、交叉概率、变异概率等。
遗传算法多目标优化matlab源代码遗传算法(Genetic Algorithm,GA)是一种基于自然选择和遗传学原理的优化算法。
它通过模拟生物进化过程,利用交叉、变异等操作来搜索问题的最优解。
在多目标优化问题中,GA也可以被应用。
本文将介绍如何使用Matlab实现遗传算法多目标优化,并提供源代码。
一、多目标优化1.1 多目标优化概述在实际问题中,往往存在多个冲突的目标函数需要同时优化。
这就是多目标优化(Multi-Objective Optimization, MOO)问题。
MOO不同于单一目标优化(Single Objective Optimization, SOO),因为在MOO中不存在一个全局最优解,而是存在一系列的Pareto最优解。
Pareto最优解指的是,在不降低任何一个目标函数的情况下,无法找到更好的解决方案。
因此,在MOO中我们需要寻找Pareto前沿(Pareto Front),即所有Pareto最优解组成的集合。
1.2 MOO方法常见的MOO方法有以下几种:(1)加权和法:将每个目标函数乘以一个权重系数,并将其加和作为综合评价指标。
(2)约束法:通过添加约束条件来限制可行域,并在可行域内寻找最优解。
(3)多目标遗传算法:通过模拟生物进化过程,利用交叉、变异等操作来搜索问题的最优解。
1.3 MOO评价指标在MOO中,我们需要使用一些指标来评价算法的性能。
以下是常见的MOO评价指标:(1)Pareto前沿覆盖率:Pareto前沿中被算法找到的解占总解数的比例。
(2)Pareto前沿距离:所有被算法找到的解与真实Pareto前沿之间的平均距离。
(3)收敛性:算法是否能够快速收敛到Pareto前沿。
二、遗传算法2.1 遗传算法概述遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法。
它通过模拟生物进化过程,利用交叉、变异等操作来搜索问题的最优解。
GA-BP神经网络应用实例之MATLAB程序% gap.xls中存储训练样本的原始输入数据 37组% gat.xls中存储训练样本的原始输出数据 37组% p_test.xls中存储测试样本的原始输入数据 12组% t_test.xls中存储测试样本的原始输出数据 12组% 其中gabpEval.m适应度值计算函数,gadecod.m解码函数%--------------------------------------------------------------------------nntwarn off;% nntwarn函数可以临时关闭神经网络工具箱的警告功能,当代码使用到神经% 网络工具箱的函数时会产生大量的警告而这个函数可以跳过这些警告但% 是,为了保证代码可以在新版本的工具箱下运行,我们不鼓励这么做pc=xlsread('gap.xls');tc=xlsread('gat.xls');p_test=xlsread('p_test.xls');t_test=xlsread('t_test.xls');p=pc';t=tc';p_test=p_test';t_test=t_test';% 归一化处理for i=1:2P(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:))); endfor i=1:4T(i,:)=(t(i,:)-min(t(i,:)))/(max(t(i,:))-min(t(i,:))); endfor i=1:2P_test(i,:)=(p_test(i,:)-min(p_test(i,:)))/(max(p_test(i,:))-min(p_test(i,:)));end%--------------------------------------------------------------------------% 创建BP神经网络,隐含层节点数为12net=newff(minmax(P),[12,4],{'tansig','purelin'},'trainlm'); %-------------------------------------------------------------------------- % 下面使用遗传算法对网络进行优化R=size(P,1);% BP神经网络输入层节点数S2=size(T,1);% BP神经网络输出层节点数S1=12;% 隐含层节点数S=R*S1+S1*S2+S1+S2;% 遗传算法编码长度aa=ones(S,1)*[-1,1];popu=100;% 种群规模initPop=initializega(popu,aa,'gabpEval');% 初始化种群gen=500;% 遗传代数% 下面调用gaot工具箱,其中目标函数定义为gabpEval[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPop,[1e-6 11],'maxGenTerm',...gen,'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);%--------------------------------------------------------------------------% 绘收敛曲线图figure;plot(trace(:,1),1./trace(:,3),'r-'); hold on;plot(trace(:,1),1./trace(:,2),'b-'); xlabel('遗传代数');ylabel('平方和误差');figure;plot(trace(:,1),trace(:,3),'r-'); hold on;plot(trace(:,1),trace(:,2),'b-'); xlabel('遗传代数');ylabel('适应度');legend('平均适应度值','最优适应度值'); %-------------------------------------------------------------------------- % 下面将初步得到的权值矩阵赋给尚未开始训练的BP网络[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x); net.IW{1,1}=W1;net.LW{2,1}=W2;net.b{1}=B1;net.b{2}=B2;% 设置训练参数net.trainParam.epochs=3000;net.trainParam.goal=1e-6;% 训练网络net=train(net,P,T);w1=net.IW{1,1};w2=net.LW{2,1};b1=net.b{1};b2=net.b{2};% 测试网络性能temp=sim(net,P_test);yuce1=[temp(1,:);temp(2,:),;temp(3,:);temp(4,:)];for i=1:4yuce(i,:)=yuce1(i,:)*(max(t_test(i,:))-min(t_test(i,:)))+min(t_test(i,:));end%--------------------------------------------------------------------------% 测试输出结果之一figure;plot(1:12,yuce(1,:),'bo-');ylabel('切口外径 mm');hold on;plot(1:12,t_test(1,:),'r*-'); legend('测试结果','测试样本');figure;plot(1:12,yuce(1,:)-t_test(1,:),'b-');ylabel('误差 mm');title('测试结果与测试样本误差');figure;plot(1:12,((yuce(1,:)-t_test(1,:))/t_test(1,:))*100,'b*'); ylabel('百分比');title('测试结果与测试样本误差');% 测试输出结果之二figure;plot(1:12,yuce(2,:),'bo-'); ylabel('切口内径 mm');hold on;plot(1:12,t_test(2,:),'r*-'); legend('测试结果','测试样本'); figure;plot(1:12,yuce(2,:)-t_test(2,:),'b-');ylabel('误差 mm');title('测试结果与测试样本误差');figure;plot(1:12,((yuce(2,:)-t_test(2,:))/t_test(2,:))*100,'b*'); ylabel('百分比');title('测试结果与测试样本误差');% 测试输出结果之三figure;plot(1:12,yuce(3,:),'bo-'); ylabel('最大滚切力 N');hold on;plot(1:12,t_test(3,:),'r*-'); legend('测试结果','测试样本'); figure;plot(1:12,yuce(3,:)-t_test(3,:),'b-');ylabel('误差 N');title('测试结果与测试样本误差');figure;plot(1:12,((yuce(3,:)-t_test(3,:))/t_test(3,:))*100,'b*');ylabel('百分比');title('测试结果与测试样本误差');% 测试输出结果之四figure;plot(1:12,yuce(4,:),'bo-'); ylabel('切断时间 s');hold on;plot(1:12,t_test(4,:),'r*-');legend('测试结果','测试样本');figure;plot(1:12,yuce(4,:)-t_test(4,:),'b-');ylabel('误差 s');title('测试结果与测试样本误差');figure;plot(1:12,((yuce(4,:)-t_test(4,:))/t_test(4,:))*100,'b*'); ylabel('百分比');title('测试结果与测试样本误差');%--------------------------------------------------------------------------。
基于Matlab遗传算法工具箱的优化计算实现一、概述随着科技的发展和社会的进步,优化问题在众多领域,如工程设计、经济管理、生物科学、交通运输等中扮演着越来越重要的角色。
优化计算的目标是在给定的约束条件下,寻找一组变量,使得某个或某些目标函数达到最优。
许多优化问题具有高度的复杂性,传统的数学方法往往难以有效求解。
寻求新的、高效的优化算法成为了科研人员的重要任务。
遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传学机制的搜索算法,通过模拟自然界的进化过程,寻找问题的最优解。
自20世纪70年代初由美国密歇根大学的John Holland教授提出以来,遗传算法因其全局搜索能力强、鲁棒性好、易于与其他算法结合等优点,被广泛应用于各种优化问题中。
1. 遗传算法简介遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传学机制的优化搜索算法。
该算法起源于对生物进化过程中遗传机制的研究,通过模拟自然选择和遗传过程中的交叉、突变等操作,在搜索空间内寻找最优解。
自20世纪70年代初由John Holland教授提出以来,遗传算法已在多个领域取得了广泛的应用,包括函数优化、机器学习、模式识别、自适应控制等。
遗传算法的基本思想是将问题的解表示为“染色体”,这些染色体在算法中通过选择、交叉和突变等操作进行演化。
选择操作模仿了自然选择中“适者生存”的原则,根据适应度函数对染色体进行筛选交叉操作则模拟了生物进化中的基因重组过程,通过交换染色体中的部分基因,生成新的个体突变操作则是对染色体中的基因进行小概率的随机改变,以维持种群的多样性。
在遗传算法中,种群初始化是算法的起点,通过随机生成一组初始解作为初始种群。
根据适应度函数对种群中的个体进行评估,选择出适应度较高的个体进行交叉和突变操作,生成新的种群。
这个过程不断迭代进行,直到满足终止条件(如达到最大迭代次数或找到满足精度要求的最优解)为止。
MATLAB 智能算法30个案例分析第1 章1、案例背景遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。
遗传算法的做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。
在遗传算法中,染色体对应的是数据或数组,通常是由一维的串结构数据来表示,串上各个位置对应基因的取值。
基因组成的串就是染色体,或者叫基因型个体( Individuals) 。
一定数量的个体组成了群体(Population)。
群体中个体的数目称为群体大小(Population Size),也叫群体规模。
而各个个体对环境的适应程度叫做适应度( Fitness) 。
2、案例目录:1.1 理论基础1.1.1 遗传算法概述1. 编码2. 初始群体的生成3. 适应度评估4. 选择5. 交叉6. 变异1.1.2 设菲尔德遗传算法工具箱1. 工具箱简介2. 工具箱添加1.2 案例背景1.2.1 问题描述1. 简单一元函数优化2. 多元函数优化1.2.2 解决思路及步骤1.3 MATLAB程序实现1.3.1 工具箱结构1.3.2 遗传算法中常用函数1. 创建种群函数—crtbp2. 适应度计算函数—ranking3. 选择函数—select4. 交叉算子函数—recombin5. 变异算子函数—mut6. 选择函数—reins7. 实用函数—bs2rv8. 实用函数—rep1.3.3 遗传算法工具箱应用举例1. 简单一元函数优化2. 多元函数优化1.4 延伸阅读1.5 参考文献3、主程序:1. 简单一元函数优化:clcclear allclose all%% 画出函数图figure(1);hold on;lb=1;ub=2; %函数自变量范围【1,2】ezplot('sin(10*pi*X)/X',[lb,ub]); %画出函数曲线xlabel('自变量/X')ylabel('函数值/Y')%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=20; %最大遗传代数PRECI=20; %变量的二进制位数GGAP=0.95; %代沟px=0.7; %交叉概率pm=0.01; %变异概率trace=zeros(2,MAXGEN); %寻优结果的初始值FieldD=[PRECI;lb;ub;1;0;1;1]; %区域描述器Chrom=crtbp(NIND,PRECI); %初始种群%% 优化gen=0; %代计数器X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换ObjV=sin(10*pi*X)./X; %计算目标函数值while gen<MAXGENFitnV=ranking(ObjV); %分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP); %选择SelCh=recombin('xovsp',SelCh,px); %重组SelCh=mut(SelCh,pm); %变异X=bs2rv(SelCh,FieldD); %子代个体的十进制转换ObjVSel=sin(10*pi*X)./X; %计算子代的目标函数值[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群X=bs2rv(Chrom,FieldD);gen=gen+1; %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I]=min(ObjV);trace(1,gen)=X(I); %记下每代的最优值trace(2,gen)=Y; %记下每代的最优值endplot(trace(1,:),trace(2,:),'bo'); %画出每代的最优点grid on;plot(X,ObjV,'b*'); %画出最后一代的种群hold off%% 画进化图figure(2);plot(1:MAXGEN,trace(2,:));grid onxlabel('遗传代数')ylabel('解的变化')title('进化过程')bestY=trace(2,end);bestX=trace(1,end);fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])2. 多元函数优化clcclear allclose all%% 画出函数图figure(1);lbx=-2;ubx=2; %函数自变量x范围【-2,2】lby=-2;uby=2; %函数自变量y范围【-2,2】ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线hold on;%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=50; %最大遗传代数PRECI=20; %变量的二进制位数GGAP=0.95; %代沟px=0.7; %交叉概率pm=0.01; %变异概率trace=zeros(3,MAXGEN); %寻优结果的初始值FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %区域描述器Chrom=crtbp(NIND,PRECI*2); %初始种群%% 优化gen=0; %代计数器XY=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换X=XY(:,1);Y=XY(:,2);ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算目标函数值while gen<MAXGENFitnV=ranking(-ObjV); %分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP); %选择SelCh=recombin('xovsp',SelCh,px); %重组SelCh=mut(SelCh,pm); %变异XY=bs2rv(SelCh,FieldD); %子代个体的十进制转换X=XY(:,1);Y=XY(:,2);ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子代的目标函数值[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群XY=bs2rv(Chrom,FieldD);gen=gen+1; %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I]=max(ObjV);trace(1:2,gen)=XY(I,:); %记下每代的最优值trace(3,gen)=Y; %记下每代的最优值endplot3(trace(1,:),trace(2,:),trace(3,:),'bo'); %画出每代的最优点grid on;plot3(XY(:,1),XY(:,2),ObjV,'bo'); %画出最后一代的种群hold off%% 画进化图figure(2);plot(1:MAXGEN,trace(3,:));grid onxlabel('遗传代数')ylabel('解的变化')title('进化过程')bestZ=trace(3,end);bestX=trace(1,end);bestY=trace(2,end);fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str(bestZ), '\n']) 第2 章基于遗传算法和非线性规划的函数寻优算法1.1案例背景1.1.1 非线性规划方法非线性规划是20世纪50年代才开始形成的一门新兴学科。
遗传算法(GeneticAlgorithm,GA)及MATLAB实现遗传算法概述:• 遗传算法(Genetic Algorithm,GA)是⼀种进化算法,其基本原理是仿效⽣物界中的“物竞天择、适者⽣存”的演化法则,它最初由美国Michigan⼤学的J. Holland教授于1967年提出。
• 遗传算法是从代表问题可能潜在的解集的⼀个种群(population)开始的,⽽⼀个种群则由经过基因(gene)编码的⼀定数⽬的个体(individual)组成。
因此,第⼀步需要实现从表现型到基因型的映射即编码⼯作。
初代种群产⽣之后,按照适者⽣存和优胜劣汰的原理,逐代(generation)演化产⽣出越来越好的近似解,在每⼀代,根据问题域中个体的适应度(fitness)⼤⼩选择个体,并借助于⾃然遗传学的遗传算⼦(genetic operators)进⾏组合交叉和变异,产⽣出代表新的解集的种群。
这个过程将导致种群像⾃然进化⼀样,后⽣代种群⽐前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。
• 遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)。
• (1)选择。
选择的⽬的是为了从当前群体中选出优良的个体,使它们有机会作为⽗代为下⼀代繁衍⼦孙。
根据各个个体的适应度值,按照⼀定的规则或⽅法从上⼀代群体中选择出⼀些优良的个体遗传到下⼀代种群中。
选择的依据是适应性强的个体为下⼀代贡献⼀个或多个后代的概率⼤。
• (2)交叉。
通过交叉操作可以得到新⼀代个体,新个体组合了⽗辈个体的特性。
将群体中的各个个体随机搭配成对,对每⼀个个体,以交叉概率交换它们之间的部分染⾊体。
• (3)变异。
对种群中的每⼀个个体,以变异概率改变某⼀个或多个基因座上的基因值为其他的等位基因。
同⽣物界中⼀样,变异发⽣的概率很低,变异为新个体的产⽣提供了机会。
遗传算法的基本步骤:1)编码:GA在进⾏搜索之前先将解空间的解数据表⽰成遗传空间的基因型串结构数据,这些串结构数据的丌同组合便构成了丌同的点。
核心函数:(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数【输出参数】pop--生成的初始种群【输入参数】num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如precision--变量进行二进制编码时指定的精度F_or_B--为1时选择浮点编码,否则为二进制编码,由precision指定精度)(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,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 heuristicXover simpleXover]xOverOps--传递给交*函数的参数表,如[2 02 32 0]mutFNs--变异函数表,如[boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation]mutOps--传递给交*函数的参数表,如[4 0 06 100 34 100 34 0 0]注意】matlab工具箱函数必须放在工作目录下【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交*概率为0.95,变异概率为0.08 【程序清单】编写目标函数function[sol,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[x endPop,bPop,trace]=ga([0 9],fitness,[],initPop,[1e-6 1 1],maxGenTerm,25,normGeomSelect,...[0.08],[arithXover],[2],nonUnifMutation,[2 25 3]) 25次遗传迭代运算借过为: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)-1x=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是传递给变异函数的参数。
%遗传算法进行优化求多元函数(Griewank Function)最小解问题function ga;clearbn=30;%个体串长度inn=50;%初始种群大小gnmax=50;%最大代数pc=0.8;%交叉概率pm=0.6;%变异概率%产生初始种群fps=1200*(rand(inn,bn)-0.5*ones(inn,bn));%浮点数编码,使初始解在[-600,600]范围内由于是偶函数select=fps;gn=0;%第一代解n = 30;fr = 4000;while gn<gnmax,%分别将种群代入目标函数计算适应度q = 0;p = 1;for i = 1:50,for j = 1:30,x(j)=select(i,j:j);q = q+x(j)^2;p = p*cos(x(j)/sqrt(j));endy(i) = q/fr-p+1;q=0;p=1;end[pmin,i]=min(y);%将当前种群中最优解保存在pminpmin1=pmin;vari=mean(select(i,:));%计算最优染色体的平均值并送给vari,变异自适应调节域值l=i;%将最优染色体行坐标传送给l[pmax,z]=max(y);%求取适应度最差的染色体select(z,:)=select(l,:);%将最优染色体引入种群参与竞争%进行交叉,进一步选择优秀的解for i=1:2:50,pcc=pro(pc);%根据交叉概率判断是否进行交叉if pcc==1,if 0<=l-i<=1,%判断是不是最优染色体,如果是不进行交叉cross(i,:)=select(i,:);cross(i+1,:)=select(i+1,:);else%将30个变量分为五个范围,相临两个染色体分别从五位进行交叉crb1=round(rand*(bn/5-1))+1; %在[1,6]范围内随机产生一个交叉位cross(i,crb1:crb1)=0.1*select(i,crb1:crb1)+0.9*select(i+1,crb1:crb1);cross(i+1,crb1:crb1)=0.1*select(i,crb1:crb1)+0.9*select(i+1,crb1:crb1);cross(i,2*crb1:2*crb1)=0.1*select(i,2*crb1:2*crb1)+0.9*select(i+1,2*crb1:2* crb1);cross(i+1,2*crb1:2*crb1)=0.1*select(i,2*crb1:2*crb1)+0.9*select(i+1,2*crb1: 2*crb1);cross(i,3*crb1:3*crb1)=0.1*select(i,3*crb1:3*crb1)+0.9*select(i+1,3*crb1:3* crb1);cross(i+1,3*crb1:3*crb1)=0.1*select(i,3*crb1:3*crb1)+0.9*select(i+1,3*crb1: 3*crb1);cross(i,4*crb1:4*crb1)=0.1*select(i,4*crb1:4*crb1)+0.9*select(i+1,4*crb1:4* crb1);cross(i+1,4*crb1:4*crb1)=0.1*select(i,4*crb1:4*crb1)+0.9*select(i+1,4*crb1: 4*crb1);cross(i,5*crb1:5*crb1)=0.1*select(i,5*crb1:5*crb1)+0.9*select(i+1,5*crb1:5* crb1);cross(i+1,5*crb1:5*crb1)=0.1*select(i,5*crb1:5*crb1)+0.9*select(i+1,5*crb1: 5*crb1);endelsecross(i,:)=select(i,:);cross(i+1,:)=select(i+1,:);endend%变异操作for i=1:50;pmm=pro(pm);if pmm==1,if i==l,change(i,:)=cross(i,:);elsechange(i,:)=cross(i,:);chb=round(rand*(bn-1))+1; %在[1,bn]范围内随机产生一个变异位change(i,chb:chb)= vari*(rand-0.5);%变异为变化为一个[-600,600]的随机数endelsechange(i,:)=cross(i,:);endendselect=change;gn=gn+1;plot(gn,pmin,'g*')hold onendgn%进化代数pmin%最优解select%最终种群select(l,:)%最优染色体strt=['代数gn=' num2str(gn)]; text(80,200,strt);%根据交叉概率判断是否交叉函数function pcc=pro(pc);test(1:100)=0;b=round(100*pc);test(1:b)=1;n=round(rand*99)+1;pcc=test(n);endend。