简单遗传算法MATLAB实现

合集下载

遗传算法的原理及MATLAB程序实现.

遗传算法的原理及MATLAB程序实现.

1 遗传算法的原理1.1 遗传算法的基本思想遗传算法(genetic algorithms,GA)是一种基于自然选择和基因遗传学原理,借鉴了生物进化优胜劣汰的自然选择机理和生物界繁衍进化的基因重组、突变的遗传机制的全局自适应概率搜索算法。

遗传算法是从一组随机产生的初始解(种群)开始,这个种群由经过基因编码的一定数量的个体组成,每个个体实际上是染色体带有特征的实体。

染色体作为遗传物质的主要载体,其内部表现(即基因型)是某种基因组合,它决定了个体的外部表现。

因此,从一开始就需要实现从表现型到基因型的映射,即编码工作。

初始种群产生后,按照优胜劣汰的原理,逐代演化产生出越来越好的近似解。

在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。

这个过程将导致种群像自然进化一样,后代种群比前代更加适应环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。

计算开始时,将实际问题的变量进行编码形成染色体,随机产生一定数目的个体,即种群,并计算每个个体的适应度值,然后通过终止条件判断该初始解是否是最优解,若是则停止计算输出结果,若不是则通过遗传算子操作产生新的一代种群,回到计算群体中每个个体的适应度值的部分,然后转到终止条件判断。

这一过程循环执行,直到满足优化准则,最终产生问题的最优解。

图1-1给出了遗传算法的基本过程。

1.2 遗传算法的特点1.2.1 遗传算法的优点遗传算法具有十分强的鲁棒性,比起传统优化方法,遗传算法有如下优点:1. 遗传算法以控制变量的编码作为运算对象。

传统的优化算法往往直接利用控制变量的实际值的本身来进行优化运算,但遗传算法不是直接以控制变量的值,而是以控制变量的特定形式的编码为运算对象。

这种对控制变量的编码处理方式,可以模仿自然界中生物的遗传和进化等机理,也使得我们可以方便地处理各种变量和应用遗传操作算子。

2. 遗传算法具有内在的本质并行性。

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序一、本文概述遗传算法(Genetic Algorithms,GA)是一种模拟自然界生物进化过程的优化搜索算法,它通过模拟自然选择和遗传学机制,如选择、交叉、变异等,来寻找问题的最优解。

由于其全局搜索能力强、鲁棒性好以及易于实现并行化等优点,遗传算法在多个领域得到了广泛的应用,包括函数优化、机器学习、神经网络训练、组合优化等。

本文旨在介绍如何使用MATLAB实现遗传算法程序。

MATLAB作为一种强大的数学计算和编程工具,具有直观易用的图形界面和丰富的函数库,非常适合用于遗传算法的实现。

我们将从基本的遗传算法原理出发,逐步介绍如何在MATLAB中编写遗传算法程序,包括如何定义问题、编码、初始化种群、选择操作、交叉操作和变异操作等。

通过本文的学习,读者将能够掌握遗传算法的基本原理和MATLAB编程技巧,学会如何使用MATLAB实现遗传算法程序,并能够在实际问题中应用遗传算法求解最优解。

二、遗传算法基础遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传学机制的优化搜索算法。

它借鉴了生物进化中的遗传、交叉、变异等机制,通过模拟这些自然过程来寻找问题的最优解。

遗传算法的核心思想是将问题的解表示为“染色体”,即一组编码,然后通过模拟自然选择、交叉和变异等过程,逐步迭代搜索出最优解。

在遗传算法中,通常将问题的解表示为一个二进制字符串,每个字符串代表一个个体(Individual)。

每个个体都有一定的适应度(Fitness),适应度越高的个体在下一代中生存下来的概率越大。

通过选择(Selection)、交叉(Crossover)和变异(Mutation)等操作,生成新一代的个体,并重复这一过程,直到找到满足条件的最优解或达到预定的迭代次数。

选择操作是根据个体的适应度,选择出适应度较高的个体作为父母,参与下一代的生成。

常见的选择算法有轮盘赌选择(Roulette Wheel Selection)、锦标赛选择(Tournament Selection)等。

matlab遗传算法 算例

matlab遗传算法 算例

下面是一个使用MATLAB实现的基本遗传算法算例。

本例用于解决简单的优化问题:寻找函数f(x) = x^2在[-10,10]范围内的最小值。

```matlab定义问题参数PopSize = 100; 种群数量Genes = -10:0.1:10; 基因范围FitnessFunc = @(x) -x.^2; 适应度函数(这里为了方便,使用了-x^2,即求最大值,实际应用中应改为-f(x))MaxGen = 50; 最大迭代次数初始化种群Pop = zeros(PopSize, length(Genes));for i = 1:PopSizePop(i,:) = rand(1,length(Genes))*2*Genes - Genes; 随机产生初始种群end开始迭代for gen = 1:MaxGen计算当前种群适应度Fitness = FitnessFunc(Pop);[BestFit, Index] = max(Fitness); 找到最佳适应度BestFitPos = Pop(Index,:); 找到最佳适应度对应的基因选择(轮盘赌选择)NewPop = zeros(PopSize, length(Genes));SumFitness = sum(Fitness);RandomFitness = rand(PopSize,1)*SumFitness; 随机生成每个个体的"随机适应度"for i = 1:PopSize[~, Index] = min(RandomFitness); 用随机适应度进行选择(越小被选中概率越大)NewPop(i,:) = Pop(Index,:); 将选择出的个体放入新种群RandomFitness(Index) = SumFitness; 将已选择的个体的随机适应度设为最大值,避免重复选择end交叉(杂交)for i = 1:PopSize/2随机选择两个父代个体Parent1 = NewPop(randi([1 PopSize]),:);Parent2 = NewPop(randi([1 PopSize]),:);生成新个体Child1 = (Parent1 + Parent2)/2; 中间值交叉Child2 = Parent1 + (Parent2 - Parent1)*rand; 一点交叉将新个体加入新种群NewPop((i-1)*2+1,:) = Child1;NewPop((i-1)*2+2,:) = Child2;end变异for i = 1:PopSizeif rand < 0.01 变异概率为0.01随机选择一个基因进行变异(取反)GeneIdx = randi(length(Genes));NewPop(i,GeneIdx) = ~NewPop(i,GeneIdx);endend更新种群Pop = NewPop;end输出结果BestFit = FitnessFunc(BestFitPos);fprintf('Best fitness: f\n', BestFit);fprintf('Best position: s\n', num2str(BestFitPos));```这个例子比较简单,只用了基本的遗传算法操作:选择、交叉和变异。

遗传算法matlab代码

遗传算法matlab代码

function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunablegeneration=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=randperm(N-2)+2; % 随机配对交叉A=fatherrand(:,ind(1:(N-2)/2));B=fatherrand(:,ind((N-2)/2+1:end));% 多点交叉rnd=rand(num,(N-2)/2);ind=rnd tmp=A(ind);A(ind)=B(ind);B(ind)=tmp;% % 两点交叉% for kk=1:(N-2)/2% rndtmp=randint(1,1,num)+1;% tmp=A(1:rndtmp,kk);% A(1:rndtmp,kk)=B(1:rndtmp,kk);% B(1:rndtmp,kk)=tmp;% endfatherrand=[fatherrand(:,1:2),A,B];% 变异rnd=rand(num,N);ind=rnd [m,n]=size(ind);tmp=randint(m,n,2)+1;tmp(:,1:2)=0;fatherrand=tmp+fatherrand;fatherrand=mod(fatherrand,3);% fatherrand(ind)=tmp;%评价、选择scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数score(generation,:)=scoreN;[scoreSort,scoreind]=sort(scoreN);sumscore=cumsum(scoreSort);sumscore=sumscore./sumscore(end);childind(1:2)=scoreind(end-1:end);for k=3:N tmprnd=rand;tmpind=tmprnd difind=[0,diff(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=max(score,[],2);minV=11*300-maxV;plot(minV,'*');title('各代的目标函数值');F4=D(:,4);FF4=F4-fatherrand(:,1);FF4=max(FF4,1);D(:,5)=FF4;save DData Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end% get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[F1,F2,F3,F4];function ScoreN=scorefun(fatherrand,D)F3=D(:,3);F4=D(:,4);N=size(fatherrand,2);FF4=F4*ones(1,N);FF4rnd=FF4-fatherrand;FF4rnd=max(FF4rnd,1);ScoreN=ones(1,N)*300*11;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。

matlab中的遗传算法

matlab中的遗传算法

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实现遗传算法

用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的用法。

遗传算法MATLAB完整代码(不用工具箱)

遗传算法MATLAB完整代码(不用工具箱)

遗传算法MATLAB完整代码(不用工具箱)遗传算法解决简单问题%主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在区间[-2,2]上的最大值clc;clear all;close all;global BitLengthglobal boundsbeginglobal boundsendbounds=[-2,2];precision=0.0001;boundsbegin=bounds(:,1);boundsend=bounds(:,2);%计算如果满足求解精度至少需要多长的染色体BitLength=ceil(log2((boundsend-boundsbegin)'./precision));popsize=50; %初始种群大小Generationmax=12; %最大代数pcrossover=0.90; %交配概率pmutation=0.09; %变异概率%产生初始种群population=round(rand(popsize,BitLength));%计算适应度,返回适应度Fitvalue和累计概率cumsump[Fitvalue,cumsump]=fitnessfun(population);Generation=1;while Generation<generationmax+1< p="">for j=1:2:popsize%选择操作seln=selection(population,cumsump);%交叉操作scro=crossover(population,seln,pcrossover);scnew(j,:)=scro(1,:);scnew(j+1,:)=scro(2,:);%变异操作smnew(j,:)=mutation(scnew(j,:),pmutation);smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);endpopulation=scnew; %产生了新的种群%计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population);%记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue);fmean=mean(Fitvalue);ymax(Generation)=fmax;ymean(Generation)=fmean;%记录当前代的最佳染色体个体x=transform2to10(population(nmax,:));%自变量取值范围是[-2,2],需要把经过遗传运算的最佳染色体整合到[-2,2]区间xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);xmax(Generation)=xx;Generation=Generation+1;endGeneration=Generation-1;Bestpopulation=xx;Besttargetfunvalue=targetfun(xx);%绘制经过遗传运算后的适应度曲线。

遗传算法matlab程序代码

遗传算法matlab程序代码

遗传算法matlab程序代码遗传算法是一种优化算法,用于在给定的搜索空间中寻找最优解。

在Matlab中,可以通过以下代码编写一个基本的遗传算法:% 初始种群大小Npop = 100;% 搜索空间维度ndim = 2;% 最大迭代次数imax = 100;% 初始化种群pop = rand(Npop, ndim);% 最小化目标函数fun = @(x) sum(x.^2);for i = 1:imax% 计算适应度函数fit = 1./fun(pop);% 选择操作[fitSort, fitIndex] = sort(fit, 'descend');pop = pop(fitIndex(1:Npop), :);% 染色体交叉操作popNew = zeros(Npop, ndim);for j = 1:Npopparent1Index = randi([1, Npop]);parent2Index = randi([1, Npop]);parent1 = pop(parent1Index, :);parent2 = pop(parent2Index, :);crossIndex = randi([1, ndim-1]);popNew(j,:) = [parent1(1:crossIndex),parent2(crossIndex+1:end)];end% 染色体突变操作for j = 1:NpopmutIndex = randi([1, ndim]);mutScale = randn();popNew(j, mutIndex) = popNew(j, mutIndex) + mutScale;end% 更新种群pop = [pop; popNew];end% 返回最优解[resultFit, resultIndex] = max(fit);result = pop(resultIndex, :);以上代码实现了一个简单的遗传算法,用于最小化目标函数x1^2 + x2^2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法的概念最早是由Bagley J.D 于1967年提出的。

后来Michigan大学的J.H.Holland 教授于1975年开始对遗传算法(Genetic Algorithm, GA)的机理进行系统化的研究。

遗传算法是对达尔文生物进化理论的简单模拟,其遵循“适者生存”、“优胜略汰”的原理。

遗传算法模拟一个人工种群的进化过程,并且通过选择、杂交以及变异等机制,种群经过若干代以后,总是达到最优(或近最优)的状态。

自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。

遗传算法也是当前“软计算”领域的重要研究课题。

本文首先结合MATLAB对遗传算法实现过程进行详细的分析,然后通过1个实际的函数优化案例对其应用进行探讨。

1. 遗传算法实现过程现实生活中很多问题都可以转换为函数优化问题,所以本文将以函数优化问题作为背景,对GA的实现过程进行探讨。

大部分函数优化问题都可以写成求最大值或者最小值的形式,为了不是一般性,我们可以将所有求最优值的情况都转换成求最大值的形式,例如,求函数f(x)的最大值,若是求函数f(x)的最小值,可以将其转换成g(x)=-f(x),然后求g(x)的最大值,这里x可以是一个变量,也可是是一个由k个变量组成的向量, x=(x1, x2, …, xk)。

每个xi, i=1,2,…,k, 其定义域为Di,Di=[ai, bi]。

一般规定f(x)在其定义域内只取正值,若不满足,可以将其转换成以下形式,其中C是一个正常数。

1.1 编码与解码要实现遗传算法首先需要弄清楚如何对求解问题进行编码和解码。

对于函数优化问题,一般来说,有两种编码方式,一是实数编码,一是二进制编码,两者各有优缺点,二进制编码具有稳定性高、种群多样性大等优点,但是需要的存储空间大,需要解码过程并且难以理解;而实数编码直接用实数表示基因,容易理解并且不要解码过程,但是容易过早收敛,从而陷入局部最优。

本文以最常用的二进制编码为例,说明遗传编码的过程。

从遗传算法求解的过程来看,需要处理好两个空间的问题,一个是编码空间,另一个是解空间,如下图所示从解空间到编码空间的映射过程成为编码过程;从编码空间到解空间的映射过程成为解码过程。

下面就以求解一个简单的一维函数f(x) = -(x-1)^2+4, x的取值范围为[-1,3]最大值为例,来说明编码及解码过程。

编码:在编码之前需要确定求解的精度,在这里,我们设定求解的精度为小数点后四位,即1e-4。

这样可以将每个自变量xi的解空间划分为个等分。

以上面这个函数为例,即可以将x的解空间划分为(3-(-1))*1e+4=40000个等分。

使ni满足,这里ni表示使上式成立的最小整数,即表示自变量xi的基因串的长度。

因为215<40000<216 ,这里ni取16。

例如0000110110000101就表示一个解空间中的基因串。

表示所有自变量x=(x1, x2, …, xk)的二进制串的总长度称为一个染色体(Chromosome)的长度或者一个个体(Individual)的长度,。

编码过程一般在实现遗传算法之前需要指定。

解码:解码即将编码空间中的基因串翻译成解空间中的自变量的实际值的过程。

对于二进制编码而言,每个二进制基因串都可以这样翻译成一个十进制实数值,。

例如基因串0000110110000101,可以翻译为,这里二进制基因串转变成十进制是从左至右进行的。

1.2 初始化种群在开始遗传算法迭代过程之前,需要对种群进行初始化。

设种群大小为pop_size,每个染色体或个体的长度为chromo_size,种群的大小决定了种群的多样性,而染色体的长度则是由前述的编码过程决定的。

一般随机生成初始种群,但是如果知道种群的实际分布,也可以按照此分布来生成初始种群。

假设生成的初始种群为(v1, v2, …, vpop_size)。

1.3 选择操作选择操作即从前代种群中选择个体到下一代种群的过程。

一般根据个体适应度的分布来选择个体。

以初始种群(v1, v2, …, vpop_size)为例,假设每个个体的适应度为(fitness(v1), fitness(v2),…, fitness(vpop_size)),一般适应度可以按照解码的过程进行计算。

以轮盘赌的方式选择个体,如下图随机转动一下轮盘,当轮盘停止转动时,若指针指向某个个体,则该个体被选中。

很明显,具有较高适应度的个体比具有较低适应度的个体更有机会被选中。

但是这种选择具有随机性,在选择的过程中可能会丢失掉比较好的个体,所以可以使用精英机制,将前代最优个体直接选到下一代中。

轮盘赌选择具体算法如下(这里假定种群中个体是按照适应度从小到大进行排列的,如果不是,可以按照某种排序算法对种群个体进行重排):Selection Algorithmvar pop, pop_new;/*pop为前代种群,pop_new为下一代种群*/varfitness_value, fitness_table;/*fitness_value为种群的适应度,fitness_table为种群累积适应度*/for i=1:pop_sizer = rand*fitness_table(pop_size);/*随机生成一个随机数,在0和总适应度之间,因为fitness_table(pop_size)为最后一个个体的累积适应度,即为总适应度*/first = 1;last = pop_size;mid = round((last+first)/2);idx = -1;/*下面按照排中法选择个体*/while (first <= last) && (idx == -1)if r >fitness_table(mid)first = mid;elseif r <fitness_table(mid)last = mid;elseidx = mid;break;end ifmid = round((last+first)/2);if (last - first) == 1idx = last;break;end ifend whilefor j=1:chromo_sizepop_new(i,j)=pop(idx,j);end forend for/*是否精英选择*/if elitismp = pop_size-1;elsep = pop_size;end iffor i=1:pfor j=1:chromo_sizepop(i,j) = pop_new(i,j);/*若是精英选择,则只将pop_new前pop_size-1个个体赋给pop,最后一个为前代最优个体保留*/end forend for1.3 交叉操作交叉操作是对任意两个个体进行的(在这里我们实现的算法是直接对相邻的两个个体进行的)。

随机选择两个个体,如下图所示然后随机生成一个实数0<=r<=1, 如果r<cross_rate,0<cross_rate<1为交叉概率,则对这两个个体进行交叉,否则则不进行。

如果需要进行交叉,再随机选择交叉位置(rand*chromo_size),如果等于0或者1,将不进行交叉。

否则将交叉位置以后的二进制串进行对换(包括交叉位置)。

(注意:有时候还可以进行多点交叉,但是这里只讨论单点交叉的情况)单点交叉具体算法如下:Crossover algorithmfor i=1:2:pop_sizeif(rand <cross_rate)/*cross_rate为交叉概率*/cross_pos = round(rand * chromo_size);/*交叉位置*/if or (cross_pos == 0, cross_pos == 1)continue;/*若交叉位置为0或1,则不进行交叉*/end iffor j=cross_pos:chromo_sizepop(i,j)<->pop(i+1,j);/*交换*/end forend ifend for1.4 变异操作变异操作是对单个个体进行的。

首先生成一个随机实数0<=r<=1, 如果r<mutate_rate,则对此个体进行变异操作,0<mutate_rate<1为变异概率,一般为一个比较小的实数。

对每一个个体,进行变异操作,如下图所示如个体需要进行变异操作,首先需要确定变异位置(rand*chromo_size),若为0则不进行变异,否则则对该位置的二进制数字进行变异:1变成0, 0变成1.(当然也可以选择多点进行变异)单点变异的具体算法描述如下:Mutation algorithmfor i=1:pop_sizeif rand <mutate_rate/*mutate_rate为变异概率*/mutate_pos = round(rand*chromo_size);/*变异位置*/if mutate_pos == 0continue;/*若变异位置为0,则不进行变异*/end ifpop(i,mutate_pos) = 1 - pop(i, mutate_pos);/*将变异位置上的数字至反*/ end ifend for1.5 遗传算法流程遗传算法计算流程图如下图所示1.6 MA TLAB程序实现初始化:%初始化种群%pop_size: 种群大小%chromo_size: 染色体长度function initilize(pop_size, chromo_size)global pop;for i=1:pop_sizefor j=1:chromo_sizepop(i,j) = round(rand);endendclear i;clear j;计算适应度:(该函数应该根据具体问题进行修改,这里优化的函数是前述的一维函数)%计算种群个体适应度,对不同的优化目标,此处需要改写%pop_size: 种群大小%chromo_size: 染色体长度function fitness(pop_size, chromo_size)global fitness_value;global pop;global G;for i=1:pop_sizefitness_value(i) = 0.;endfor i=1:pop_sizefor j=1:chromo_sizeif pop(i,j) == 1fitness_value(i) = fitness_value(i)+2^(j-1);endendfitness_value(i) = -1+fitness_value(i)*(3.-(-1.))/(2^chromo_size-1);fitness_value(i) = -(fitness_value(i)-1).^2+4;endclear i;clear j;对个体按照适应度大小进行排序:%对个体按适应度大小进行排序,并且保存最佳个体%pop_size: 种群大小%chromo_size: 染色体长度function rank(pop_size, chromo_size)global fitness_value;global fitness_table;global fitness_avg;global best_fitness;global best_individual;global best_generation;global pop;global G;for i=1:pop_sizefitness_table(i) = 0.;endmin = 1;temp = 1;temp1(chromo_size)=0;for i=1:pop_sizemin = i;for j = i+1:pop_sizeif fitness_value(j)<fitness_value(min);min = j;endendif min~=itemp = fitness_value(i);fitness_value(i) = fitness_value(min);fitness_value(min) = temp;for k = 1:chromo_sizetemp1(k) = pop(i,k);pop(i,k) = pop(min,k);pop(min,k) = temp1(k);endendendfor i=1:pop_sizeif i==1fitness_table(i) = fitness_table(i) + fitness_value(i);elsefitness_table(i) = fitness_table(i-1) + fitness_value(i);endendfitness_tablefitness_avg(G) = fitness_table(pop_size)/pop_size;if fitness_value(pop_size) >best_fitnessbest_fitness = fitness_value(pop_size);best_generation = G;for j=1:chromo_sizebest_individual(j) = pop(pop_size,j);endendclear i;clear j;clear k;clear min;clear temp;clear temp1;选择操作:%轮盘赌选择操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 是否精英选择function selection(pop_size, chromo_size, elitism) global pop;global fitness_table;for i=1:pop_sizer = rand * fitness_table(pop_size);first = 1;last = pop_size;mid = round((last+first)/2);idx = -1;while (first <= last) && (idx == -1) if r >fitness_table(mid)first = mid;elseif r <fitness_table(mid)last = mid;elseidx = mid;break;endmid = round((last+first)/2);if (last - first) == 1idx = last;break;endendfor j=1:chromo_sizepop_new(i,j)=pop(idx,j);endendif elitismp = pop_size-1;elsep = pop_size;endfor i=1:pfor j=1:chromo_sizepop(i,j) = pop_new(i,j);endendclear i;clear j;clear pop_new;clear first;clear last;clear idx;clear mid;交叉操作:%单点交叉操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 交叉概率function crossover(pop_size, chromo_size, cross_rate) global pop;for i=1:2:pop_sizeif(rand <cross_rate)cross_pos = round(rand * chromo_size);if or (cross_pos == 0, cross_pos == 1)continue;endfor j=cross_pos:chromo_sizetemp = pop(i,j);pop(i,j) = pop(i+1,j);pop(i+1,j) = temp;endendendclear i;clear j;clear temp;clear cross_pos;变异操作:%单点变异操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 变异概率function mutation(pop_size, chromo_size, mutate_rate) global pop;for i=1:pop_sizeif rand <mutate_ratemutate_pos = round(rand*chromo_size);if mutate_pos == 0continue;endpop(i,mutate_pos) = 1 - pop(i, mutate_pos);endendclear i;clear mutate_pos;打印算法迭代过程:%打印算法迭代过程%generation_size: 迭代次数function plotGA(generation_size)global fitness_avg;x = 1:1:generation_size;y = fitness_avg;plot(x,y)算法主函数:%遗传算法主函数%pop_size: 输入种群大小%chromo_size: 输入染色体长度%generation_size: 输入迭代次数%cross_rate: 输入交叉概率%cross_rate: 输入变异概率%elitism: 输入是否精英选择%m: 输出最佳个体%n: 输出最佳适应度%p: 输出最佳个体出现代%q: 输出最佳个体自变量值function [m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate, elitism)global G ; %当前代global fitness_value;%当前代适应度矩阵global best_fitness;%历代最佳适应值global fitness_avg;%历代平均适应值矩阵global best_individual;%历代最佳个体global best_generation;%最佳个体出现代fitness_avg = zeros(generation_size,1);disp "hhee"fitness_value(pop_size) = 0.;best_fitness = 0.;best_generation = 0;initilize(pop_size, chromo_size);%初始化for G=1:generation_sizefitness(pop_size, chromo_size); %计算适应度rank(pop_size, chromo_size); %对个体按适应度大小进行排序selection(pop_size, chromo_size, elitism);%选择操作crossover(pop_size, chromo_size, cross_rate);%交叉操作mutation(pop_size, chromo_size, mutate_rate);%变异操作endplotGA(generation_size);%打印算法迭代过程m = best_individual;%获得最佳个体n = best_fitness;%获得最佳适应度p = best_generation;%获得最佳个体出现代%获得最佳个体变量值,对不同的优化目标,此处需要改写q = 0.;for j=1:chromo_sizeif best_individual(j) == 1q = q+2^(j-1);endendq = -1+q*(3.-(-1.))/(2^chromo_size-1);clear i;clear j;2. 案例研究对上一节中的函数进行优化,设置遗传算法相关参数,程序如下function run_ga()elitism = true;%选择精英操作pop_size = 20;%种群大小chromo_size = 16;%染色体大小generation_size = 200;%迭代次数cross_rate = 0.6;%交叉概率mutate_rate = 0.01;%变异概率[m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate,elitism);disp "最优个体"mdisp "最优适应度"ndisp "最优个体对应自变量值"qdisp "得到最优结果的代数"pclear;结果如下:"最优个体"m =1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"最优适应度"n =4.0000"最优个体对应自变量值"q =1.0000"得到最优结果的代数"p =74此结果非常准确。

相关文档
最新文档