求遗传算法(GA)处理离散的整数型变量的程序。

求遗传算法(GA)处理离散的整数型变量的程序。,第1张

两种编码都有,可以自己选择。 你在MATLAB2008里输入 gaoptimset 会d出遗传算法的所有的设置选项及默认项。其中,第一行就是个体的编码方式,第一行如下 PopulationType: [ 'bitstring' | 'custom' | ] 其中,bitstring就是二进制编码,而'doubleVector'即实数编码(MATLAB里实数是用double双精度浮点数表示的,精度很高。大括号{}表示是默认设置。 而中间的'custom'是表示用户自己构造个体的编码形式。

function selected =selection (pop , popsize , stringlength , dimension) //选择算子,其中参数pop表示种群,popsize表示种群规模,stringlength表示染色体的长度,dimension表示维数

popsize-new =size(pop , 1); //popsize-new表示pop种群的列数

r =rand(1 , popsize); //r是一个随机数,大小介于1和popsize之间

fitness =pop(:, dimension *stringlength +1);//fitness是适应度,接下来的两行代码来求pop种群的染色体平均适应度

fitness =fitness/sum(fitness);

fitness =cumsum(fitness);

for i =1 :popsize //每一行

 for j =1 :popsize-new//每一列

if r(i)<=fitness(j) //如果平均适应度大于随机数

 selected(i , :)=pop(j , :); //那么就选中这个个体

 break ;

end

 end

end

优点:

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

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

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

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

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

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

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

缺点:

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

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

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

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

扩展资料

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

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

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

参考资料来源:百度百科-遗传算法

发一份自编的MATLAB遗传算法代码,用简单遗传算法(Simple Genetic Algorithm or Standard Genetic Algorithm ,SGA)求取函数最大值,初版编写于7年前上学期间,当时是MATLAB 5x,在算法运行效率方面做了修改,主要是采用矩阵 *** 作减少了循环。

遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。

优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码,因为优化后要进行评价,所以要返回问题空间,故要进行解码。SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;解码时应注意将染色体解码到问题可行域内。

遗传算法模拟“适者生存,优胜劣汰”的进化机制,染色体适应生存环境的能力用适应度函数衡量。对于优化问题,适应度函数由目标函数变换而来。一般遗传算法求解最大值问题,如果是最小值问题,则通过取倒数或者加负号处理。SGA要求适应度函数>0,对于<0的问题,要通过加一个足够大的正数来解决。这样,适应度函数值大的染色体生存能力强。

遗传算法有三个进化算子:选择(复制)、交叉和变异。

SGA中,选择采用轮盘赌方法,也就是将染色体分布在一个圆盘上,每个染色体占据一定的扇形区域,扇形区域的面积大小和染色体的适应度大小成正比。如果轮盘中心装一个可以转动的指针的话,旋转指针,指针停下来时会指向某一个区域,则该区域对应的染色体被选中。显然适应度高的染色体由于所占的扇形区域大,因此被选中的几率高,可能被选中多次,而适应度低的可能一次也选不中,从而被淘汰。算法实现时采用随机数方法,先将每个染色体的适应度除以所有染色体适应度的和,再累加,使他们根据适应度的大小分布于0-1之间,适应度大的占的区域大,然后随机生成一个0-1之间的随机数,随机数落到哪个区域,对应的染色体就被选中。重复 *** 作,选出群体规模规定数目的染色体。这个 *** 作就是“优胜劣汰,适者生存”,但没有产生新个体。

交叉模拟有性繁殖,由两个染色体共同作用产生后代,SGA采用单点交叉。由于SGA为二进制编码,所以染色体为二进制位串,随机生成一个小于位串长度的随机整数,交换两个染色体该点后的那部分位串。参与交叉的染色体是轮盘赌选出来的个体,并且还要根据选择概率来确定是否进行交叉(生成0-1之间随机数,看随机数是否小于规定的交叉概率),否则直接进入变异 *** 作。这个 *** 作是产生新个体的主要方法,不过基因都来自父辈个体。

变异采用位点变异,对于二进制位串,0变为1,1变为0就是变异。采用概率确定变异位,对每一位生成一个0-1之间的随机数,看是否小于规定的变异概率,小于的变异,否则保持原状。这个 *** 作能够使个体不同于父辈而具有自己独立的特征基因,主要用于跳出局部极值。

遗传算法认为生物由低级到高级进化,后代比前一代强,但实际 *** 作中可能有退化现象,所以采用最佳个体保留法,也就是曾经出现的最好个体,一定要保证生存下来,使后代至少不差于前一代。大致有两种类型,一种是把出现的最优个体单独保存,最后输出,不影响原来的进化过程;一种是将最优个体保存入子群,也进行选择、交叉、变异,这样能充分利用模式,但也可能导致过早收敛。

由于是基本遗传算法,所以优化能力一般,解决简单问题尚可,高维、复杂问题就需要进行改进了。

下面为代码。函数最大值为39059262,此时两个参数均为-20480,有时会出现局部极值,此时一个参数为-20480,一个为20480。算法中变异概率pm=005,交叉概率pc=08。如果不采用最优模式保留,结果会更丰富些,也就是算法最后不一定收敛于极值点,当然局部收敛现象也会有所减少,但最终寻得的解不一定是本次执行中曾找到过的最好解。

(注:一位网名为mosquitee的朋友提醒我:原代码的变异点位置有问题。检验后发现是将最初的循环实现方法改为矩阵实现方法时为了最优去掉mm的第N行所致,导致变异点位置发生了变化,现做了修改,修改部分加了颜色标记,非常感谢mosquitee,2010-4-22)

% Optimizing a function using Simple Genetic Algorithm with elitist preserved

%Max f(x1,x2)=100(x1x1-x2)^2+(1-x1)^2; -20480<=x1,x2<=20480

% Author: Wang Yonglin (wylin77@126com)

clc;clear all;

format long;%设定数据显示格式

%初始化参数

T=100;%仿真代数

N=80;% 群体规模

pm=005;pc=08;%交叉变异概率

umax=2048;umin=-2048;%参数取值范围

L=10;%单个参数字串长度,总编码长度2L

bval=round(rand(N,2L));%初始种群

bestv=-inf;%最优适应度初值

%迭代开始

for ii=1:T

%解码,计算适应度

for i=1:N

y1=0;y2=0;

for j=1:1:L

y1=y1+bval(i,L-j+1)2^(j-1);

end

x1=(umax-umin)y1/(2^L-1)+umin;

for j=1:1:L

y2=y2+bval(i,2L-j+1)2^(j-1);

end

x2=(umax-umin)y2/(2^L-1)+umin;

obj(i)=100(x1x1-x2)^2+(1-x1)^2; %目标函数

xx(i,:)=[x1,x2];

end

func=obj;%目标函数转换为适应度函数

p=func/sum(func);

q=cumsum(p);%累加

[fmax,indmax]=max(func);%求当代最佳个体

if fmax>=bestv

bestv=fmax;%到目前为止最优适应度值

bvalxx=bval(indmax,:);%到目前为止最佳位串

optxx=xx(indmax,:);%到目前为止最优参数

end

Bfit1(ii)=bestv; % 存储每代的最优适应度

%%%%遗传 *** 作开始

%轮盘赌选择

for i=1:(N-1)

r=rand;

tmp=find(r<=q);

newbval(i,:)=bval(tmp(1),:);

end

newbval(N,:)=bvalxx;%最优保留

bval=newbval;

%单点交叉

for i=1:2:(N-1)

cc=rand;

if cc<pc

point=ceil(rand(2L-1));%取得一个1到2L-1的整数

ch=bval(i,:);

bval(i,point+1:2L)=bval(i+1,point+1:2L);

bval(i+1,point+1:2L)=ch(1,point+1:2L);

end

end

bval(N,:)=bvalxx;%最优保留

%位点变异

mm=rand(N,2L)<pm;%N行

mm(N,:)=zeros(1,2L);%最后一行不变异,强制赋0

bval(mm)=1-bval(mm);

end

%输出

plot(Bfit1);% 绘制最优适应度进化曲线

bestv %输出最优适应度值

optxx %输出最优参数

以上就是关于求遗传算法(GA)处理离散的整数型变量的程序。全部的内容,包括:求遗传算法(GA)处理离散的整数型变量的程序。、怎么解释遗传算法matlab程序 以下程序至少解释三行,for、end、if function语句就不用了,谢谢。、遗传算法的优缺点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10629210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存