基于MATLAB65遗传算法程序.docx

上传人:b****8 文档编号:10444048 上传时间:2023-02-11 格式:DOCX 页数:11 大小:18.09KB
下载 相关 举报
基于MATLAB65遗传算法程序.docx_第1页
第1页 / 共11页
基于MATLAB65遗传算法程序.docx_第2页
第2页 / 共11页
基于MATLAB65遗传算法程序.docx_第3页
第3页 / 共11页
基于MATLAB65遗传算法程序.docx_第4页
第4页 / 共11页
基于MATLAB65遗传算法程序.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

基于MATLAB65遗传算法程序.docx

《基于MATLAB65遗传算法程序.docx》由会员分享,可在线阅读,更多相关《基于MATLAB65遗传算法程序.docx(11页珍藏版)》请在冰豆网上搜索。

基于MATLAB65遗传算法程序.docx

基于MATLAB65遗传算法程序

[原创]基于MATLAB6.5遗传算法程序

function[BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation,options)

%[BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)

%Findsa  maximumofafunctionofseveralvariables.

%fmaxgasolvesproblemsoftheform:

  

%      maxF(X)  subjectt  LB<=X<=UB                            

%  BestPop--------最优的群体即为最优的染色体群

%  Trace----------最佳染色体所对应的目标函数值

%  FUN------------目标函数

%  LB-------------自变量下限

%  UB-------------自变量上限

%  eranum---------种群的代数,取100--1000(默认1000)

%  popsize--------每一代种群的规模;此可取50--100(默认50)

%  pcross---------交叉的概率,此概率一般取0.5--0.85之间较好(默认0.8)

%  pmutation------变异的概率,该概率一般取0.05-0.2左右较好(默认0.1)

%  options--------1×2矩阵,options

(1)=0二进制编码(默认0),option

(1)~=0十进制编码,option

(2)设定求解精度(默认1e-4)

%                

%例如测试Shaffer'sF6函数,自变量下限[-100,-100],上限[100,100],当x=[00]时,MaxF6=1

%运行得到相当好的结果:

自变量为0.00033379-4.7684e-005时,最优值1.000000

%对应染色体是:

1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1

T1=clock;

ifnargin<3,error('FMAXGArequiresatleastthreeinputarguments');end

ifnargin==3,eranum=1000;popsize=50;pcross=0.8;pmutation=0.1;options=[01e-4];end

ifnargin==4,popsize=50;pcross=0.8;pmutation=0.1;options=[01e-4];end

ifnargin==5,pcross=0.8;pmutation=0.1;options=[01e-4];end

ifnargin==6,pmutation=0.1;options=[01e-4];end

ifnargin==7,options=[01e-4];end

iffind((LB-UB)>0)

  error('数据输入错误,请重新输入(LB

');

end

s=sprintf('程序运行需要约%.4f秒钟时间,请稍等......',(eranum*popsize*40/(1000*50)));

disp(s);

bounds=[LB;UB]';bits=[];

precision=options

(2);%由求解精度确定二进制编码长度

bits=ceil(log2((bounds(:

2)-bounds(:

1))'./precision));%由设定精度划分区间

[Pop]=initpop(popsize,bits);%初始化种群

[m,n]=size(Pop);

pm0=pmutation;

BestPop=zeros(eranum,n);Trace=zeros(eranum,length(bits)+1);%分配初始解空间

i=1;

whilei<=eranum

    forj=1:

m

        value(j)=feval(FUN(1,:

),(b2f(Pop(j,:

),bounds,bits)));%计算适应度

    end

    [MaxValue,Index]=max(value);

    BestPop(i,:

)=Pop(Index,:

);

    Trace(i,1)=MaxValue;

    Trace(i,(2:

length(bits)+1))=b2f(BestPop(i,:

),bounds,bits);

    [selectpop]=SelectChrom(FUN,Pop,bounds,bits);%选择

    [CrossOverPop]=CrossOver(selectpop,pcross);%交叉

    [NewPop]=Mutation(CrossOverPop,pmutation);%变异

    Pop=NewPop;%更新

    pmutation=pm0+(i^4)*(pcross/2-pm0)/(eranum^4);%随着种群向前进化,逐步增大变异率

    p(i)=pmutation;

    i=i+1;

end

t=1:

eranum;

plot(t,Trace(:

1)');

title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');

[MaxFval,I]=max(Trace(:

1));

X=Trace(I,(2:

length(bits)+1));

holdon;  plot(I,MaxFval,'*');

text(I+5,MaxFval,['FMAX='num2str(MaxFval)]);

str1=sprintf('进化到%d代,自变量为%s时,得本次求解的最优值%f\n对应染色体是:

%s',...

            I,num2str(X),MaxFval,num2str(BestPop(I,:

)));

disp(str1);

%figure

(2);plot(t,p);%绘制变异值增大过程

T2=clock;

CostTime=T2-T1;

ifCostTime(6)<0

    CostTime(6)=CostTime(6)+60;CostTime(5)=CostTime(5)-1;

end

ifCostTime(5)<0

    CostTime(5)=CostTime(5)+60;CostTime(4)=CostTime(4)-1;

end  %像这种程序当然不考虑运行上小时啦

str2=sprintf('程序运行耗时%d小时%d分钟%.4f秒',CostTime(4),CostTime(5),CostTime(6));

disp(str2);

%初始化种群,采用二进制编码

function[pop]=initpop(popsize,bits)

len=sum(bits);

pop(1,:

)=zeros(1,len);%Thewholezeroencoding

fori=2:

popsize-1

    pop(i,:

)=round(rand(1,len));

end

pop(popsize,:

)=ones(1,len);%Thewholeoneencoding

%解码

function[fval]=b2f(bval,bounds,bits)

%fval  -表征各变量的十进制数

%bval  -表征各变量的二进制编码串

%bounds-各变量的取值范围

%bits  -各变量的二进制编码长度

scale=(bounds(:

2)-bounds(:

1))'./(2.^bits-1);%Therangeofthevariables

numV=size(bounds,1);

cs=[0cumsum(bits)];

fori=1:

numV

  a=bval((cs(i)+1):

cs(i+1));

  fval(i)=sum(2.^(size(a,2)-1:

-1:

0).*a)*scale(i)+bounds(i,1);

end

%选择操作

function[selectpop]=SelectChrom(FUN,pop,bounds,bits)%计算各个体的适应度并采用轮盘赌进行选择

[m,n]=size(pop);

fori=1:

m

    fit(i)=feval(FUN(1,:

),(b2f(pop(i,:

),bounds,bits)));%以函数值为适应度

end

selectprob=fit/sum(fit);%选择概率

prob=cumsum(selectprob);%累计选择概率

sumprob=[0prob];

fori=1:

m

    selectpop(i,:

)=pop(length(find(rand>=sumprob)),:

);

end    

    

%交叉操作

function[NewPop]=CrossOver(OldPop,pcross)%OldPop为父代种群,pcross为交叉概率

[m,n]=size(OldPop);

r=rand(1,m);

y1=find(r

y2=find(r>=pcross);

len=length(y1);

iflen>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数

    y2(length(y2)+1)=y1(len);

    y1(len)=[];

end

iflength(y1)>=2

  fori=0:

2:

length(y1)-2

      [NewPop(y1(i+1),:

),NewPop(y1(i+2),:

)]=EqualCrossOver(OldPop(y1(i+1),:

),OldPop(y1(i+2),:

));

  end    

end

NewPop(y2,:

)=OldPop(y2,:

);

function[children1,children2]=EqualCrossOver(parent1,parent2)

%采用均匀交叉例:

%父1:

01110011010

%父2:

10101100101

%掩码:

01100011010

%交叉后新个体:

%子1:

11101111111

%子2:

00110000000

L=length(parent1);

hidecode=round(rand(1,L));%随机生成掩码,如hidecode=[01100011010];

children1=zeros(1,L);

children2=zeros(1,L);

children1(find(hidecode==1))=parent1(find(hidecode==1));%掩码为1,父1为子1提供基因

children1(find(hidecode==0))=parent2(find(hidecode==0));%掩码为0,父2为子1提供基因

children2(find(hidecode==1))=parent2(find(hidecode==1));%掩码为1,父2为子2提供基因

children2(find(hidecode==0))=parent1(find(hidecode==0));%掩码为0,父1为子2提供基因

%变异操作

function[NewPop]=Mutation(OldPop,pmutation)

[m,n]=size(OldPop);

r=rand(1,m);

position=find(r<=pmutation);

len=length(position);

iflen>=1

  fori=1:

len

      k=unidrnd(n,1,1);%设置变异点数,一般设置1点

      forj=1:

length(k)

          ifOldPop(position(i),k(j))==1

              OldPop(position(i),k(j))=0;

          else

              OldPop(position(i),k(j))=1;

          end

      end

  end

end

NewPop=OldPop;

她含着笑,切着冰屑悉索的萝卜,  

她含着笑,用手掏着猪吃的麦糟,  

她含着笑,扇着炖肉的炉子的火,  

她含着笑,背了团箕到广场上去  

晒好那些大豆和小麦,  

大堰河,为了生活,  

在她流尽了她的乳液之后,  

她就用抱过我的两臂,劳动了。

  

大堰河,深爱着她的乳儿;  

在年节里,为了他,忙着切那冬米的糖,  

为了他,常悄悄地走到村边的她的家里去,  

为了他,走到她的身边叫一声“妈”,  

大堰河,把他画的大红大绿的关云长  

贴在灶边的墙上,  

大堰河,会对她的邻居夸口赞美她的乳儿;  

大堰河曾做了一个不能对人说的梦:

  

在梦里,她吃着她的乳儿的婚酒,  

坐在辉煌的结彩的堂上,  

而她的娇美的媳妇亲切的叫她“婆婆”  

…………  

大堰河,深爱她的乳儿!

  

大堰河,在她的梦没有做醒的时候已死了。

  

她死时,乳儿不在她的旁侧,  

她死时,平时打骂她的丈夫也为她流泪,  

五个儿子,个个哭得很悲,  

她死时,轻轻地呼着她的乳儿的名字,  

大堰河,已死了,  

她死时,乳儿不在她的旁侧。

  

大堰河,含泪的去了!

  

同着四十几年的人世生活的凌侮,  

同着数不尽的奴隶的凄苦,  

同着四块钱的棺材和几束稻草,  

同着几尺长方的埋棺材的土地,  

同着一手把的纸钱的灰,  

大堰河,她含泪的去了。

  

这是大堰河所不知道的:

  

她的醉酒的丈夫已死去,  

大儿做了土匪,  

第二个死在炮火的烟里,  

第三,第四,第五  

而我,我是在写着给予这不公道的世界的咒语。

  

当我经了长长的飘泊回到故土时,  

在山腰里,田野上,  

兄弟们碰见时,是比六七年

她含着笑,切着冰屑悉索的萝卜,  

她含着笑,用手掏着猪吃的麦糟,  

她含着笑,扇着炖肉的炉子的火,  

她含着笑,背了团箕到广场上去  

晒好那些大豆和小麦,  

大堰河,为了生活,  

在她流尽了她的乳液之后,  

她就用抱过我的两臂,劳动了。

  

大堰河,深爱着她的乳儿;  

在年节里,为了他,忙着切那冬米的糖,  

为了他,常悄悄地走到村边的她的家里去,  

为了他,走到她的身边叫一声“妈”,  

大堰河,把他画的大红大绿的关云长  

贴在灶边的墙上,  

大堰河,会对她的邻居夸口赞美她的乳儿;  

大堰河曾做了一个不能对人说的梦:

  

在梦里,她吃着她的乳儿的婚酒,  

坐在辉煌的结彩的堂上,  

而她的娇美的媳妇亲切的叫她“婆婆”  

…………  

大堰河,深爱她的乳儿!

  

大堰河,在她的梦没有做醒的时候已死了。

  

她死时,乳儿不在她的旁侧,  

她死时,平时打骂她的丈夫也为她流泪,  

五个儿子,个个哭得很悲,  

她死时,轻轻地呼着她的乳儿的名字,  

大堰河,已死了,  

她死时,乳儿不在她的旁侧。

  

大堰河,含泪的去了!

  

同着四十几年的人世生活的凌侮,  

同着数不尽的奴隶的凄苦,  

同着四块钱的棺材和几束稻草,  

同着几尺长方的埋棺材的土地,  

同着一手把的纸钱的灰,  

大堰河,她含泪的去了。

  

这是大堰河所不知道的:

  

她的醉酒的丈夫已死去,  

大儿做了土匪,  

第二个死在炮火的烟里,  

第三,第四,第五  

而我,我是在写着给予这不公道的世界的咒语。

  

当我经了长长的飘泊回到故土时,  

在山腰里,田野上,  

兄弟们碰见时,是比六七年

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1