遗传算法GA求解函数极值

合集下载

利用遗传算法求函数的极大值

利用遗传算法求函数的极大值

利用遗传算法求函数的极大值该函数有两个局部极大值点,分别是f (2.048,-2.048)=3897.7342和f (2.048,-2.048)=3905.9262,其中,后者为全局最大点。

可以分别用二进制编码和十进制编码遗传算法求函数极大值遗传算法二进制编码求函数极大值程序%Generic Algorithm for function f(x1,x2) optimumclear all;close all;%Parameters 参数Size=80; %群体大小G=100; %终止进化代数CodeL=10; %代码长度umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %Initial Code 最初代码%Main Program 主程序for k=1:1:Gtime(k)=k;222212121(,)100()(1)2.048 2.048(1,2)i f x x x x x x i ⎧=-+-⎨-≤≤=⎩for s=1:1:Sizem=E(s,:);y1=0;y2=0; %X对应的十进制代码%Uncodingm1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1); %将y1转换为十进制数endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1); %将y2转换为十进制数endx2=(umax-umin)*y2/1023+umin; %求x对应的十进制数F(s)=100*(x1^2-x2)^2+(1-x1)^2; %个体适应度函数endJi=1./F; %个体适应度函数的倒数%****** Step 1 : Evaluate BestJ ******BestJ(k)=min(Ji);fi=F; %Fitness Function 适应函数[Oderfi,Indexfi]=sort(fi); %Arranging fi small to biggerBestfi=Oderfi(Size); %Let Bestfi=max(fi)BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi) %最佳样本bfi(k)=Bestfi;%****** Step 2 : Select and Reproduct Operation******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi valuekk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%************ Step 3 : Crossover Operation ************pc=0.60; %交叉概率n=ceil(20*rand); %种群大小for i=1:2:(Size-1)temp=rand;if pc>temp %Crossover Conditionfor j=n:1:20TempE(i,j)=E(i+1,j); %交换E(i,j)和E(i+1,j)TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ Step 4: Mutation Operation ************** %pm=0.001; %变异概率%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm %pm=0.0; %No mutationpm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi)) TempE(Size,:)=BestS;E=TempE;endMax_Value=BestfiBestSx1x2figure(1);plot(time,BestJ); %目标函数和时间的坐标系xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');遗传算法十进制编码求函数极大值程序%Generic Algorithm for function f(x1,x2) optimumclear all;close all;%Parameters参数Size=80;G=100; %迭代次数CodeL=10; %编码长度umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %Initial Code ???%Main Programfor k=1:1:Gtime(k)=k;for s=1:1:Sizem=E(s,:);y1=0;y2=0;%Uncodingm1=m(1:1:CodeL); %???for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin;F(s)=100*(x1^2-x2)^2+(1-x1)^2;endJi=1./F;%****** Step 1 : Evaluate BestJ ****** BestJ(k)=min(Ji);fi=F; %Fitness Function[Oderfi,Indexfi]=sort(fi); %Arranging fi small to biggerBestfi=Oderfi(Size); %Let Bestfi=max(fi)BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi)bfi(k)=Bestfi;%****** Step 2 : Select and Reproduct Operation******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi valuekk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%************ Step 3 : Crossover Operation ************ pc=0.60;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>temp %Crossover Conditionfor j=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ Step 4: Mutation Operation ************** %pm=0.001;%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm%pm=0.0; %No mutationpm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi)) TempE(Size,:)=BestS;E=TempE;endMax_Value=BestfiBestSx1x2figure(1);plot(time,BestJ);xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');思考:通过改变群体大小、终止进化代数G、交叉概率P c和变异概率P m,分析群体大小、终止进化代数、交叉概率和变异概率对优化效果的影响。

利用遗传算法求函数的极大值

利用遗传算法求函数的极大值

利用遗传算法求函数的极大值遗传算法是一种通过模拟生物进化的方式来解决优化问题的算法。

它基于达尔文的演化论思想,通过不断演化和交叉变异,逐步优化解空间中的解向最优解靠拢。

在求解函数的极大值问题中,遗传算法可以通过优化染色体的基因序列来寻找最大值点。

遗传算法的基本流程如下:1.初始化种群:随机生成初始种群,每个个体都对应问题的一个可能解。

2.适应度评估:根据问题的具体要求,计算每个个体的适应度值,即目标函数值。

3.选择操作:根据适应度值选择一定数量的个体作为父代,用于进行交叉和变异操作。

4.交叉操作:从父代中选择两个个体,按照一定的交叉规则对其基因序列进行交叉生成子代。

5.变异操作:对子代的基因序列进行一定概率的变异操作,引入新的基因。

6.新一代种群形成:将父代和子代合并形成新一代种群。

7.终止条件判断:根据设定的终止条件判断是否停止算法。

8.若满足终止条件,输出结果;否则,转至步骤2在求解函数的极大值问题中,适应度评估的目标函数可以直接使用待求解函数的值。

下面以一个简单的函数f(x)=x^2为例,说明如何利用遗传算法求函数的极大值。

1.初始化种群:随机生成一定数量的个体,每个个体的基因序列代表一个可能的解,在本例中基因序列即为x的取值。

2.适应度评估:计算每个个体的适应度,即将基因序列代入目标函数得到函数值。

3.选择操作:根据适应度值选择一定数量的个体作为父代。

4.交叉操作:从父代中选择两个个体,按照一定的交叉规则对其基因序列进行交叉生成子代。

5.变异操作:对子代的基因序列进行一定概率的变异操作,引入新的基因。

6.新一代种群形成:将父代和子代合并形成新一代种群。

7.终止条件判断:根据设定的终止条件判断是否停止算法。

例如,可以设定迭代次数达到一定阈值或者适应度值足够接近最大值。

8.若满足终止条件,输出最优解的基因序列;否则,转至步骤2通过不断迭代上述步骤,遗传算法可以逐步逼近函数的极大值点。

在实际应用中,可以根据问题的具体特性和要求对交叉、变异概率等参数进行调整,以达到更好的求解效果。

matlab遗传算法计算函数区间最大值和最小值

matlab遗传算法计算函数区间最大值和最小值

matlab遗传算法计算函数区间最大值和最小值下面是用matlab实现遗传算法计算函数区间最大值和最小值的示例代码:首先定义函数(此处以f(x)=x*sin(10*pi*x)+1为例):matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;end然后设置遗传算法参数:matlaboptions = gaoptimset('Generations', 1000, 'PopulationSize', 50,'StallGenLimit', 200, 'TolCon', 1e-10);其中,Generations表示遗传算法的迭代次数,PopulationSize表示种群大小,StallGenLimit表示在连续多少代没有改变时停止迭代,TolCon表示收敛精度。

接着,编写遗传算法主函数:matlab[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);其中,第一个参数为要优化的函数,第二个参数为变量维度,后面的参数为变量的取值范围。

最后,输出结果:matlabfprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);其中,-fval表示函数最大值,fval表示函数最小值。

完整代码如下:matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;endoptions = gaoptimset('Generations', 1000, 'PopulationSize', 50, 'StallGenLimit', 200, 'TolCon', 1e-10);[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);fprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);参考资料:[1][2]。

基本遗传算法(GA)的算法原理、步骤、及Matlab实现

基本遗传算法(GA)的算法原理、步骤、及Matlab实现

算法原理遗传算法可以用来求函数的极值。

(1)用二进制编码来离散自变量,码长根据离散精度来确定。

码长为log 2[max−min 精度+1](2)交叉方法采用单点交叉(3)变异是根据变异概率反转子代某个位的值(4)选择策略采用轮盘赌策略,令PP i =∑p i i j=1,其中PP i 为累计概率,p i 为个体的选择概率,公式为: p i =fitness(x i )∑fitness(x i)NP i=1,其中fitness(x i )为个体的适应度,共轮转NP 次,每次轮转时,产生随机数r ,当PP i−1≤r <PP i 时选择个体i 。

算法步骤基本遗传算法的基本步骤是:1. 随机产生种群,2. 用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步3. 依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰4. 按照一定的交叉概率和交叉方法,生成新的个体5. 按照一定的变异概率和变异方法,生成新的个体6. 由交叉和变异产生新一代种群,返回步骤2算法的实现%基本遗传算法,一维无约束优化function [ xv,fv ] = mGA( fitness,a,b,NP,NG,Pc,Pm,eps )% 待优化的目标函数:fitness% 自变量下界:a% 自变量上界:b% 种群个体数:NP% 最大进化代数:NG% 杂交常数:Pc% 变异常数:Pm% 自变量离散精度:eps% 目标函数取最大值是的自变量值:xv% 目标函数的最小值:fvL=ceil(log2((b-a)/eps+1)); %码长x=zeros(NP,L);for i=1:NPx(i,:)=Initial(L);fx(i)=fitness(Dec(a,b,x(i,:),L));endfor k=1:NGsumfx=sun(fx);Px=fx/sumfx;PPx=0;PPx(1)=Px(1);for i=2:NP %根据轮盘赌确定父亲PPx(i)=PPx(i-1)+PPx(i);endfor i=1:NPsita=rand();for n=1:NPif sita <= PPx(n)SelFather = n;break;endendSelmother=floor(rand()*(NP-1))+1; %随机选择母亲posCut=floor(rand()*(L-2))+1; %随机确定交叉点r1=rand();if r1<=Pcnx(i,1:posCut)=x(SelFather,1:posCut);nx(I,(posCut+1):L)=x(Selmother,(posCut+1):L);r2=rand();if r2<=Pm %变异posMut=round(rand()*(L-1)+1);nx(i,posMut)=~nx(i,posMut);endelsenx(i,:)=x(SelFather,:);endendx=nx;for i=1:NPfx(i)=fitness(Dec(a,b,x(i,:),L);endendfv=-inf;for i=1:NPfitx=fitness(Dec(a,b,x(i,:),L));if fitx > fvfv=fitx;xv=Dec(a,b,x(i,:),L);endendendfunction result=Initial(length) %初始化函数for i=1:lengthr=round();result(i)=round(r);endendfunction y=Dec(a,b,x,L) %二进制转十进制base=2.^((L-1):-1:0);y=dot(base,x);y=a+y*(b-1)/(2^L-1)'end。

利用遗传算法求解函数的最大值

利用遗传算法求解函数的最大值

利用遗传算法求解函数的最大值蒋赛赵玉芹1 遗传算法的基本原理遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。

遗传算法与传统数学模型截然不同,它为那些难以找到传统数学模型的难题找出了一个解决方法。

同时,遗传算法借鉴了生物科学中的某些知识,从而体现了人工智能的这一交叉学科的特点。

遗传算法是一种通用的优化算法,其编码技术和遗传操作比较简单,优化不受限制条件的约束,不需要有先验条件。

其搜索过程是从问题解的一个随机产生的集合开始的,而不是从单个个体开始的,具有隐含并行搜索特性,也就大大减少可陷入局部极小值的可能。

在解决可能在求解过程中产生组合爆炸的问题时会产生很好的效果。

遗传算法需选择一种合适的编码方式表示解, 并选择一种评价函数用来每个解的适应值, 适应值高的解更容易被选中并进行交叉和变异, 然后产生新的子代。

选择、交叉和变异的过程一直循环 , 直到求得满意解或满足其他终止条件为止。

算法的运行过程具有很强的指向性, 适合众多复杂问题的求解。

具体操作步骤如下:1)初始化种群;2)计算种群上每个个体的适应度值;3)按由个体适应度值所决定的某个规则选择将进入下一代的个体进行交叉操作4)按概率PC进行变异操作5)按概率PC6)若没有满足某种停止条件,则转步骤2),否则进入下一步;7)输入种群中适应度值最优的染色体作为问题的满足解或最优解本例运用遗传算法求解函数优化的问题2 遗传求解举例(Rosenbrock函数的全局最大值计算)2.0 求解函数介绍函数f(x1,x2) = 100 (x21-x2)2 + (1-x2)2是非凸函数,又称Rosenbrock函数,是由De Jong提出的,现已成为测试遗传算法的标准函数。

该函数在极小值附近沿曲线x2=x12有陡峭的峡谷,很容易陷入局部极小,它的全局最小点是(1,1),最小值是0.该函数有两个局部极大点,分别是:f(2.048, -2.048)=3897.7342 和 (-2.048,-2.048)=3905.9262其中后者为全局最大值点。

MATLAB遗传工具箱ga求函数在某区间最大值

MATLAB遗传工具箱ga求函数在某区间最大值

MATLAB遗传⼯具箱ga求函数在某区间最⼤值问题让你求解⼀个⾮线性规划问题的最优解\[y=200\times \exp(-0.05x)\times \sin(x)\\ s.t. \ -2<x<2 \]GA遗传算法,(Genetic Algorithm,GA)是模拟⽣物进化论中⾃然选择和遗传学机理的⽣物进化过程中的计算模型,是⼀种通过模拟⾃然进化过程搜索最优解的⽅法。

它是智能计算技术之⼀。

matlab求解%使⽤matlab遗传算法⼯具箱进⾏计算%参考《智能计算⽅法及其应⽤》国防⼯业出版社clc;close all;clear all;options= optimoptions('ga','PlotFcn',{@ gaplotbestf, @ gaplotbestindiv, @gaplotexpectation ..., @ gaplotstopping});[x,fval,exitflag,output] =ga(@fitnessfun,1,[],[],[],[],[],[],[],options);%x是最优值%fval是最优值适应度%exitflag是算法结束标志%output是输出参数%fitnessfun是适应度函数%nvars是变量的个数function f =fitnessfun(x)if x<-2 | x>2f=150;elsef=-200*exp(-0.05*x)*sin(x);endend每次运⾏的结果不⼀定⼀样,截图⾥的结果显⽰是在x=1.523时y取得最⼤值mma求解参考。

R语言GA遗传算法

R语言GA遗传算法

GA包遗传算法最大化使用遗传算法的适应度函数。

默认求最大值。

用法:ga(type = c("binary", "real-valued", "permutation"), fitness, ..., min, max, nBits, population = gaControl(type)population,<br/>selection=gaControl(type)selection, crossover = gaControl(type)crossover,<br/> mutation=gaControl(type)mutation, popSize = 50, pcrossover = 0.8, pmutation = 0.1, elitism = base::max(1, round(popSize*0.05)), maxiter = 100, run = maxiter, maxfitness = Inf, names = NULL, suggestions = NULL, keepBest = FALSE, parallel = FALSE, monitor = gaMonitor, seed = NULL)参数说明•type: 解得编码类型–binary :二进制编码–real-valued:实数浮点编码–permutation:问题涉及到重新排序的列表,字符串编码。

可求解TSP 问题•fitness:适应度函数•min:解得下界(多元变量为一个向量)•max:解得上界(多元变量为一个向量)•nBits:一个种群用二进制编码的长度是多少(长度越大代表精度越高) •population:初始种群•selection:选择•crossover: 交叉•crossover:变异•popsize:种群大小•pcrossover: 交叉概率(默认0.8)•pmutation:变异概率(默认0.1)•elitism: 代沟(默认情况下,前5%个体将在每个迭代中保留)•maxiter:最大迭代次数(默认100)•maxfitness:适应度函数的上界,GA搜索后中断•keepBest:是否保留每一代的最优解•parallel:是否采用并行运算•monitor:绘图用的,监控遗传算法的运行状况•seed:一个整数值包含随机数发生器的状态。

GA函数的最大值寻优

GA函数的最大值寻优
5
(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,s tartPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mut FNs,mutOps)-遗传算法函数 【输出参数】 x--求得的最优解 endPop--最终得到的种群 bPop--最优种群的一个搜索轨迹 【输入参数】 bounds--代表变量上下界的矩阵 evalFN--适应度函数 evalOps--传递给适应度函数的参数 startPop-初始种群
6
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 simpl eXover'] xOverOps--传递给交叉函数的参数表,如[2 0;2 3;2 0] mutFNs--变异函数表,如 ['boundaryMutation multiNonUnifMutation nonUnifMuta tion unifMutation'] mutOps--传递给交叉函数的参数表,如 [4 0 0;6 100 3;4 100 3;4 0 0]
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主程序%% GAclc % 清屏clear all; % 删除workplace变量close all; % 关掉显示图形窗口warning off%% 参数初始化popsize=100; %种群规模lenchrom=7; %变量字串长度pc=0.7; %设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率pm=0.3; %设置变异概率,同理也可设置为变化的maxgen=100; % 进化次数%种群popmax=50;popmin=0;bound=[popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popm inpopmax]; %变量范围%% 产生初始粒子和速度fori=1:popsize%随机产生一个种群GApop(i,:)=Code(lenchrom,bound); %随机产生个体%计算适应度fitness(i)=fun(GApop(i,:)); %染色体的适应度end%找最好的染色体[bestfitnessbestindex]=min(fitness);zbest=GApop(bestindex,:); %全局最佳gbest=GApop; %个体最佳fitnessgbest=fitness; %个体最佳适应度值fitnesszbest=bestfitness; %全局最佳适应度值%% 迭代寻优fori=1:maxgeni%种群更新GA选择更新GApop=Select2(GApop,fitness,popsize);% 交叉操作GAGApop=Cross(pc,lenchrom,GApop,popsize,bound);% 变异操作GA变异GApop=Mutation(pm,lenchrom,GApop,popsize,[imaxgen],bound);pop=GApop;for j=1:popsize%适应度值if0.072*pop(j,1)+0.063*pop(j,2)+0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7) <=264.4if128*pop(j,1)+78.1*pop(j,2)+64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719 fitness(j)=fun(pop(j,:));endend%个体最优更新if fitness(j) <fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) <fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endendyy(i)=fitnesszbest;end%% 结果disp '*************best particle number****************'zbest%%plot(yy,'linewidth',2);title(['适应度曲线' '终止代数=' num2str(maxgen)]);xlabel('进化代数');ylabel('适应度');grid on子程序funfunction y = fun(x)y=0.072*x(1)+0.063*x(2)+0.057*x(3)+0.05*x(4)+0.032*x(5)+0.0442*x(6)+0.0675*x(7);Mutationfunction ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound)% 本函数完成变异操作% pcorss input : 变异概率% lenchrom input : 染色体长度% chrom input : 染色体群% sizepop input : 种群规模% pop input : 当前种群的进化代数和最大的进化代数信息% ret output : 变异后的染色体fori=1:sizepop% 随机选择一个染色体进行变异pick=rand;while pick==0pick=rand;endindex=ceil(pick*sizepop);% 变异概率决定该轮循环是否进行变异pick=rand;if pick>pmutationcontinue;endflag=0;while flag==0% 变异位置pick=rand;while pick==0pick=rand;endpos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异v=chrom(i,pos);v1=v-bound(pos,1);v2=bound(pos,2)-v;pick=rand; %变异开始if pick>0.5delta=v2*(1-pick^((1-pop(1)/pop(2))^2));chrom(i,pos)=v+delta;elsedelta=v1*(1-pick^((1-pop(1)/pop(2))^2));chrom(i,pos)=v-delta;end %变异结束flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性endendret=chrom;Crossfunction ret=Cross(pcross,lenchrom,chrom,sizepop,bound)%本函数完成交叉操作% pcorss input : 交叉概率% lenchrom input : 染色体的长度% chrom input : 染色体群% sizepop input : 种群规模% ret output : 交叉后的染色体fori=1:sizepop% 随机选择两个染色体进行交叉pick=rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);% 交叉概率决定是否进行交叉pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0% 随机选择交叉位置pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同pick=rand; %交叉开始v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性if flag1*flag2==0flag=0;else flag=1;end %如果两个染色体不是都可行,则重新交叉endendret=chrom;Codefunction ret=Code(lenchrom,bound)%本函数将变量编码成染色体,用于随机初始化一个种群% lenchrom input : 染色体长度% bound input : 变量的取值范围% ret output: 染色体的编码值flag=0;while flag==0pick=rand(1,lenchrom);ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值flag=test(lenchrom,bound,ret); %检验染色体的可行性endSelect2function ret=Select(individuals,fitness,sizepop)% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异% individuals input : 种群信息% fitness input : 适应度% sizepop input : 种群规模% opts input : 选择方法的选择% ret output : 经过选择后的种群fitness= 1./(fitness);sumfitness=sum(fitness);sumf=fitness./sumfitness;index=[];for i=1:sizepop %转sizepop次轮盘pick=rand;while pick==0pick=rand;endfor j=1:sizepoppick=pick-sumf(j);if pick<0index=[index j];break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体endendendindividuals=individuals(index,:);fitness=fitness(index);ret=individuals;testfunction flag=test(lenchrom,bound,code)% lenchrom input : 染色体长度% bound input : 变量的取值范围% code output: 染色体的编码值flag=1;[n,m]=size(code);fori=1:nif code(i)<bound(i,1) || code(i)>bound(i,2)flag=0;endend。

相关文档
最新文档