求一个基本遗传算法的MATLAB代码

作者&投稿:巢筠 (若有异议请与网页底部的电邮联系)
遗传算法的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]; %数据范围


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

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

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

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

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

avgfitness=sum(individuals.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]);

先看这个结构里面的这些函数都是干什么用的,prob,概率。[1:keep],这里应该能大概看出来keep是整数,1:keep 等价于1:1:keep,比如1:10,就是1,2,3,4,5,6,7,8,9,10。步长为1,从1到keep.
右上角的',这个符号,表示转置,比如1:10,是一个1行10列的矩阵,通过转置变成10行一列。
其中,sum([1:keep]),表示对这个矩阵(从1到keep求和),但是这个语句 prob=flipud([1:keep]'/sum([1:keep]));
里面总觉得缺少了一个.。prob=flipud([1:keep]'./sum([1:keep])); 这样看来应该才能运行,我没尝试,在command window里面直接做是可以的,但是在脚本文件里面做,可能会报错。这个和矩阵运算有关,暂且放在这里。
然后到外部,这样我们知道了在第一行flipud()函数体里面,实际上是在用1到keep的每一个数,除以1到keep的和值,得到一个长度为keep的矩阵。值得注意的是,这个矩阵的和值为1,在下面会用到这一点。
然后flipud()函数的作用,是把矩阵倒置,比如[1,3,4,5],使用flipud()之后变成[5,4,3,1]。注意,这个操作和sort()函数不同,这个只是把以前的顺序倒置,并不排序。

从这里大概可以看出来,其实这个keep的值,等于chromosomes,染色体数量。这样,对于不同的染色体,配对概率就不一样了。从这里可以看出来,染色体配对概率应该是第一条最高,然后依次递减。

然后计算或然率,cumsum(),进行累加求和,比如matlab中给出的例子,我们用[1,2 ,3] 也可以写作1:3,来说,cumsum之后的结果是[1, 3, 6],也就是从第一个开始加和,一直加到这一项。这一点,非常类似高斯函数积分的感觉。用来计算概率cumulative distribution。

然后odd变量,把0加在了cumsum结果的前面,比如刚刚的例子[0 cumsum([1, 2, 3])],就变成了[0, 1, 3,6]。
注意这个地方他又转置了一次,因为在第一行计算prob的时候,他把一个行向量,转换成了列向量,然后现在要把0加在头上,所以在进行cumsun()运算的时候,又把结果从列向量转换成了行向量。

仅从这两行代码里面,就大概只能看出这个意思了。

不过简单一说,现在看不出来这个遗传算法的核心是什么样的,一般的神经网络里面只有连锁交换定律的应用,一般没有基因分离定律的应用。看这个样子,这是分离出来然后自由配对的做法,应该是比较高端的东西吧。

我发一些他们的源程序你,都是我在文献中搜索总结出来的:
% 下面举例说明遗传算法 %
% 求下列函数的最大值 %
% 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)
% 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.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

很多哈,也很麻烦,但是设计程序就是如此!得耐心点才行。 最近又作了些总结,要有兴趣百度HI我吧。我有M文件,运行成功

我也有Matlab代码,还要不?


R语言中的遗传算法
在数据科学的殿堂中,张丹(Conan),青萌数海的CTO,通过深入解析,揭示了遗传算法这一自然选择原则的编程诠释。遗传算法,作为一门强大的全局搜索技术,如同生物进化过程,通过随机搜索与优化,模拟了自然界的生存竞争与进化机制。基本原理与操作 遗传算法是一种搜索算法,它依赖于选择、繁殖(包括交配和...

如何通俗易懂地解释遗传算法?
遗传算法,核心是达尔文优胜劣汰适者生存的进化理论的思想。我们都知道一个种群,通过长时间的繁衍,种群的基因会向着更适应环境的趋势进化,牛B个体的基因被保留,后代越来越多,适应能力低个体的基因被淘汰,后代越来越少。经过几代的繁衍进化,留下来的少数个体,就是相对能力最强的个体了。那么在解决一些...

遗传算法的基本结构
编码、种群初始化、选择、交叉、变异、种群更新、解码、评价函数、终止规则

遗传算法[1,]
遗传算法最早由Stoffa和Sen(1991)用于地震波的一维反演,之后在地球物理资料的非线性反演中得到广泛的应用。GA算法对模型群体进行追踪、搜索,即模型状态通过模型群体传送,具有比模拟退火法更大、更复杂的“记忆”,潜力更大。 遗传算法在反演中的基本思路和过程是: (1)将生物体看成模型,模型参数看成染色体,有多少个...

...如果要求求解结果精确到6位小数,请给出利用基本遗传算法的编码...
3.随机生成20个0到1的数。根据第二步骤所有的生成的二进制数转换成十进制数T,再转换到X=(n+T(m-n)\/(T-1))由X可以求出F(X),当然所有的20个二进制数都要转换,求出所有数值适应度(就是这函数值占20个函数值总和的比例),然后依次累加,累加的概念自己查吧。感觉文字太多,,不好表达...

geneticalgorithms是什么意思啊?
遗传算法是一种优化搜索方法,受到自然界中生物进化论的启发而诞生。下面详细介绍其概念和应用。遗传算法的基本解释 遗传算法模拟了生物进化过程中的自然选择和遗传学机制。它通过选择、交叉、变异等操作,对解空间进行高效搜索,以求得问题的最优解或满意解。遗传算法的核心思想在于借鉴生物进化的适者生存...

( )算法采用模拟生物进化的三个基本过程“繁殖(选择)→交叉(重组)→变 ...
每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。遗传算法的基本运算过程如下:(1)初始化 (2)个体评价 (3)...

怎么用遗传算法求超材料
遗传算法的基本步骤是:1、初始化 2、个体评价;3、选择运算;4、交叉运算; 5、变异运算,将变异算子作用于群体;6、终止条件判断。遗传算法是一种可用于复杂系统优化的一种搜索算法,与传统的算法相比,具有以下4个特点:1,它是以决策变量的编码作为运算对象;2,遗传算法直接以适应度作为搜索信息,...

遗传算法的核心是什么?!
加上变异)。同样,遗传算法中起核心作用的是遗传操作的交叉算子。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。通过交叉,遗传算法的搜索能力得以飞跃提高。交叉算子根据交叉率将种群中的两个个体随机地交换某些基因,能够产生新的基因组合,期望将有益基因组合在一起。

遗传算法种群规模是怎么得到的
种群规模是指任意一代中的个体总数,这个是人为设定的,种群规模越大越可能找到全局解,但运行时间也相对较长,一般在40-100之间取值,像我就习惯选60.至于你所处理的问题,可以对比不同的种群规模下最优解和运行时间,然后折衷取。

泽州县18322811239: 求MATLAB编遗传算法的程序? -
丹保益心: figure(1); fplot('variable.*sin(10*pi*variable)+2.0',[-1,2]); NIND=40; MAXGEN=25; PRECI=20; GGAP=0.9; trace=zeros(2,MAXGEN); FieldD=[20;-1;2;1;0;1;1]; Chrom=CRTBP(NIND,PRECI); gen=0; variable=BS2RV(Chrom,FieldD); ObjV=variable.*sin...

泽州县18322811239: 求遗传算法的matlab程序
丹保益心: function my_ga() options=gaoptimset; %设置变量范围 options=gaoptimset(options,'PopInitRange',[0;9]); %设置种群大小 options=gaoptimset(options,'PopulationSize',100); %设置迭代次数 options=gaoptimset(options,'Generations',100); %...

泽州县18322811239: 遗传算法的matlab代码实现是什么? -
丹保益心: 遗传算法我懂,我的论文就是用着这个算法,具体到你要遗传算法是做什么?优化什么的...我给你一个标准遗传算法程序供你参考:该程序是遗传算法优化BP神经网络函数极值寻优:%% 该代码为基于神经网络遗传算法的系统极值寻优%%...

泽州县18322811239: 基本遗传算法的matlab实现代码,不是工具箱那种编程. -
丹保益心: 网上能搜到经典的SGA算法matlab代码,推荐ilovematlab 主要就是初始化,编码,适应度函数,选择,交叉,变异操作

泽州县18322811239: 可不可以给给遗传算法的实例,有matlab实现的最好!谢谢咯! -
丹保益心: 点matlab里面的start菜单,从toolbox里面选取optimization toolbox,在早期版本里面不叫这个名字,从2010b以后的版本把非线性方程组求解的算法都放在一起了.里面第一个下拉菜单选择最后一个,里面写的ga.fitness function是你的函数.遗传算法求解的goal是0,如果你要求趋近某一个值,就要看你的fitness function怎么写了.下面number of variables是你要求解的维数.接着点击运行就行了.因为不知道你的具体目的是什么,也没有代码发上来,所以我只能说这种很没用的话.

泽州县18322811239: matlab实现遗传算法 -
丹保益心: 你是用matlab自带的ga函数吗?如果是的话,一般就3个输入,第一个是适应函数,就是你的优化目标,第二个是一个你要求的解的独立变量个数,比如5,第3个是options,这个是要事先用gaoptimset设定的.

泽州县18322811239: 已知一个基因,六个基因组成一个个体怎么编码遗传算法 编码 matlab 语句 -
丹保益心:[答案] 一般采用二进制编码和实数编码的比较多,另外,这不是生物学的知识,这是数学建模中遗传算法的一部分.属于数学知识.

泽州县18322811239: MATLAB遗传算法 -
丹保益心: fit = @(x) x(1)^2 + x(2)^2 - 16*x(1)- 5*x(1)*x(2); options = gaoptimset('Generations',100,'PopulationSize',20,... 'CrossoverFraction', 0.8, 'ParetoFraction', 0.5); [x fval] = ga(fit,2,[1 1],20,[],[],[0;0],[20;10],[],options); x fval = -fval

泽州县18322811239: matlab的遗传算法 -
丹保益心: matlab自带的有遗传算法工具箱,也就是两个函数,分别是 x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)options = gaoptimset('param1',value1,'param2',value2,...)在帮助文件(doc ga/gaoptimset)里面自己好还看看它的用法就可以了,每一个参数都有详细的说明,应该可以帮助到你.

泽州县18322811239: 大家好,请问谁有基于matlab的遗传算法源代码,很需要呀 -
丹保益心: function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)%--------------------------------------------------------------------------% JSPGA.m% 车间作业调度问题遗传算法%--------------------------------------------------------------------------% 输入参数列表% M 遗传进化...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网