遗传算法matlab

合集下载

用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是一个高性能的数学计算软件,它集成了许多数学工具箱,其中包括遗传算法工具箱,可以帮助用户利用遗传算法求解最优化问题。

遗传算法是一种模拟生物进化过程的优化方法,通过模拟自然选择、交叉和变异等操作,不断优化解的搜索空间,从而找到最优解。

二、遗传算法求最大值步骤1. 创建遗传算法对象我们需要使用Matlab的遗传算法工具箱中的函数`ga`来创建一个遗传算法对象。

在创建对象时,需要指定优化的目标函数、决策变量的上下界、约束条件等参数,以及遗传算法的种裙大小、进化代数等参数。

例如:```matlaboptions = gaoptimset('Generations', 100, 'PopulationSize', 50); [x, fval, exitflag, output] = ga(fitnessfun, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options);```其中,`fitnessfun`是用户自定义的目标函数,`nvars`是决策变量的个数,`A`, `b`, `Aeq`, `beq`是线性约束条件,`lb`, `ub`是决策变量的上下界,`nonlcon`是非线性约束条件,`options`是遗传算法的参数设置。

2. 编写目标函数用户需要编写自己的目标函数`fitnessfun`,该函数接受决策变量作为输入,并返回一个标量作为目标值。

例如:```matlabfunction y = fitnessfun(x)y = -sum(x.^2);end```在这个例子中,我们希望求解一个多维的最大化问题,因此目标函数返回了决策变量的负平方和作为最优解的评价指标。

3. 运行遗传算法一切准备就绪后,我们可以调用`ga`函数来运行遗传算法,并获取最优解和最优值。

遗传算法会不断进化种裙,直到达到指定的进化代数为止。

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中的遗传算法

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中的遗传算法拟合

matlab中的遗传算法拟合在MATLAB中,遗传算法是一种常用的优化算法,可以用于拟合数据。

遗传算法是一种模拟自然进化过程的优化算法,通过模拟基因的交叉、变异和选择等操作,逐步优化解的质量。

下面我将从多个角度介绍在MATLAB中使用遗传算法进行拟合的步骤和注意事项:1. 准备数据,首先,你需要准备一组实验数据,包括自变量和因变量。

确保数据的准确性和完整性,以获得准确的拟合结果。

2. 定义适应度函数,适应度函数用于评估每个个体的适应程度,即拟合程度。

在拟合问题中,适应度函数通常是计算预测值与实际值之间的误差或损失函数。

你需要根据具体问题定义适应度函数。

3. 初始化种群,在遗传算法中,种群是由多个个体组成的集合。

每个个体代表一个可能的解。

你需要初始化一个种群,设置种群大小和每个个体的基因编码。

4. 选择操作,选择操作用于选择适应度较高的个体作为父代,用于产生下一代个体。

常用的选择方法包括轮盘赌选择、锦标赛选择等。

你可以根据具体问题选择适合的选择操作。

5. 交叉操作,交叉操作模拟基因的交换,通过将两个个体的基因进行交叉,产生新的个体。

交叉操作有多种方式,如单点交叉、多点交叉等。

选择合适的交叉操作方式可以增加种群的多样性。

6. 变异操作,变异操作模拟基因的突变,通过改变个体的某些基因值来引入新的解。

变异操作有多种方式,如位变异、均匀变异等。

变异操作可以增加种群的多样性,避免陷入局部最优解。

7. 更新种群,通过选择、交叉和变异操作,生成新的个体,更新种群。

8. 迭代优化,重复进行选择、交叉和变异操作,直到达到停止条件。

停止条件可以是达到最大迭代次数、达到预定的适应度阈值或者经过一定的迭代次数后适应度不再改变等。

9. 解码和评估,在每次迭代后,对新生成的个体进行解码,转换为实际的参数值。

然后,使用适应度函数评估个体的适应程度。

10. 结果分析,最后,根据迭代过程中适应度的变化情况,选择适应度最高的个体作为最终的拟合结果。

遗传算法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中,可以通过以下代码编写一个基本的遗传算法:% 初始种群大小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。

matlab 自带的粒子群和遗传算法

matlab 自带的粒子群和遗传算法粒子群优化算法(Particle Swarm Optimization, PSO)和遗传算法(Genetic Algorithm, GA)是两种常用的进化计算算法,常用于求解优化问题。

在 MATLAB 中,内置了对这两种算法的支持。

粒子群优化算法是一种通过模拟鸟群或鱼群的行为方式来进行优化的算法。

该算法通过维护一个粒子群,每个粒子代表一个解,通过迭代优化粒子的位置来逐步寻找最优解。

在MATLAB 中,可以使用 `pso` 函数来实现粒子群优化算法。

```matlab[x, fval] = pso(@objective, nvars, lb, ub)```其中 `@objective` 是目标函数的句柄,`nvars` 是变量个数,`lb` 和 `ub` 分别是各个变量的下界和上界。

函数返回的 `x` 是最优解,`fval` 是最优解对应的目标函数值。

遗传算法是一种通过模拟生物进化过程来进行优化的算法。

该算法通过定义适应度函数来评价每个个体的适应度,并使用遗传操作(交叉、变异、选择)来进化种群,从而逐步寻找最优解。

在 MATLAB 中,可以使用 `ga` 函数来实现遗传算法。

```matlab[x, fval] = ga(@objective, nvars, [], [], [], [], lb, ub)```其中 `@objective` 是目标函数的句柄,`nvars` 是变量个数,`lb` 和 `ub` 分别是各个变量的下界和上界。

函数返回的 `x` 是最优解,`fval` 是最优解对应的目标函数值。

在使用这两种算法时,需要自定义目标函数 `@objective` 来适应具体的优化问题。

目标函数的输入是一个向量,表示待优化的变量,输出是一个标量,表示对应变量的适应度或目标函数值。

以下是一个示例,使用粒子群优化算法和遗传算法来求解一个简单的函数优化问题:```matlab% Objective functionfunction f = objective(x)f = sin(x) + cos(2*x);end% Particle swarm optimizationnvars = 1; % Number of variableslb = -10; % Lower bound of variableub = 10; % Upper bound of variable[x_pso, fval_pso] = pso(@objective, nvars, lb, ub);% Genetic algorithm[x_ga, fval_ga] = ga(@objective, nvars, [], [], [], [], lb, ub);disp("Particle Swarm Optimization:")disp("Best solution: " + x_pso)disp("Objective value: " + fval_pso)disp("Genetic Algorithm:")disp("Best solution: " + x_ga)disp("Objective value: " + fval_ga)```在上述示例中,首先定义了一个简单的目标函数 `objective`,然后分别使用粒子群优化算法和遗传算法来求解最优化问题。

遗传算法 matlab

遗传算法 Matlab什么是遗传算法?遗传算法是一种模拟生物进化过程的优化算法。

它模拟了自然界中的遗传、突变和选择等过程,利用这些操作来搜索和优化问题的解空间。

遗传算法具有以下几个关键步骤:1.初始化种群:通过生成一组随机解来初始化初始种群。

每个解被编码为一个染色体,染色体通常由二进制字符串表示。

2.评价适应度:使用适应度函数评估每个个体的适应度。

适应度函数通常通过衡量个体在解空间中的性能来定义。

3.选择操作:选择操作基于个体的适应度进行,通过概率选择操作来确定哪些个体应该参与繁殖下一代。

适应度较高的个体有更大的概率被选中。

4.交叉操作:选择的个体进行交叉操作,生成下一代的染色体。

交叉操作通过交换个体染色体中的信息来生成新的个体。

5.变异操作:为了保持种群的多样性,变异操作在染色体中进行随机的变异。

这个过程通过随机改变染色体中的部分基因来进行。

6.替换操作:根据新生成的染色体替换当前种群中某些个体,以此来形成新的种群。

7.重复上述步骤:重复执行上述步骤直到满足终止条件(例如达到最大迭代次数或找到满意的解)。

如何在 Matlab 中实现遗传算法?在 Matlab 中,可以使用遗传算法和优化工具箱来实现遗传算法。

以下是实现遗传算法的一般步骤:1.定义适应度函数:根据具体问题定义适应度函数,该函数衡量每个个体在解空间中的性能。

适应度函数的设计将影响到最终结果。

2.初始化种群:使用内置函数或自定义函数来生成初始种群。

每个个体都应该表示为染色体形式的解。

3.设置遗传算法参数:根据具体问题设置遗传算法的参数,如种群大小、迭代次数、选择操作和交叉操作的概率等。

4.编写遗传算法主循环:在主循环中,使用选择操作、交叉操作和变异操作来生成新的染色体,并计算每个个体的适应度。

5.选择操作:使用选择函数根据适应度值选择染色体。

具体的选择函数可以根据问题的特点进行调整。

6.交叉操作:使用交叉函数对染色体进行交叉操作,生成下一代的染色体。

遗传算法在matlab中的实现

遗传算法是一种模拟自然选择与遗传机制的优化算法,它模拟了生物进化的过程,通过优化个体的基因型来达到解决问题的目的。

在工程和科学领域,遗传算法被广泛应用于求解优化问题、寻找最优解、参数优化等领域。

而MATLAB作为一款强大的科学计算软件,拥有丰富的工具箱和编程接口,为实现遗传算法提供了便利。

下面将通过以下步骤介绍如何在MATLAB中实现遗传算法:1. 引入遗传算法工具箱需要在MATLAB环境中引入遗传算法工具箱。

在MATLAB命令窗口输入"ver",可以查看当前已安装的工具箱。

如果遗传算法工具箱未安装,可以使用MATLAB提供的工具箱管理界面进行安装。

2. 定义优化问题在实现遗传算法前,需要清楚地定义优化问题:包括问题的目标函数、约束条件等。

在MATLAB中,可以通过定义一个函数来表示目标函数,并且可以采用匿名函数的形式来灵活定义。

对于约束条件,也需要进行明确定义,以便在遗传算法中进行约束处理。

3. 设置遗传算法参数在实现遗传算法时,需要对遗传算法的参数进行设置,包括种群大小、交叉概率、变异概率、迭代次数等。

这些参数的设置将会直接影响遗传算法的收敛速度和优化效果。

在MATLAB中,可以通过设置遗传算法工具箱中的相关函数来完成参数的设置。

4. 编写遗传算法主程序编写遗传算法的主程序,主要包括对适应度函数的计算、选择、交叉、变异等操作。

在MATLAB中,可以利用遗传算法工具箱提供的相关函数来实现这些操作,简化了遗传算法的实现过程。

5. 运行遗传算法将编写好的遗传算法主程序在MATLAB环境中运行,并观察优化结果。

在运行过程中,可以对结果进行实时监测和分析,以便对遗传算法的参数进行调整和优化。

通过以上步骤,可以在MATLAB中实现遗传算法,并应用于实际的优化问题与工程应用中。

遗传算法的实现将大大提高问题的求解效率与精度,为工程领域带来更多的便利与可能性。

总结:遗传算法在MATLAB中的实现涉及到了引入遗传算法工具箱、定义优化问题、设置算法参数、编写主程序和运行算法等步骤。

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

% 下面举例说明遗传算法%% 求下列函数的最大值%% 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] 中的一个二值数。

%% %%--------------------------------------------------------------------------------------------------------------%%--------------------------------------------------------------------------------------------------------------%% 编程%-----------------------------------------------% 2.1初始化(编码)% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。

%遗传算法子程序%Name: initpop.m%初始化function pop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为{0,1} 行数为popsize,列数为chromlength的矩阵,% roud对矩阵的每个单元进行圆整。

这样产生的初始种群。

% 2.2 计算目标函数值% 2.2.1 将二进制数转化为十进制数(1)%遗传算法子程序%Name: decodebinary.m%产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制function pop2=decodebinary(pop)[px,py]=size(pop); %求pop行和列数for i=1:pypop1(:,i)=2.^(py-i).*pop(:,i);endpop2=sum(pop1,2); %求pop1的每行之和% 2.2.2 将二进制编码转化为十进制数(2)% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置% (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。

本例为1),% 参数1ength表示所截取的长度(本例为10)。

%遗传算法子程序%Name: decodechrom.m%将二进制编码转换成十进制function pop2=decodechrom(pop,spoint,length)pop1=pop(:,spoint:spoint+length-1);pop2=decodebinary(pop1);% 2.2.3 计算目标函数值% calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

%遗传算法子程序%Name: calobjvalue.m%实现目标函数的计算function [objvalue]=calobjvalue(pop)temp1=decodechrom(pop,1,10); %将pop每行转化成十进制数x=temp1*10/1023; %将二值域中的数转化为变量域的数objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函数值% 2.3 计算个体的适应值%遗传算法子程序%Name:calfitvalue.m%计算个体的适应值function fitvalue=calfitvalue(objvalue)global Cmin;Cmin=0;[px,py]=size(objvalue);for i=1:pxif objvalue(i)+Cmin>0temp=Cmin+objvalue(i);elsetemp=0.0;endfitvalue(i)=temp;endfitvalue=fitvalue';% 2.4 选择复制% 选择或复制操作是决定哪些个体可以进入下一代。

程序中采用赌轮盘选择法选择,这种方法较易实现。

% 根据方程pi=fi/∑fi=fi/fsum ,选择步骤:% 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%选择复制function [newpop]=selection(pop,fitvalue)totalfit=sum(fitvalue); %求适应值之和fitvalue=fitvalue/totalfit; %单个个体被选择的概率fitvalue=cumsum(fitvalue); %如fitvalue=[1 2 3 4],则cumsum(fitvalue)=[1 3 6 10][px,py]=size(pop);ms=sort(rand(px,1)); %从小到大排列fitin=1;newin=1;while newin<=pxif(ms(newin))<fitvalue(fitin)newpop(newin)=pop(fitin);newin=newin+1;elsefitin=fitin+1;endend% 2.5 交叉% 交叉(crossover),群体中的每个个体之间都以一定的概率pc 交叉,即两个个体从各自字符串的某一位置% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。

例如,假设2个父代个体x1,x2为:% x1=0100110% x2=1010001% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:% y1=0100001% y2=1010110% 这样2个子代个体就分别具有了2个父代个体的某些特征。

利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。

% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。

%遗传算法子程序%Name: crossover.m%交叉function [newpop]=crossover(pop,pc)[px,py]=size(pop);newpop=ones(size(pop));for i=1:2:px-1if(rand<pc)cpoint=round(rand*py);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)];elsenewpop(i,:)=pop(i);newpop(i+1,:)=pop(i+1);endend% 2.6 变异% 变异(mutation),基因的突变普遍存在于生物的进化过程中。

变异是指父代中的每个个体的每一位都以概率pm 翻转,即由“1”变为“0”,% 或由“0”变为“1”。

遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。

%遗传算法子程序%Name: mutation.m%变异function [newpop]=mutation(pop,pm)[px,py]=size(pop);newpop=ones(size(pop));for i=1:pxif(rand<pm)mpoint=round(rand*py);if mpoint<=0mpoint=1;endnewpop(i)=pop(i);if any(newpop(i,mpoint))==0newpop(i,mpoint)=1;elsenewpop(i,mpoint)=0;endelsenewpop(i)=pop(i);endend% 2.7 求出群体中最大得适应值及其个体%遗传算法子程序%Name: best.m%求出群体中适应值最大的值function [bestindividual,bestfit]=best(pop,fitvalue)[px,py]=size(pop);bestindividual=pop(1,:);bestfit=fitvalue(1);for i=2:pxif fitvalue(i)>bestfitbestindividual=pop(i,:);bestfit=fitvalue(i);endend% 2.8 主程序%遗传算法主程序%Name:genmain05.mclearclfpopsize=20; %群体大小chromlength=10; %字符串长度(个体长度)pc=0.6; %交叉概率pm=0.001; %变异概率pop=initpop(popsize,chromlength); %随机产生初始群体for i=1:20 %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);n(i)=i;pop5=bestindividual;x(i)=decodechrom(pop5,1,chromlength)*10/1023;pop=newpop;endfplot('10*sin(5*x)+7*cos(4*x)',[0 10])hold onplot(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【程序清单】%编写目标函数function[sol,eval]=fitness(sol,options)x=sol(1);%把上述函数存储为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)注:遗传算法一般用来取得近似最优解,而不是最优解。

相关文档
最新文档