文档库 最新最全的文档下载
当前位置:文档库 › 遗传算法matlab代码

遗传算法matlab代码

遗传算法matlab代码
遗传算法matlab代码

function youhuafun

D=code;

N=50; % Tunable

maxgen=50; % Tunable

crossrate=0.5; %Tunable

muterate=0.08; %Tunable

generation=1;

num = length(D);

fatherrand=randint(num,N,3);

score = zeros(maxgen,N);

while generation<=maxgen

ind=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;

% end

fatherrand=[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;

end

childind(k)=scoreind(logical

(difind));

end

fatherrand=fatherrand(:,childind

);

generation=generation+1;

end

% score

maxV=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 D

function D=code

load youhua.mat

% properties F2 and F3

F1=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:1

index=find(F2<=900+ite*50);

F4(index)=ite;

end

D=[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:N

FF4k=FF4rnd(:,k);

for ite=1:11

F0index=find(FF4k==ite);

if ~isempty(F0index)

tmpMat=F3(F0index);

tmpSco=sum(tmpMat);

ScoreBin(ite)=mod(tmpSco

,300);

end

end

Scorek(k)=sum(ScoreBin);

end

ScoreN=ScoreN-Scorek;

遗传算法实例:

% 下面举例说明遗传算法%

% 求下列函数的最大值%

% 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))

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

cpoint=round(rand*py);

newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpo int+1:py)];

newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,c point+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

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

[bestindividual,bestfit]=best(pop,fitvalue)

[px,py]=size(pop);

bestindividual=pop(1,:);

bestfit=fitvalue(1);

for i=2:px

if fitvalue(i)>bestfit

bestindividual=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); %变异

[bestindividual,bestfit]=best(pop,fitvalue)

; %求出群体中适应值最大的个体及其适

应值

y(i)=max(bestfit);

n(i)=i;

pop5=bestindividual;

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,'fi tness')

注:前两个文件存储为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+x

2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x

2)))+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.7128

2;

%适应度函数的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,'fi

tness')

注:前两个文件存储为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是传递给变异函数的参数。

参考资料:不记得了,抱歉

function Main()

%定义全局变量

global

VariableNum POPSIZE MaxGens

PXOVER PMutation

VariableNum=3 %变量个数

POPSIZE=50 %种群大小

MaxGens=1000 %种群代数

PXOVER=0.8 %交叉概率

PMutation=0.2 %变异概率

%读取数据文件

load E:\现代优化算法\遗传算法

\bound.txt

VarBound=bound(:,1:2);

global Pop newPop

Pop=zeros(POPSIZE+1,VariableNum);

newPop=zeros(POPSIZE+1,VariableNu

m);

%初始化种群

for i=1:POPSIZE

for j=1:VariableNum

Pop(i,j)=VarBound(j,1)+rand()*(Va

rBound(j,2)-VarBound(j,1));

end

end

%计算适应值

fitnessList=zeros(POPSIZE,1);

for i=1:POPSIZE

fitnessList(i,1)=fitness(Pop(i,1:Variab

leNum));

end

%保存最好值和最坏值

Best=zeros(1,VariableNum+1);

Worst=zeros(1,VariableNum+1); maxvalue=max(fitnessList);

indexMax=find(fitnessList==maxvalue,1 ,'first');

Best(1,1:VariableNum)=Pop(indexMax, 1:VariableNum);

Best(1,VariableNum+1)=maxvalue; minvalue=min(fitnessList);

indexMin=find(fitnessList==minvalue,1,'f irst');

Worst(1,1:VariableNum)=Pop(indexMin, 1:VariableNum);

Worst(1,VariableNum+1)=minvalue; genetation=1;

while genetation

%计算适应度区间

sumfit=sum(abs(fitnessList));

relativeFitness=zeros(POPSIZE,1);

relativeFitness=abs(fitnessList)/sumfi t;

for i=2:POPSIZE

relativeFitness(i)=relativeFitness(i-1)+relativeFitness(i);

end

%选择操作

newPop=Select(Pop,relativeFitness);

%交叉操作

newPop=Xcross(newPop,VariableNu m,PXOVER);

%变异操作

newPop=Mutation(newPop,Variable Num,PMutation,VarBound);

%计算新种群适应值

for i=1:POPSIZE

fitnessList(i,1)=fitness(newPop(i,1: VariableNum));

end

%保存最好值和替换最坏值

maxvalue=max(fitnessList);

indexMax=find(fitnessList==maxvalu e,1,'first');

minvalue=min(fitnessList);

indexMin=find(fitnessList==minvalue, 1,'first');

if Best

Best(1,1:VariableNum)=newPop(i ndexMax,1:VariableNum);

Best(1,VariableNum+1)=maxvalue;

else

newPop(indexMin,1:VariableNum)

=Best(1,1:VariableNum);

fitnessList(indexMin,1)=Best(1,Var

iableNum+1);

end

%用子代替换父代

Pop=newPop;

genetation=genetation+1;

end

Best

==============================

===========================

%选择操作

function newPop=Select(Pop,Rfitness)

for i=1:length(Rfitness)

r=rand();

index=1;

for j=1:length(Rfitness)

if r<=Rfitness(j,1)

index=j;

break;

end

end

newPop(i,:)=Pop(index,:);

end

==============================

========

%交叉操作

function

newPop=Xcross(Pop,VariableNUM,Cro

ssRate)

point=1;

sizePop=length(Pop);

for i=0:sizePop/2

Xrate=rand();

if Xrate

first_index=round(rand()*(sizePop-

2)+1);

second_index=round(rand()*(size

Pop-2)+1);

while

first_index==second_index %排除两

个个体一样的情况

second_index=round(rand()*(si

zePop-2)+1);

end

if VariableNUM>1

if VariableNUM==2

point=1;

else

point=round(rand()*(Variable

NUM-2)+1);

end

tempOne=zeros(1,point);

tempOne(1,1:point)=Pop(first_in

dex,1:point);

Pop(first_index,1:point)=Pop(se

cond_index,1:point);

Pop(second_index,1:point)=tem

pOne(1,1:point);

end

end

end

newPop=zeros(size(Pop),1);

newPop=Pop;

==============================

======================

%变异操作

function

newPop=Mutation(Pop,VariableNUM,M

utationRate,bound)

point=1;

sizePop=length(Pop);

for i=1:sizePop

for j=1:VariableNUM

Mrate=rand();

if Mrate

生变异

Pop(i,j)=

rand()*(bound(j,2)-bound(j,1))+

bound(j,1);

end

end

end

newPop=zeros(size(Pop),1);

newPop=Pop;

============================== ===================

%适应值函数或目标函数

%函数x1^2-x1*x2+x3

function value=fitness(varargin)

n=varargin{1,1};

value=n(1,1)^2-n(1,1)*n(1,2)+n(1,3);

已知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市

只能访问一次,最后又必须返回出发城市。如何安排他对这些城市的访问次序,可使其

旅行路线的总长度最短?

用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)

是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶

点且每个顶点只通过一次的具有最短距离的回路。

这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商

问题(dij≠dji,,任意i,j=1,2,3,…,n)。

若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中

ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:

min l=σd(t(i),t(i+1)) (i=1,…,n)

旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目

与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法

求其近似解。

遗传算法:初始化过程:用v1,v2,v3,…,vn代表所

选n个城市。定义整数pop-size作为

染色体的个数

,并且随机产生pop-size个初始染色

体,每个染色体为1到18的整数组成的

随机序列。

适应度f的计算:对种群中的每个染色体

vi,计算其适应度,

f=σd(t(i),t(i+1)).

评价函数eval(vi):用来对种群中的每

个染色体vi设定一个概率,以使该染色

体被选中

的可能性与其种群中其它染色体的适应

性成比例,既通过轮盘赌,适应性强的染

色体被

选择产生后台的机会要大,设alpha∈

(0,1),本文定义基于序的评价函数为

eval(vi)=al

pha*(1-alpha).^(i-1) 。[随机规划

与模糊规划]

选择过程:选择过程是以旋转赌轮

pop-size次为基础,每次旋转都为新的

种群选择一个

染色体。赌轮是按每个染色体的适应度进

行选择染色体的。

step1 、对每个染色体vi,计算累计概

率qi,q0=0;qi=σeval(vj)

j=1,…,i;i=1,

…pop-size.

step2、从区间(0,pop-size)中产生一

个随机数r;

step3、若qi-1 step4、重复step2

和step3共pop-size次,这样可以得

到pop-size个复制的染色体。

grefenstette编码:由于常规的交叉

运算和变异运算会使种群中产生一些无

实际意义的

染色体,本文采用grefenstette编码

《遗传算法原理及应用》可以避免这种情

况的出现

。所谓的grefenstette编码就是用所

选队员在未选(不含淘汰)队员中的位置,

如:

8 15 2 16 10 7 4 3 11 14 6 12 9

5 18 13 17 1

对应:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4

2 2 1。

交叉过程:本文采用常规单点交叉。为确

定交叉操作的父代,从到pop-size重

复以下过

程:从[0,1]中产生一个随机数r,如果

r 将所选的父代两两组队,随机产生一个

位置进行交叉,如:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4

2 2 1

6 12 3 5 6 8 5 6 3 1 8 5 6 3 3

2 1 1

交叉后为:

8 14 2 13 8 6 3 2 5 1 8 5 6 3 3

2 1 1

6 12 3 5 6 8 5 6 3

7 3 4 3 2 4

2 2 1

变异过程:本文采用均匀多点变异。类似

交叉操作中选择父代的过程,在r 选择

多个染色体vi作为父代。对每一个选择

的父代,随机选择多个位置,使其在每位

按均匀变异(该变异点xk的取值范围为

[ukmin,ukmax],产生一个[0,1]中随

机数r,该点

变异为

x'k=ukmin+r(ukmax-ukmin))操作。

如:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4

2 2 1

变异后:

8 14 2 13 10 6 3 2 2 7 3 4 5 2

4 1 2 1

反grefenstette编码:交叉和变异都

是在grefenstette编码之后进行的,

为了循环操作

和返回最终结果,必须逆

grefenstette编码过程,将编码恢复

到自然编码。

循环操作:判断是否满足设定的带数

xzome,否,则跳入适应度f的计算;是,

结束遗传

操作,跳出。

matlab 代码

distTSP.txt

0 6 18 4 8

7 0 17 3 7

4 4 0 4 5

20 19 24 0 22

8 8 16 6 0

%GATSP.m

function gatsp1()

clear;

load distTSP.txt;

distance=distTSP;

N=5;

ngen=100;

ngpool=10;

%ngen=input('# of generations to evolve = ');

%ngpool=input('# of chromosoms in the gene pool = '); % size of genepool

gpool=zeros(ngpool,N+1); % gene pool

for i=1:ngpool, % intialize gene pool

gpool(i,:)=[1

randomize([2:N]')' 1];

for j=1:i-1

while gpool(i,:)==gpool(j,:) gpool(i,:)=[1

randomize([2:N]')' 1];

end

end

end

costmin=100000;

tourmin=zeros(1,N);

cost=zeros(1,ngpool);

increase=1;resultincrease=1; for i=1:ngpool,

cost(i)=sum(diag(distance(gpo ol(i,:)',rshift(gpool(i,:))') ));

end

% record current best solution [costmin,idx]=min(cost); tourmin=gpool(idx,:);

disp([num2str(increase)

'minmum trip length = ' num2str(costmin)])

costminold2=200000;costminold 1=150000;resultcost=100000; tourminold2=zeros(1,N); tourminold1=zeros(1,N); resulttour=zeros(1,N); while

(abs(costminold2-costminold1)

;100)&(abs(costminold1-costm

in) ;100)&(increase ;500)

costminold2=costminold1;

tourminold2=tourminold1;

costminold1=costmin;tourminol

d1=tourmin;

increase=increase+1;

if resultcost>costmin

resultcost=costmin;

resulttour=tourmin;

resultincrease=increase-1;

end

for i=1:ngpool,

cost(i)=sum(diag(distance(gpo

ol(i,:)',rshift(gpool(i,:))')

));

end

% record current best solution

[costmin,idx]=min(cost);

tourmin=gpool(idx,:);

%==============

% copy gens in th gpool according

to the probility ratio

% >1.1 copy twice

% >=0.9 copy once

% ;0.9 remove

[csort,ridx]=sort(cost);

% sort from small to big.

csum=sum(csort);

caverage=csum/ngpool;

cprobilities=caverage./csort;

copynumbers=0;removenumbers=0;

for i=1:ngpool,

if cprobilities(i) >1.1

copynumbers=copynumbers+1;

end

if cprobilities(i) <0.9

removenumbers=removenumbers+1;

end

end

copygpool=min(copynumbers,rem

ovenumbers);

for i=1:copygpool

for j=ngpool:-1:2*i+2

gpool(j,:)=gpool(j-1,:);

end

gpool(2*i+1,:)=gpool(i,:);

end

if copygpool==0

gpool(ngpool,:)=gpool(1,:);

end

%=========

%when genaration is more than

50,or the patterns in a couple

are too close,do mutation

for i=1:ngpool/2

%

sameidx=[gpool(2*i-1,:)==gpoo

l(2*i,:)];

diffidx=find(sameidx==0);

if length(diffidx)<=2

gpool(2*i,:)=[1

randomize([2:12]')' 1];

end

end

%===========

%cross gens in couples

for i=1:ngpool/2

[gpool(2*i-1,:),gpool(2*i,:)]

=crossgens(gpool(2*i-1,:),gpo

ol(2*i,:));

end

for i=1:ngpool,

cost(i)=sum(diag(distance(gpo

ol(i,:)',rshift(gpool(i,:))')

));

end

% record current best solution

[costmin,idx]=min(cost);

tourmin=gpool(idx,:);

disp([num2str(increase)

'minmum trip length = '

num2str(costmin)])

end

disp(['cost function

evaluation: ' int2str(increase)

' times!'])

disp(['n:'

int2str(resultincrease)])

disp(['minmum trip length = '

num2str(resultcost)])

disp('optimum tour = ')

disp(num2str(resulttour))

%============================ ======================== function B=randomize(A,rowcol) % Usage: B=randomize(A,rowcol) % randomize row orders or column orders of A matrix

% rowcol: if =0 or omitted, row order (default)

% if = 1, column order

rand('state',sum(100*clock)) if nargin == 1,

rowcol=0;

end

if rowcol==0,

[m,n]=size(A);

p=rand(m,1);

[p1,I]=sort(p);

B=A(I,:);

elseif rowcol==1,

Ap=A';

[m,n]=size(Ap);

p=rand(m,1);

[p1,I]=sort(p);

B=Ap(I,:)';

end

%============================ ========================= function y=rshift(x,dir)

% Usage: y=rshift(x,dir)

% rotate x vector to right (down) by 1 if dir = 0 (default)

% or rotate x to left (up) by 1 if dir = 1

if nargin ;2, dir=0; end [m,n]=size(x);

if m>1,

if n == 1,

col=1;

elseif n>1,

error('x must be a vector! break');

end % x is a column vectorelseif m == 1,

if n == 1, y=x;

return elseif n>1,

col=0; % x is a row vector endend

if dir==1, % rotate left or up

if col==0, % row vector, rotate

left

y = [x(2:n) x(1)];

elseif col==1,

y = [x(2:n); x(1)]; % rotate up

end

elseif dir==0, % default rotate

right or down

if col==0,

y = [x(n) x(1:n-1)];

elseif col==1 % column vector

y = [x(n); x(1:n-1)];

end

end

%============================

======================

function

[L1,L2]=crossgens(X1,X2)

%

Usage:[L1,L2]=crossgens(X1,X2)

s=randomize([2:12]')';

n1=min(s(1),s(11));n2=max(s(1

),s(11));

X3=X1;X4=X2;

for i=n1:n2,

for j=1:13,

if X2(i)==X3(j),

X3(j)=0;

end

if X1(i)==X4(j), X4(j)=0;

end

end

end

j=13;k=13;

for i=12:-1:2,

if X3(i)~=0,

j=j-1;

t=X3(j);X3(j)=X3(i);X3(i)=t;

end

if X4(i)~=0,

k=k-1;

t=X4(k);X4(k)=X4(i);X4(i)=t;

end

end

for i=n1:n2

X3(2+i-n1)=X2(i);

X4(2+i-n1)=X1(i);

end

L1=X3;L2=X4;

%=======================

由于BP网络的权值优化是一个无约束优

化问题,而且权值要采用实数编码,所以

直接利用Matlab遗传算法工具箱。以下

贴出的代码是为一个19输入变量,1个输

出变量情况下的非线性回归而设计的,如

果要应用于其它情况,只需改动编解码函

数即可。

程序一:GA训练BP权值的主函数

function net=GABPNET(XX,YY)

%--------------------------------------------------

------------------------

% GABPNET.m

% 使用遗传算法对BP网络权值阈值进

行优化,再用BP算法训练网络

%--------------------------------------------------

------------------------

%数据归一化预处理

nntwarn off

XX=premnmx(XX);

YY=premnmx(YY);

%创建网络

net=newff(minmax(XX),[19,25,1],{'tansig','

tansig','purelin'},'trainlm');

%下面使用遗传算法对网络进行优化

P=XX;

T=YY;

R=size(P,1);

S2=size(T,1);

S1=25;%隐含层节点数

S=R*S1+S1*S2+S1+S2;%遗传算法编码

长度

aa=ones(S,1)*[-1,1];

popu=50;%种群规模

initPpp=initializega(popu,aa,'gabpEval');%

初始化种群

gen=100;%遗传代数

%下面调用gaot工具箱,其中目标函数定

义为gabpEval

[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],i

nitPpp,[1e-6 1 1],'maxGenTerm',gen,...

'normGeomSelect',[0.09],['arithXover'],[2],

'nonUnifMutation',[2 gen 3]);

%绘收敛曲线图

figure(1)

plot(trace(:,1),1./trace(:,3),'r-');

hold on

plot(trace(:,1),1./trace(:,2),'b-');

xlabel('Generation');

ylabel('Sum-Squared Error');

figure(2)

plot(trace(:,1),trace(:,3),'r-');

hold on

plot(trace(:,1),trace(:,2),'b-');

xlabel('Generation');

ylabel('Fittness');

%下面将初步得到的权值矩阵赋给尚未开始训练的BP网络

[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadeco d(x);

net.LW{2,1}=W1;

net.LW{3,2}=W2;

net.b{2,1}=B1;

net.b{3,1}=B2;

XX=P;

YY=T;

%设置训练参数

net.trainParam.show=1;

net.trainParam.lr=1;

net.trainParam.epochs=50;

net.trainParam.goal=0.001;

%训练网络

net=train(net,XX,YY);

程序二:适应值函数

function [sol, val] = gabpEval(sol,options) % val - the fittness of this individual

% sol - the individual, returned to allow for Lamarckian evolution

% options - [current_generation]

load data2

nntwarn off

XX=premnmx(XX);

YY=premnmx(YY);

P=XX;

T=YY;

R=size(P,1);

S2=size(T,1);

S1=25;%隐含层节点数

S=R*S1+S1*S2+S1+S2;%遗传算法编码长度

for i=1:S,

x(i)=sol(i); end;

[W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);

程序三:编解码函数

function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x)

load data2

nntwarn off

XX=premnmx(XX);

YY=premnmx(YY);

P=XX;

T=YY;

R=size(P,1);

S2=size(T,1);

S1=25;%隐含层节点数

S=R*S1+S1*S2+S1+S2;%遗传算法编码长度

% 前R*S1个编码为W1

for i=1:S1,

for k=1:R,

W1(i,k)=x(R*(i-1)+k);

end

end

% 接着的S1*S2个编码(即第R*S1个后的编码)为W2

for i=1:S2,

for k=1:S1,

W2(i,k)=x(S1*(i-1)+k+R*S1);

end

end

% 接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1

for i=1:S1,

B1(i,1)=x((R*S1+S1*S2)+i);

end

% 接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2

for i=1:S2,

B2(i,1)=x((R*S1+S1*S2+S1)+i);

end

% 计算S1与S2层的输出

A1=tansig(W1*P,B1);

A2=purelin(W2*A1,B2);

% 计算误差平方和

SE=sumsqr(T-A2);

val=1/SE; % 遗传算法的适应值

遗传算法经典MATLAB代码

遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程

%----------------------------------------------- % 初始化(编码) % 函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength 表示染色体的长度(二值数的长度), % 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 计算目标函数值 % 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制

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

遗传算法解决简单问题 %主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在区间[-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

MATLAB课程遗传算法实验报告及源代码

硕士生考查课程考试试卷 考试科目: 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点最短路径,其中没有连接端点表示没有路径。要求设计遗传算法对该问题求解。 a e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 一、问题分析(10分) 这是一个简单的三元函数求最小值的函数优化问题,可以利用遗传算法来指导性搜索最小值。实验要求必须以matlab 为工具,利用遗传算法对问题进行求解。 在本实验中,要求我们用M 函数自行设计遗传算法,通过遗传算法基本原理,选择、交叉、变异等操作进行指导性邻域搜索,得到最优解。 二、实验原理与数学模型(20分) (1)试验原理: 用遗传算法求解函数优化问题,遗传算法是模拟生物在自然环境下的遗传和进化过程而形成的一种自适应全局优化概率搜索方法。其采纳了自然进化模型,从代表问题可能潜在解集的一个种群开始,种群由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体;初始种群产生后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的解:在每一代,概据问题域中个体的适应度大小挑选个体;并借助遗传算子进行组合交叉和主客观变异,产生出代表新的解集的种群。这一过程循环执行,直到满足优化准则为止。最后,末代个体经解码,生成近似最优解。基于种群进化机制的遗传算法如同自然界进化一样,后生代种群比前生代更加适应于环境,通过逐代进化,逼近最优解。 遗传算法是一种现代智能算法,实际上它的功能十分强大,能够用于求解一些难以用常规数学手段进行求解的问题,尤其适用于求解多目标、多约束,且目标函数形式非常复杂的优化问题。但是遗传算法也有一些缺点,最为关键的一点,即没有任何理论能够证明遗传算法一定能够找到最优解,算法主要是根据概率论的思想来寻找最优解。因此,遗传算法所得到的解只是一个近似解,而不一定是最优解。 (2)数学模型 对于求解该问题遗传算法的构造过程: (1)确定决策变量和约束条件;

基于遗传算法的matlab源代码

function youhuafun D=code; N=50;%Tunable maxgen=50;%Tunable crossrate=0.5;%Tunable muterate=0.08;%Tunable generation=1; num=length(D); fatherrand=randint(num,N,3); score=zeros(maxgen,N); while generation<=maxgen ind=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; %end fatherrand=[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(t mpind)]; if~any(difind) difind(1)=1; end childind(k)=scoreind(logical(difind)); end fatherrand=fatherrand(:,childind); generation=generation+1; end %score maxV=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 D function D=code load youhua.mat %properties F2and F3 F1=A(:,1); F2=A(:,2); F3=A(:,3); if(max(F2)>1450)||(min(F2)<=900) error('DATA property F2exceed it''s range (900,1450]') end %get group property F1of data,according to F2value F4=zeros(size(F1)); for ite=11:-1:1 index=find(F2<=900+ite*50); F4(index)=ite; end D=[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; %这里有待优化

遗传算法Matlab程序

% f(x)=11*sin(6x)+7*cos(5x),0<=x<=2*pi; %%初始化参数 L=16;%编码为16位二进制数 N=32;%初始种群规模 M=48;%M个中间体,运用算子选择出M/2对母体,进行交叉;对M个中间体进行变异 T=100;%进化代数 Pc=0.8;%交叉概率 Pm=0.03;%%变异概率 %%将十进制编码成16位的二进制,再将16位的二进制转成格雷码 for i=1:1:N x1(1,i)= rand()*2*pi; x2(1,i)= uint16(x1(1,i)/(2*pi)*65535); grayCode(i,:)=num2gray(x2(1,i),L); end %% 开始遗传算子操作 for t=1:1:T y1=11*sin(6*x1)+7*cos(5*x1); for i=1:1:M/2 [a,b]=min(y1);%找到y1中的最小值a,及其对应的编号b grayCodeNew(i,:)=grayCode(b,:);%将找到的最小数放到grayCodeNew中grayCodeNew(i+M/2,:)=grayCode(b,:);%与上面相同就可以有M/2对格雷码可以作为母体y1(1,b)=inf;%用来排除已找到的最小值 end for i=1:1:M/2 p=unidrnd(L);%生成一个大于零小于L的数,用于下面进行交叉的位置if rand()

遗传算法经典MATLAB代码资料讲解

遗传算法经典学习Matlab代码 遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % 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表示待解码的二进制串的起始位置

遗传算法的MATLAB程序实例

遗传算法的程序实例 如求下列函数的最大值 f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 一、初始化(编码) initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 代码: %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 二、计算目标函数值 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-1).*pop(:,i); py=py-1; end pop2=sum(pop1,2); %求pop1的每行之和 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); 3、计算目标函数值 calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

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

1 遗传算法的原理 1.1 遗传算法的基本思想 遗传算法(genetic algorithms,GA)是一种基于自然选择和基因遗传学原理,借鉴了生物进化优胜劣汰的自然选择机理和生物界繁衍进化的基因重组、突变的遗传机制的全局自适应概率搜索算法。 遗传算法是从一组随机产生的初始解(种群)开始,这个种群由经过基因编码的一定数量的个体组成,每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,其内部表现(即基因型)是某种基因组合,它决定了个体的外部表现。因此,从一开始就需要实现从表现型到基因型的映射,即编码工作。初始种群产生后,按照优胜劣汰的原理,逐代演化产生出越来越好的近似解。在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样,后代种群比前代更加适应环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。 计算开始时,将实际问题的变量进行编码形成染色体,随机产生一定数目的个体,即种群,并计算每个个体的适应度值,然后通过终止条件判断该初始解是否是最优解,若是则停止计算输出结果,若不是则通过遗传算子操作产生新的一代种群,回到计算群体中每个个体的适应度值的部分,然后转到终止条件判断。这一过程循环执行,直到满足优化准则,最终产生问题的最优解。图1-1给出了遗传算法的基本过程。 1.2 遗传算法的特点 1.2.1 遗传算法的优点 遗传算法具有十分强的鲁棒性,比起传统优化方法,遗传算法有如下优点: 1. 遗传算法以控制变量的编码作为运算对象。传统的优化算法往往直接利用控制变量的实际值的本身来进行优化运算,但遗传算法不是直接以控制变量的值,而是以控制变量的特定形式的编码为运算对象。这种对控制变量的编码处理方式,可以模仿自然界中生物的遗传和进化等机理,也使得我们可以方便地处理各种变量和应用遗传操作算子。 2. 遗传算法具有内在的本质并行性。它的并行性表现在两个方面,一是遗传

基于遗传算法的BP神经网络MATLAB代码

用遗传算法优化BP神经网络的Matlab编程实例(转) 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm'); %下面使用遗传算法对网络进行优化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 aa=ones(S,1)*[-1,1]; popu=50;%种群规模 save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数

遗传算法的MATLAB程序实例讲解学习

遗传算法的M A T L A B 程序实例

遗传算法的程序实例 如求下列函数的最大值 f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 一、初始化(编码) initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 代码: %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 二、计算目标函数值 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-1).*pop(:,i); py=py-1; end pop2=sum(pop1,2); %求pop1的每行之和 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); 3、计算目标函数值 calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

三个遗传算法matlab程序实例

遗传算法程序(一): 说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作! function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 最佳染色体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取100--1000(默认200) % popsize - 每一代种群的规模;此可取50--200(默认100) % pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8) % pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1) % pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编 %码,option(2)设定求解精度(默认1e-4) % % ------------------------------------------------------------------------ T1=clock; if nargin<3, error('FMAXGA requires at least three input arguments'); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error('数据输入错误,请重新输入(LB

简单的遗传算法MATLAB实现

遗传算法是对达尔文生物进化理论的简单模拟,其遵循“适者生存”、“优胜略汰”的原理。遗传算法模拟一个人工种群的进化过程,并且通过选择、杂交以及变异等机制,种群经过若干代以后,总是达到最优(或近最优)的状态。 自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。遗传算法也是当前“软计算”领域的重要研究课题。 本文首先结合MATLAB对遗传算法实现过程进行详细的分析,然后通过1个实际的函数优化案例对其应用进行探讨。 1. 遗传算法实现过程 现实生活中很多问题都可以转换为函数优化问题,所以本文将以函数优化问题作为背景,对GA的实现过程进行探讨。大部分函数优化问题都可以写成求最大值或者最小值的形式,为了不是一般性,我们可以将所有求最优值的情况都转换成求最大值的形式,例如,求函数f(x)的最大值,

若是求函数f(x)的最小值,可以将其转换成 g(x)=-f(x),然后求g(x)的最大值, 这里x可以是一个变量,也可是是一个由k个变量组成的向量,x=(x1, x2, …, x k)。每个x i,i=1,2,…,k, 其定义域为D i,D i=[a i, b i]。 一般规定f(x)在其定义域内只取正值,若不满足,可以将其转换成以下形式, 其中C是一个正常数。 1.1 编码与解码 要实现遗传算法首先需要弄清楚如何对求解问题进行编码和解码。对于函数优化问题,一般来说,有两种编码方式,一是实数编码,一是二进制编码,两者各有优缺点,二进制编码具有稳定性高、种群多样性大等优点,但是需要的存储空间大,需要解码过程并且难以理解;而实数编码直接用实数表示基因,容易理解并且不要解码过程,但是容易过早收敛,从而陷入局部最优。本文以最常用的二进制编码为例,说明遗传编码的过程。

遗传算法求函数极大值(matlab实现)

遗传算法求函数最大值(matlab实现) 一、题目: 寻找f(x)=x2,,当x在0~31区间的最大值。 二、源程序: %遗传算法求解函数最大值 %本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些 Close all; Clear all; figure(1); fplot('variable*variable',[0,31]); %画出函数曲线 %以下定义遗传算法参数 GTSM=40; %定义个体数目 ZDYCDS=20; %定义最大遗传代数 EJZWS=5; %定义变量的二进制位数 DG=0.9; %定义代沟 trace=zeros(2, ZDYCDS); %最优结果的初始值

FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异 Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定 规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换 ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen

使用MATLAB遗传算法工具实例(详细) (1)【精品毕业设计】(完整版)

最新发布的MA TLAB 7.0 Release 14已经包含了一个专门设计的遗传算法与直接搜索工具箱(Genetic Algorithm and Direct Search Toolbox,GADS)。使用遗传算法与直接搜索工具箱,可以扩展MATLAB及其优化工具箱在处理优化问题方面的能力,可以处理传统的优化技术难以解决的问题,包括那些难以定义或不便于数学建模的问题,可以解决目标函数较复杂的问题,比如目标函数不连续、或具有高度非线性、随机性以及目标函数没有导数的情况。 本章8.1节首先介绍这个遗传算法与直接搜索工具箱,其余各节分别介绍该工具箱中的遗传算法工具及其使用方法。 8.1 遗传算法与直接搜索工具箱概述 本节介绍MATLAB的GADS(遗传算法与直接搜索)工具箱的特点、图形用户界面及运行要求,解释如何编写待优化函数的M文件,且通过举例加以阐明。 8.1.1 工具箱的特点 GADS工具箱是一系列函数的集合,它们扩展了优化工具箱和MA TLAB数值计算环境的性能。遗传算法与直接搜索工具箱包含了要使用遗传算法和直接搜索算法来求解优化问题的一些例程。这些算法使我们能够求解那些标准优化工具箱范围之外的各种优化问题。所有工具箱函数都是MATLAB的M文件,这些文件由实现特定优化算法的MATLAB语句所写成。 使用语句 type function_name 就可以看到这些函数的MATLAB代码。我们也可以通过编写自己的M文件来实现来扩展遗传算法和直接搜索工具箱的性能,也可以将该工具箱与MATLAB的其他工具箱或Simulink结合使用,来求解优化问题。 工具箱函数可以通过图形界面或MA TLAB命令行来访问,它们是用MATLAB语言编写的,对用户开放,因此可以查看算法、修改源代码或生成用户函数。 遗传算法与直接搜索工具箱可以帮助我们求解那些不易用传统方法解决的问题,譬如表查找问题等。 遗传算法与直接搜索工具箱有一个精心设计的图形用户界面,可以帮助我们直观、方便、快速地求解最优化问题。 8.1.1.1 功能特点 遗传算法与直接搜索工具箱的功能特点如下: 图形用户界面和命令行函数可用来快速地描述问题、设置算法选项以及监控进程。 具有多个选项的遗传算法工具可用于问题创建、适应度计算、选择、交叉和变异。 直接搜索工具实现了一种模式搜索方法,其选项可用于定义网格尺寸、表决方法和搜索方法。 遗传算法与直接搜索工具箱函数可与MATLAB的优化工具箱或其他的MATLAB程序结合使用。 支持自动的M代码生成。 8.1.1.2 图形用户界面和命令行函数 遗传算法工具函数可以通过命令行和图形用户界面来使用遗传算法。直接搜索工具函数也可以通过命令行和图形用户界面来进行访问。图形用户界面可用来快速地定义问题、设置算法选项、对优化问题进行详细定义。 133

matlab遗传算法程序

matlab遗传算法程序共13个.m文件。 1、B2F.m function [B,len,v]=B2F(sol,bounds) %[B,len]=B2F(x,bounds) 二进制编码函数 %x 编码向量如x=[6 8 9]; %bounds 边界约束ru如bounds=[4 8 ;3 11;6 12;]; %B 二进制编码串 %编码长度L由bounds(2)-bounds(1)决定 %以上为例: % 编码长度向量L=[4 8 6]编成二进制L=[11 1000 110],则len=[2 4 3] % 计算B=x-bound(1)=[2 5 3]编成二进制B=[10 0101 011] n=length(sol); len=[];B=[];v=[]; L=bounds(:,2)-bounds(:,1); L=de2bi(L); for i=1:n len(i)=length(L(i,:)); end v=sol-bounds(:,1)'; for i=1:n B=[B de2bi(v(i),len(i))]; end

2、changes.m function [pops]=changes(cpop,bounds,len,p) %基因突变函数 %function [pops]=changes(pop,bounds,len,p) %pop 种群数目 %bounds 边界约束 %len 每个变量的编码长度 % 如len为[4 3 3];表示有三个变量,第一个变量的二进制编码长度为4,依次类推%p 突变概率 %pops 返回突变后的基因 %p1 基因突变数目 if isempty(p) p=0.01; end [n,m]=size(cpop); pop=cpop; p1=round(sum(len)*n*p); k=0;q=[];v=[]; while(k

Matlab环境下的遗传算法程序设计及优化问题求解

本栏目责任编辑:谢媛媛 开发研究与设计技术 遗传算法(GA)是借鉴生物界自然选择和群体进化机制而形成的一种全局寻优算法,其本质上是一种基于概率的随机搜索算法。与其它的优化算法相比较,遗传算法具有以下优点:(1)通用性;(2)并行性;(3)简单性和可操作性;(4)稳定性和全局性。 1遗传算法概述 在遗传算法中,首先将空间问题中的决策变量通过一定的编码表示成遗传空间的一个个体,它是一个基因型串结构数据;然后将目标函数转换成适应度值,用来评价每个个体的优劣,并将其作为遗传操作的依据。遗传操作包括三个算子:选择、重组和变异。选择是从当前群体中选择适应值高的个体以生成交配池的过程,交配池是当前代与下一代之间的中间群体。选择算子的作用是用来提高群体的平均适应度值。重组算子的作用是将原有的优良基因遗传给下一代个体,并生成包含更复杂基因的新个体,它先从交配池中的个体随机配对,然后将两两配对的个体按一定方式相互交换部分基因。变异算子是对个体的某一个或几位按某一较小的概率进行反转其二进制字符,模拟自然界的基因突变现象。 遗传算法的基本程序实现流程如下: (1)先确定待优化的参数大致范围,然后对搜索空间进行编码;(2)随机产生包含各个个体的初始种群; (3)将种群中各个个体解码成对应的参数值,用解码后的参数求代价函数和适应度函数,运用适应度函数评估检测各个个体适应度; (4)对收敛条件进行判断,如果已经找到最佳个体,则停止,否则继续进行遗传操作; (5)进行选择操作,让适应度大的个体在种群中占有较大的比例,一些适应度较小的个体将会被淘汰; (6)随机交叉,两个个体按一定的交叉概率进行交叉操作,并产生两个新的子个体; (7)按照一定的变异概率变异,使个体的某个或某些位的性质发生改变; (8)重复步骤(3)至(7),直至参数收敛达到预定的指标。使用遗传算法需要确定的运行参数有:编码串长度、交叉和变异概率、种群规模。编码串长度由问题的所要求的精度来决定。交叉概率控制着交叉操作的频率,交叉操作是遗传算法中产生新 个体的主要方法,所以交叉概率通常应取较大值,但如果交叉概率太大的话又可能反过来会破坏群体的优良模式,一般取0.4- 0.99。变异概率也是影响新个体产生的一个因素,如果变异概率 太小,则产生新个体较少;如果变异概率太大,则又会使遗传算法变成随机搜索,为保证个体变异后与其父体不会产生太大的差异,通常取变异概率为0.0001-0.1以保证种群发展的稳定性。种群规模太大时,计算量会很大,使遗传算法的运行效率降低,种群规模太小时,可以提高遗传算法的运行速度,但却种群的多样性却降低了,有可能找不出最优解,通常取种群数目20-100。从理论上讲,不存在一组适用于所有问题的最佳参数值,随着问题参数的变化,有效问参数的差异往往是十分显著的。 2用Matlab语言来实现遗传算法 Matlab是一个高性能的计算软件,配备有功能强大的数学函 数支持库,适用范围大,编程效率高,语句简单,功能齐备,是世界上顶级的计算与仿真程序软件。利用Matlab来编写遗传算法程序简单而且易于操作。 2.1编码 编码就是把一个问题的可行解从其解空间转换到遗传算法能够处理的搜索空间的转化方法,编码形式决定了重组算子的操作。遗传算法是对编码后的个体作选择与交叉运算,然后通过这些反复运算达到优化目标。遗传算法首要的问题是通过编码将决策变量表示成串结构数据。我们常用的是二进制编码,即用二进制数构成的符号串来表示每个个体。通常根据搜索精度(sca_var)、决策变量上界(range(2))的和下界(range(1))来确定各个二进制字符串的长度(bit_n), 搜索精度为sca_var=(range(2)-range(1))./ (2^bit_n—1),然后再随机产生一个的初始种群(be_gen),其规模为popusize。下面用encoding函数来实现编码和产生初始的种群: function[be_gen,bit_n]=encoding(sca_var,range(1),range(2),popusize) bit_n=ceil(log2((range(2)-range(1))./sca_var));be_gen=randint(popusize,sum(bit_n));2.2译码 决策变量经过编码之后,各个个体构成的种群be_gen要通过解码才能转换成原问题空间的决策变量构成的种群vgen,这样才 收稿日期:2006-01-05 作者简介:梁科(1981-),硕士研究生,研究方向:智能计算与优化方法;夏定纯(1963-),教授,研究方向:人工智能,计算机在线检测。 Matlab 环境下的遗传算法程序设计及优化问题求解 梁科,夏定纯 (武汉科技学院计算机科学学院,湖北武汉430073) 摘要:本文介绍了遗传算法的流程及几个算子,给出了在matlab语言环境下实现编码、译码、选择、重组和变异各算子的编程方法,最后用一个实例来说明遗传算法在寻找全局最优解中的应用。 关键词:遗传算法;matlab;程序设计中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2007)04-11049-03 GeneticAlgorithmProgrammingByMatlabAndOptimizingProblemSolving LIANGKe,XIADing-chun (DepartmentofComputerscience,WuhanUniversityofScience&Engineering,Wuhan430073,China) Abstract:Theseveralfactorsofgeneticalgorithmhavebeenpresentedinthispaper,andtheprogrammingofencoding、decoding、choice、crossoverandmutationofmatlabhavebeengiven,finally,afunctionoptimizingproblemhasbeenpresentedtodemonstratedtheapplicationaboutglobaloptimizingofgeneticalgorithm. Keywords:GA;matlab;programming 1049

相关文档
相关文档 最新文档