1、基于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) % Finds amaximum of a function of several variables.% fmaxga solves problems of the form:%max F(X)subject tLB = X = UB%
2、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-12矩阵,options(1)=0二进制编码(默认0),option(1)=0十进制编码,option(2)设定求解精度(默认1e-4)% % 例如测试
3、Shaffers F6函数,自变量下限-100,-100,上限100,100,当x=0 0时,MaxF6=1% 运行得到相当好的结果:自变量为 0.00033379-4.7684e-005 时,最优值 1.000000% 对应染色体是:100000000000000000011011111111111111111111T1=clock;if nargin0) error(数据输入错误,请重新输入(LBUB):);ends=sprintf(程序运行需要约%.4f 秒钟时间,请稍等.,(eranum*popsize*40/(1000*50);disp(s);bounds=LB;UB;bits=;p
4、recision=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;while i=eranumfor j=1:mvalue(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bit
5、s);%计算适应度endMaxValue,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=pm
6、0+(i4)*(pcross/2-pm0)/(eranum4); %随着种群向前进化,逐步增大变异率p(i)=pmutation;i=i+1;endt=1:eranum;plot(t,Trace(:,1);title(函数优化的遗传算法);xlabel(进化世代数(eranum);ylabel(每一代最优适应度(maxfitness);MaxFval,I=max(Trace(:,1);X=Trace(I,(2:length(bits)+1);hold on;plot(I,MaxFval,*);text(I+5,MaxFval,FMAX= num2str(MaxFval);str1=sprint
7、f(进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %fn对应染色体是:%s,. I,num2str(X),MaxFval,num2str(BestPop(I,:);disp(str1);%figure(2);plot(t,p);%绘制变异值增大过程T2=clock;CostTime=T2-T1;if CostTime(6)0CostTime(6)=CostTime(6)+60; CostTime(5)=CostTime(5)-1;endif CostTime(5)=sumprob),:);end%交叉操作function NewPop=CrossOver(OldPop,pcros
8、s)%OldPop为父代种群,pcross为交叉概率m,n=size(OldPop);r=rand(1,m);y1=find(r=pcross);len=length(y1);if len2&mod(len,2)=1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数y2(length(y2)+1)=y1(len);y1(len)=;endif length(y1)=2 for i=0:2:length(y1)-2 NewPop(y1(i+1),:),NewPop(y1(i+2),:)=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:); e
9、nd endNewPop(y2,:)=OldPop(y2,:);function children1,children2=EqualCrossOver(parent1,parent2)%采用均匀交叉 例:%父1:0 1 1 1 0 0 1 1 0 1 0%父2:1 0 1 0 1 1 0 0 1 0 1%掩码:0 1 1 0 0 0 1 1 0 1 0%交叉后新个体:%子1:1 1 1 0 1 1 1 1 1 1 1 %子2:0 0 1 1 0 0 0 0 0 0 0L=length(parent1);hidecode=round(rand(1,L);%随机生成掩码,如hidecode=0 1
10、 1 0 0 0 1 1 0 1 0;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(fin
11、d(hidecode=0);%掩码为0,父1为子2提供基因%变异操作function NewPop=Mutation(OldPop,pmutation)m,n=size(OldPop);r=rand(1,m);position=find(r=1 for i=1:len k=unidrnd(n,1,1); %设置变异点数,一般设置1点 for j=1:length(k) if OldPop(position(i),k(j)=1OldPop(position(i),k(j)=0; elseOldPop(position(i),k(j)=1; end end endendNewPop=OldPop;
12、她含着笑,切着冰屑悉索的萝卜,她含着笑,用手掏着猪吃的麦糟,她含着笑,扇着炖肉的炉子的火,她含着笑,背了团箕到广场上去晒好那些大豆和小麦,大堰河,为了生活,在她流尽了她的乳液之后,她就用抱过我的两臂,劳动了。大堰河,深爱着她的乳儿;在年节里,为了他,忙着切那冬米的糖,为了他,常悄悄地走到村边的她的家里去,为了他,走到她的身边叫一声“妈”,大堰河,把他画的大红大绿的关云长贴在灶边的墙上,大堰河,会对她的邻居夸口赞美她的乳儿;大堰河曾做了一个不能对人说的梦:在梦里,她吃着她的乳儿的婚酒,坐在辉煌的结彩的堂上,而她的娇美的媳妇亲切的叫她“婆婆”大堰河,深爱她的乳儿!大堰河,在她的梦没有做醒的时候已死
13、了。她死时,乳儿不在她的旁侧,她死时,平时打骂她的丈夫也为她流泪,五个儿子,个个哭得很悲,她死时,轻轻地呼着她的乳儿的名字,大堰河,已死了,她死时,乳儿不在她的旁侧。大堰河,含泪的去了!同着四十几年的人世生活的凌侮,同着数不尽的奴隶的凄苦,同着四块钱的棺材和几束稻草,同着几尺长方的埋棺材的土地,同着一手把的纸钱的灰,大堰河,她含泪的去了。这是大堰河所不知道的:她的醉酒的丈夫已死去,大儿做了土匪,第二个死在炮火的烟里,第三,第四,第五而我,我是在写着给予这不公道的世界的咒语。当我经了长长的飘泊回到故土时,在山腰里,田野上,兄弟们碰见时,是比六七年她含着笑,切着冰屑悉索的萝卜,她含着笑,用手掏着猪
14、吃的麦糟,她含着笑,扇着炖肉的炉子的火,她含着笑,背了团箕到广场上去晒好那些大豆和小麦,大堰河,为了生活,在她流尽了她的乳液之后,她就用抱过我的两臂,劳动了。大堰河,深爱着她的乳儿;在年节里,为了他,忙着切那冬米的糖,为了他,常悄悄地走到村边的她的家里去,为了他,走到她的身边叫一声“妈”,大堰河,把他画的大红大绿的关云长贴在灶边的墙上,大堰河,会对她的邻居夸口赞美她的乳儿;大堰河曾做了一个不能对人说的梦:在梦里,她吃着她的乳儿的婚酒,坐在辉煌的结彩的堂上,而她的娇美的媳妇亲切的叫她“婆婆”大堰河,深爱她的乳儿!大堰河,在她的梦没有做醒的时候已死了。她死时,乳儿不在她的旁侧,她死时,平时打骂她的丈夫也为她流泪,五个儿子,个个哭得很悲,她死时,轻轻地呼着她的乳儿的名字,大堰河,已死了,她死时,乳儿不在她的旁侧。大堰河,含泪的去了!同着四十几年的人世生活的凌侮,同着数不尽的奴隶的凄苦,同着四块钱的棺材和几束稻草,同着几尺长方的埋棺材的土地,同着一手把的纸钱的灰,大堰河,她含泪的去了。这是大堰河所不知道的:她的醉酒的丈夫已死去,大儿做了土匪,第二个死在炮火的烟里,第三,第四,第五而我,我是在写着给予这不公道的世界的咒语。当我经了长长的飘泊回到故土时,在山腰里,田野上,兄弟们碰见时,是比六七年
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1