导航:首页 > 源码编译 > 遗传算法辨识程序

遗传算法辨识程序

发布时间:2023-04-01 16:09:38

❶ 遗传神经网络识别原理

4.3.1 遗传BP简介

遗传识别是遗传算法+神经网络的一种新兴的寻优技术,适合于复杂的、叠加的非线性系统的辨识描述。神经网络算法是当前较为成熟的识别分类方法,但网络权值的训练一直存在着缺陷。为此结合具体应用,在对遗传算法进行改进的基础上,本文采用了一种基于遗传学习权值的神经网络识别方法,并取得了较好的效果。

尽管常规遗传算法是稳健的,但针对一个具体问题遗传算法只有和其他方法(或称原有算法)有效地结合在一起,组成一个新的混合算法,才能在实际中得到广泛应用。混合算法既要保持原有算法的长处,又要保持遗传算法的优点,因此常规遗传算法中的适应值函数、编码、遗传算子等必须做适当的修改以适应混合算法的要求。

4.3.1.1 适应值信息

常规算法中,适应值常被表示为全局极小,用欧氏距离来实现。例如,适应值常被表示为如下形式:

图4-5 改进的 GABP计算流程图

GABP的计算过程图如图4-5所示。

❷ 遗传算法的matlab代码实现是什么

遗传算法我懂,我的论文就是用着这个算法,具体到你要遗传算法是做什么?优化什么的。。。我给你一个标准遗传算法程序供你参考:
该程序是遗传算法优化BP神经网络函数极值寻优:
%% 该代码为基于神经网络遗传算法的系统极值寻优
%% 清空环境变量
clc
clear

%% 初始化遗传算法参数
%初始化参数
maxgen=100; %进化代数,即迭代次数
sizepop=20; %种群规模
pcross=[0.4]; %交叉概率选择,0和1之间
pmutation=[0.2]; %变异概率选择,0和1之间

lenchrom=[1 1]; %每个变量的字串长度,如果是浮点变量,则长度都为1
bound=[-5 5;-5 5]; %数据范围

indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体
avgfitness=[]; %每一代种群的平均适应度
bestfitness=[]; %每一代种群的最佳适应度
bestchrom=[]; %适应度最好的染色体

%% 初始化种群计算适应度值
% 初始化种群
for i=1:sizepop
%随机产生一个种群
indivials.chrom(i,:)=Code(lenchrom,bound);
x=indivials.chrom(i,:);
%计算适应度
indivials.fitness(i)=fun(x); %染色体的适应度
end
%找最好的染色体
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色体
avgfitness=sum(indivials.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness];

%% 迭代寻优
% 进化开始
for i=1:maxgen
i
% 选择
indivials=Select(indivials,sizepop);
avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 变异
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,[i maxgen],bound);

% 计算适应度
for j=1:sizepop
x=indivials.chrom(j,:); %解码
indivials.fitness(j)=fun(x);
end

%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;

avgfitness=sum(indivials.fitness)/sizepop;

trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
%进化结束

%% 结果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('适应度曲线','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
axis([0,100,0,1])
disp('适应度 变量');
x=bestchrom;
% 窗口显示
disp([bestfitness x]);

❸ 怎么用遗传算法求一函数的极小值,编写matlab程序。

需要很多的子函数
%子程序:新物种交叉操作,函数名称存储为crossover.m
function scro=crossover(population,seln,pc);
BitLength=size(population,2);
pcc=IfCroIfMut(pc);%根据交叉概率决定是否进行交叉操作,1则是,0则否
if pcc==1
chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范围内随机产生一个交叉位
scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)]
scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)]
else
scro(1,:)=population(seln(1),:);
scro(2,:)=population(seln(2),:);
end
%子程序:计算适应度函数,函数名称存储为fitnessfun.m
function [Fitvalue,cumsump]=fitnessfun(population);
global BitLength
global boundsbegin
global boundsend
popsize=size(population,1);%有popsize个个体
for i=1:popsize
x=transform2to10(population(i,:));%将二进制转换为十进制
%转化为[-2,2]区间的实数
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
Fitvalue(i)=targetfun(xx);%计算函数值,即适应度
end
%给适应度函数加上一个大小合理的数以便保证种群适应度值为正数
Fitvalue=Fitvalue'+203;
%计算选择概率
fsum=sum(Fitvalue);
Pperpopulation=Fitvalue/fsum;
%计算累计概率
cumsump(1)=Pperpopulation(1);
for i=2:popsize
cumsump(i)=cumsump(i-1)+Pperpopulation(i);
end
cumsump=cumsump';
%子程序:判断遗传运算是否需要进行交叉或变异,函数名称存储为IfCroIfMut.m
function pcc=IfCroIfMut(mutORcro);
test(1:100)=0;
l=round(100*mutORcro);
test(1:l)=1;
n=round(rand*99)+1;
pcc=test(n);
%子程序:新种群变异操作,函数名称存储为mutation.m
function snnew=mutation(snew,pmutation);
BitLength=size(snew,2);
snnew=snew;
pmm=IfCroIfMut(pmutation);%根据变异概率决定是否进行变异操作,1则是,0则否
if pmm==1
chb=round(rand*(BitLength-1))+1;%在[1,BitLength]范围内随机产生一个变异位
snnew(chb)=abs(snew(chb)-1);
end
%子程序:新种群选择操作,函数名称存储为selection.m
function seln=selection(population,cumsump);
%从种群中选择两个个体
for i=1:2
r=rand;%产生一个随机数
prand=cumsump-r;
j=1;
while prand(j)<0
j=j+1;
end
seln(i)=j;%选中个体的序号
end
%子程序:对于优化最大值或极大值函数问题,目标函数可以作为适应度函数
%函数名称存储为targetfun.m
function y=targetfun(x);%目标函数
%子程序:将二进制数转换为十进制数,函数名称存储为transform2to10.m
function x=transform2to10(Population);
BitLength=size(Population,2);
x=Population(BitLength);
for i=1:BitLength-1
x=x+Population(BitLength-i)*power(2,i);
end
k=[0 0.1 0.2 0.3 0.5 1];
for i=1:1:5
%主程序:用遗传算法求解targetfun.m中目标函数在区间[-2,2]的最大值
clc;
clear all;
close all;
global BitLength
global boundsbegin
global boundsend
bounds=[-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
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);
end%产生了新种群
population=smnew;
%计算新种群的适应度
[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(2,BitLength)-1);
xmax(Generation)=xx;
Generation=Generation+1;
end
Generation=Generation-1;
Bestpopuation=xx;
Besttargetfunvalue=targetfun(xx);
%绘制经过遗传运算后的适应度曲线。一般地,如果进化过程中种群的平均适应度与最大适
%应度在曲线上有相互趋同的形态,表示算法收敛进行得很顺利,没有出现震荡;在这种前
%提下,最大适应度个体连续若干代都没有发生进化表明种群已经成熟
figure(1);
hand1=plot(1:Generation,ymax);
set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6)
hold on;
hand2=plot(1:Generation,ymean);
set(hand2,'color','r','linestyle','-','linewidth',1.8,'marker','h','markersize',6)
xlabel('进化代数');ylabel('(最大/平均适应度)');xlim([1 Generationmax]);
legend('最大适应度','平均适应度');
box off;hold off;
y=(x(i)-k(i))^2-10*sin(2*pi*(x(i)-k(i)))+10;
end

❹ 遗传算法--GA

        遗传算法(GA)属于 人工智能启发式算法 ,启发式算法的目标就是 寻找原始问题的最优解 ,该算法的定义为

         人类通过直观常识和生活经验,设计出一种以搜索最优解为目的,通过仿真大自然规律的算法,该算法在可以在接受的花销(计算时间和存储空间)范围内找到问题实例的一个可行解,且该可行解和真实最优解的误差一般不可以被估计

        当下主要有的启发式算法包括 遗传算法、退火法,蚁群算法、人工神经网络等 ,这篇文章主要介绍遗传算法

        遗传算法的基本原理是模拟达尔文进化论 "物竞天择,适者生存" 的自然法则,其核心思想为

(1)将原始问题的参数,抽象为基因编码

(2)将原始问题的可行解,抽象为基因排列的染色体组合

(3)将原始问题的解集规模,抽象为一定数量染色体组成的种群

(4)寻找可行解的过程,抽象为种群的进化过程(染色体选择、交叉、变异等)

(5)比较可行解的优劣,抽象为量化比较不同种群对当前环境的适应程度

(6)逼近最优解的过程,抽象为淘汰适应度差的种群,保留适应度高的种群进行下一次进化

(7)问题的最优解,抽象为经过多次进化后,最终生存下来的精英种群

        理论上,通过有限次种群进化,生存下来的种群都是 精英染色体 ,是最适合当前环境条件的种群,也就可以无限逼近原始问题的最优解

相关生物学术语:

    为了大家更好了解遗传算法,在此之前先简单介绍一下相关生物学术语,大家了解一下即可。

基因型(genotype):性状染色体的内部表现;

表现型(phenotype):染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现;

进化(evolution):种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的。

适应度(fitness):度量某个物种对于生存环境的适应程度。

选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。

复制(reproction):细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因。

交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;

变异(mutation):复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。

编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。

解码(decoding):基因型到表现型的映射。

个体(indivial):指染色体带有特征的实体;

种群(population):个体的集合,该集合内个体数称为种群

大体实现过程

遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。 遗传算法的实现过程实际上就像自然界的进化过程那样。

基本遗传算法概述

    1.[开始]生成n个染色体的随机群体(适合该问题的解决方案)

    2.[适应度]评估群体中每个染色体x的适应度f(x)

    3.[新种群]通过重复以下来创建新种群直到新种群完成的步骤

        3.1 [选择]根据种群的适合度选择两个亲本染色体(更好的适应性,更大的选择机会)

        3.2 [交叉]以交叉概率跨越父母形成新的后代(儿童) )。如果没有进行交叉,后代就是父母的确切副本。

        3.3 [突变]突变概率突变每个基因座(染色体中的位置)的新后代。

    4.[接受]在新种群中放置新后代[替换]使用新生成的种群进一步运行算法

    5.[测试]如果满足结束条件,则停止并返回当前种群中的最佳解

    6。[循环]转到步骤2

影响GA的因素

    从遗传算法概述可以看出,交叉和变异是遗传算法中最重要的部分。性能主要受这两个因素的影响。在我们解释有关交叉和变异的更多信息之前,我们将给出一些有关染色体的信息。

染色体编码

染色体应该以某种方式包含它所代表的解决方案的信息。最常用的编码方式是二进制字符串。然后染色体看起来像这样:

每个染色体由二进制字符串表示。字符串中的每个位都可以表示解决方案的一些特征。另一种可能性是整个字符串可以表示一个数字 - 这已在基本的GA小程序中使用。当然,还有许多其他的编码方式。编码主要取决于解决的问题。例如,可以直接编码整数或实数,有时对某些排列等进行编码很有用。

染色体交叉

在我们确定了将使用的编码之后,我们可以继续进行交叉操作。 Crossover对来自亲本染色体的选定基因进行操作并产生新的后代。最简单的方法是随机选择一些交叉点,并在此点之前从第一个父项复制所有内容,然后在交叉点之后复制另一个父交叉点之后的所有内容。交叉可以说明如下:( |是交叉点):

还有其他方法可以进行交叉,例如我们可以选择更多的交叉点。交叉可能非常复杂,主要取决于染色体的编码。针对特定问题进行的特定交叉可以改善遗传算法的性能。

4.染色体突变

在执行交叉之后,发生突变。突变旨在防止群体中的所有解决方案落入解决问题的局部最优中。突变操作随机改变由交叉引起的后代。在二进制编码的情况下,我们可以将一些随机选择的位从1切换到0或从0切换到1.突变可以如下所示:

突变(以及交叉)技术主要取决于染色体的编码。例如,当我们编码排列时,可以将突变作为两个基因的交换来进行。

GA的参数

    1.交叉和突变概率

    GA有两个基本参数 - 交叉概率和变异概率。

     交叉概率 :交叉的频率。如果没有交叉,后代就是父母的精确副本。如果存在交叉,则后代由父母染色体的部分组成。如果交叉概率为100%,那么所有后代都是由交叉产生的。如果它是0%,那么全新一代都是从旧种群的染色体的精确拷贝制成的(但这并不意味着新一代是相同的!)。交叉是希望新染色体将包含旧染色体的良好部分,因此新染色体将更好。但是,将旧人口的一部分留给下一代是好的。

     突变概率 :染色体部分突变的频率。如果没有突变,则在交叉(或直接复制)后立即生成后代而不进行任何更改。如果进行突变,则改变染色体的一个或多个部分。如果突变概率为100%,则整个染色体发生变化,如果是0%,则没有变化。突变通常会阻止GA陷入局部极端。突变不应该经常发生,因为GA实际上会改变为随机搜索。

    2.其他参数

     种群规模 :种群中有多少染色体(一代)。如果染色体太少,GA几乎没有可能进行交叉,只探索了一小部分搜索空间。另一方面,如果染色体太多,GA会减慢。研究表明,经过一定的限制(主要取决于编码和问题),使用非常大的种群是没有用的,因为它不能比中等规模的种群更快地解决问题。

     3      选择

正如您从GA概述中已经知道的那样,从群体中选择染色体作为交叉的父母。问题是如何选择这些染色体。根据达尔文的进化论,最好的进化能够创造出新的后代。选择最佳染色体的方法有很多种。例如轮盘赌选择,Boltzman选择,锦标赛选择,等级选择,稳态选择和其他一些选择。

1.轮盘赌选择

父母根据他们的健康状况选择。染色体越好,它们被选择的机会就越多。想象一下轮盘赌轮,人口中的所有染色体都放在那里。轮盘中截面的大小与每条染色体的适应度函数的值成比例 - 值越大,截面越大。有关示例,请参见下图。

轮盘赌中放入一块大理石,并选择停止的染色体。显然,具有较大适应值的染色体将被选择更多次。

该过程可以通过以下算法来描述。

[Sum]计算总体中所有染色体拟合度的总和 - 总和S.

[Select]从区间(0,S)-r生成随机数。

[循环]遍历总体并从0 - 总和中求和。当总和s大于r时,停止并返回您所在的染色体。当然,对于每个群体,步骤1仅执行一次。

2.排名选择

当健身值之间存在很大差异时,先前的选择类型会出现问题。例如,如果最佳染色体适应度是所有拟合度总和的90%,那么其他染色体将很少被选择的机会。等级选择首先对群体进行排序,然后每个染色体接收由该等级确定的适合度值。最差的将是健身1,第二个最差的2等等,最好的将具有适应度N(人口中的染色体数量)。您可以在下面的图片中看到,在更改适应性与排名确定的数字后情况如何变化。

排名前的情况(适合度图)

排名后的情况(订单号图)

现在所有染色体都有机会被选中。然而,这种方法会导致收敛速度变慢,因为最好的染色体与其他染色体的差别不大。

3.稳态选择

这不是选择父母的特定方法。这种选择新种群的主要思想是染色体的很大一部分可以存活到下一代。稳态选择GA以下列方式工作。在每一代中,选择一些好的(具有更高适应性)染色体来创建新的后代。然后去除一些不好的(具有较低适合度)染色体并将新的后代放置在它们的位置。其余人口幸存下来。

4.精英

精英主义的想法已经被引入。当通过交叉和变异创建新的种群时,我们有很大的机会,我们将失去最好的染色体。精英主义是首先将最佳染色体(或少数最佳染色体)复制到新种群的方法的名称。其余人口以上述方式构建。精英主义可以迅速提高GA的性能,因为它可以防止丢失最佳找到的解决方案。

交叉(Crossover)和突变 (Mutation)

交叉和变异是GA的两个基本运算符。 GA的表现非常依赖于它们。运算符的类型和实现取决于编码以及问题。有多种方法可以执行交叉和变异。在本章中,我们将简要介绍一些如何执行多个编码的示例和建议。

1.二进制编码

交叉

单点交叉 - 选择一个交叉点,从第一个父项复制从染色体开始到交叉点的二进制字符串,其余从另一个父项复制

选择两点交叉 - 两个交叉点,从第一个父节点复制从染色体开始到第一个交叉点的二进制字符串,从第一个父节点复制从第一个交叉点到第二个交叉点的部分,其余的是再次从第一个父级复制

均匀交叉 - 从第一个父项或第二个父项中随机复制位

算术交叉 - 执行一些算术运算以产生新的后代

突变

位反转 - 选择的位被反转

2.置换编码

交叉

单点交叉 - 选择一个交叉点,将排列从第一个父项复制到交叉点,然后扫描另一个父项,如果该数字还没有在后代中,则添加它注意:还有更多方法如何在交叉点之后产生休息

(1 2 3 4 5 6 7 8 9) + (4 5 3 6 8 9 7 2 1) = (1 2 3 4 5 6 8 9 7)

变异

顺序更改 - 选择并交换两个数字

(1 2 3 4 5 6 8 9 7) => (1 8 3 4 5 6 2 9 7)

3.值编码

交叉

可以使用来自二进制编码的所有交叉

变异

添加一个小数字(用于实数值编码) - 将一个小数字添加到(或减去)所选值

(1.29 5.68 2.86 4.11 5.55)=>(1.29 5.68 2.73 4.22 5.55)

4.树编码

交叉

树交叉 - 在父母双方中选择一个交叉点,父母在该点被分割,交换点下面的部分被交换以产生新的后代

变异

更改运算符,数字 - 选定节点已更改

补充:

疑惑点:

初始种群是啥:

利用二进制(一般)表示最终解

例如:需要求解z=x^2+y^2的最大值,x={1,5,3,8},y={5,4,0,6}

用六位二进制数表示由x,y组成的解,例如:001100 表示x=1,y=4

001100 称为一条基因序列,表示的是该问题的一种解决 方案

种群是包含多个基因序列(解决方案/个体)的集合

适应度函数是啥,有什么作用:

适应度函数可以理解成“ 游戏 规则”,如果问题较为复杂,需要自定义适应度函数,说明如何区分优秀与不优秀的个体; 如果问题比较简单,例如上述求最大值的问题,则直接用此函数式作为适应度函数即可。作用:评定个体的优劣程度,从而决定其遗传机会的大小。

怎么选择:

定义“适者生存不适者淘汰”的规则,例如:定义适应度高的被选择的概率更大

怎么交叉:

利用循环,遍历种群中的每个个体,挑选另一个体进行交叉。例如,通过遍历为基因序列A挑选出B配对,则取A的前半部分,B的后半部分,组合成新的个体(基因序列)C

如何变异:

随机挑选基因序列上的某一位置,进行0-1互换

建议 GA的参数

如果您决定实施遗传算法,本章应该为您提供一些基本建议。这些建议非常笼统。您可能希望尝试使用自己的GA来解决特定问题,因为没有一般理论可以帮助您针对任何问题调整GA参数。

建议通常是对GA的经验研究的结果,这些研究通常仅在二进制编码上进行。

交叉率

交叉率一般应高,约为80%-95%。 (但是有些结果表明,对于某些问题,交叉率约为60%是最好的。)

突变率

另一方面,突变率应该非常低。最佳利率似乎约为0.5%-1%。

人口规模

可能令人惊讶的是,非常大的人口规模通常不会改善GA的性能(从找到解决方案的速度的意义上说)。良好的人口规模约为20-30,但有时大小为50-100是最好的。一些研究还表明,最佳种群规模取决于编码字符串(染色体)的大小。这意味着如果你有32位染色体,那么人口应该高于16位染色体。

选择

可以使用基本的轮盘赌选择,但有时排名选择可以更好。查看有关选择优缺点的章节。还有一些更复杂的方法可以在GA运行期间更改选择参数。基本上,这些表现类似于模拟退火。如果您不使用其他方法来保存最佳找到的解决方案,则应确保使用精英主义。您也可以尝试稳态选择。

编码

编码取决于问题以及问题实例的大小。查看有关编码的章节以获取一些建议或查看其他资源。

交叉和变异

运算符取决于所选的编码和问题。查看有关操作员的章节以获取一些建议。您还可以查看其他网站。

搜索空间

    如果我们正在解决问题,我们通常会寻找一些最好的解决方案。所有可行解决方案的空间(所需解决方案所在的解决方案集)称为搜索空间(也称为状态空间)。搜索空间中的每个点代表一种可能的解决方案。每个可能的解决方案可以通过其对问题的值(或适应度)进行“标记”。通过GA,我们在众多可能的解决方案中寻找最佳解决方案 - 以搜索空间中的一个点为代表。然后寻找解决方案等于在搜索空间中寻找一些极值(最小值或最大值)。有时可以很好地定义搜索空间,但通常我们只知道搜索空间中的几个点。在使用遗传算法的过程中,随着进化的进行,寻找解决方案的过程会产生其他点(可能的解决方案)。

    问题是搜索可能非常复杂。人们可能不知道在哪里寻找解决方案或从哪里开始。有许多方法可用于寻找合适的解决方案,但这些方法不一定能提供最佳解决方案。这些方法中的一些是爬山,禁忌搜索,模拟退火和遗传算法。通过这些方法找到的解决方案通常被认为是很好的解决方案,因为通常不可能证明最佳方案。

NP-hard Problems

NP问题是一类无法用“传统”方式解决的问题。我们可以快速应用许多任务(多项式)算法。还存在一些无法通过算法解决的问题。有很多重要问题很难找到解决方案,但是一旦有了解决方案,就很容易检查解决方案。这一事实导致了NP完全问题。 NP代表非确定性多项式,它意味着可以“猜测”解决方案(通过一些非确定性算法),然后检查它。如果我们有一台猜测机器,我们或许可以在合理的时间内找到解决方案。为简单起见,研究NP完全问题仅限于答案可以是或否的问题。由于存在输出复杂的任务,因此引入了一类称为NP难问题的问题。这个类并不像NP完全问题那样受限。 NP问题的一个特征是,可以使用一个简单的算法,可能是第一眼看到的,可用于找到可用的解决方案。但是这种方法通常提供了许多可能的解决方案 - 只是尝试所有可能的解决方案是非常缓慢的过程(例如O(2 ^ n))。对于这些类型问题的更大的实例,这种方法根本不可用。今天没有人知道是否存在一些更快的算法来提供NP问题的确切答案。对于研究人员来说,发现这样的算法仍然是一项重大任务(也许你!:-))。今天许多人认为这种算法不存在,因此他们正在寻找替代方法。替代方法的一个例子是遗传算法。 NP问题的例子是可满足性问题,旅行商问题或背包问题。可以获得NP问题汇编。

参考:

         https://www.jianshu.com/p/ae5157c26af9

        https://www.jianshu.com/p/b36b520bd187

❺ 遗传算法的优缺点

优点:

1、遗传算法是以决策变量的编码作为运算对象,可以直接对集合、序列、矩阵、树、图等结构对象进行操作。这样的方式一方面有助于模拟生物的基因、染色体和遗传进化的过程,方便遗传操作算子的运用。

另一方面也使得遗传算法具有广泛的应用领域,如函数优化、生产调度、自动控制、图像处理、机器学习、数据挖掘等领域。

2、遗传算法直接以目标函数值作为搜索信息。它仅仅使用适应度函数值来度量个体的优良程度,不涉及目标函数值求导求微分的过程。因为在现实中很多目标函数是很难求导的,甚至是不存在导数的,所以这一点也使得遗传算法显示出高度的优越性。

3、遗传算法具有群体搜索的特性。它的搜索过程是从一个具有多个个体的初始群体P(0)开始的,一方面可以有效地避免搜索一些不必搜索的点。

另一方面由于传统的单点搜索方法在对多峰分布的搜索空间进行搜索时很容易陷入局部某个单峰的极值点,而遗传算法的群体搜索特性却可以避免这样的问题,因而可以体现出遗传算法的并行化和较好的全局搜索性。

4、遗传算法基于概率规则,而不是确定性规则。这使得搜索更为灵活,参数对其搜索效果的影响也尽可能的小。

5、遗传算法具有可扩展性,易于与其他技术混合使用。以上几点便是遗传算法作为优化算法所具备的优点。

缺点:

1、遗传算法在进行编码时容易出现不规范不准确的问题。

2、由于单一的遗传算法编码不能全面将优化问题的约束表示出来,因此需要考虑对不可行解采用阈值,进而增加了工作量和求解时间。

3、遗传算法效率通常低于其他传统的优化方法。

4、遗传算法容易出现过早收敛的问题。

(5)遗传算法辨识程序扩展阅读

遗传算法的机理相对复杂,在Matlab中已经由封装好的工具箱命令,通过调用就能够十分方便的使用遗传算法。

函数ga:[x, fval,reason]= ga(@fitnessfun, nvars, options)x是最优解,fval是最优值,@fitnessness是目标函数,nvars是自变量个数,options是其他属性设置。系统默认求最小值,所以在求最大值时应在写函数文档时加负号。

为了设置options,需要用到下面这个函数:options=gaoptimset('PropertyName1', 'PropertyValue1', 'PropertyName2', 'PropertyValue2','PropertyName3', 'PropertyValue3', ...)通过这个函数就能够实现对部分遗传算法的参数的设置。

❻ 遗传算法

遗传算法实例:

也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。
对于初学者,尤其是还没有编程经验的非常有用的一个文件
遗传算法实例

% 下面举例说明遗传算法 %
% 求下列函数的最大值 %
% 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:py
pop1(:,i)=2.^(py-i).*pop(:,i);
end
pop2=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:px
if objvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=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<=px
if(ms(newin))<fitvalue(fitin)
newpop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end

% 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-1
if(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)];
else
newpop(i,:)=pop(i);
newpop(i+1,:)=pop(i+1);
end
end

% 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:px
if(rand<pm)
mpoint=round(rand*py);
if mpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
if any(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
else
newpop(i)=pop(i);
end
end

% 2.7 求出群体中最大得适应值及其个体
%遗传算法子程序
%Name: best.m
%求出群体中适应值最大的值
function [bestindivial,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindivial=pop(1,:);
bestfit=fitvalue(1);
for i=2:px
if fitvalue(i)>bestfit
bestindivial=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 %20为迭代次数
[objvalue]=calobjvalue(pop); %计算目标函数
fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue); %复制
[newpop]=crossover(pop,pc); %交叉
[newpop]=mutation(pop,pc); %变异
[bestindivial,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值
y(i)=max(bestfit);
n(i)=i;
pop5=bestindivial;
x(i)=decodechrom(pop5,1,chromlength)*10/1023;
pop=newpop;
end

fplot('10*sin(5*x)+7*cos(4*x)',[0 10])
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
【程序清单】
%编写目标函数
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)-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
【程序清单】
%编写目标函数
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)-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是传递给变异函数的参数。
打字不易,如满意,望采纳。

❼ 求遗传算法的matlab程序

function
my_ga()
options=gaoptimset;
%设置变量范围
options=gaoptimset(options,'PopInitRange',[0;9]);
%设置种群大小
options=gaoptimset(options,'PopulationSize',100);
%设置迭代次数
options=gaoptimset(options,'Generations',100);
%选择选择函数
options=gaoptimset(options,'SelectionFcn',@selectionroulette);
%选择交叉函数
options=gaoptimset(options,'CrossoverFcn',@crossoverarithmetic);
%选择变异函数
options=gaoptimset(options,'MutationFcn',@mutationuniform);
%设置绘图:解的变化、种群平均值的变化
options=gaoptimset(options,'PlotFcns',{@gaplotbestf});
%执行遗传算法,fitness.m是函数文件
[x,fval]=ga(@fitness,1,options)

阅读全文

与遗传算法辨识程序相关的资料

热点内容
主角可以回到抗战卖军火 浏览:956
会计云课堂文件夹是哪个 浏览:908
日本推理片和欧美推理片哪个好 浏览:446
编程跳转id指令怎么用 浏览:960
苍白贫血作品集txt 浏览:304
红羊打真军电影有哪些 浏览:88
海外悬疑电影推荐 浏览:270
如何查找本机网关ip和dns服务器 浏览:306
电影枪版资源到底在哪里 浏览:339
51单片机必考 浏览:849
pdf背景黑色 浏览:256
0855影视大全在线观看 浏览:527
勾引闺蜜老公在电影院 浏览:553
神秘电影网页链接 浏览:928
重生到一夫多妻的现代世界 浏览:439
彼时曾相伴为什么看不了 浏览:722
漏的多的电影 浏览:240
李采谭合作的男演员 浏览:943
医院云服务器采购 浏览:505
国产经典怀旧敌特老电影 浏览:903