基于MATLAB65遗传算法程序.docx
《基于MATLAB65遗传算法程序.docx》由会员分享,可在线阅读,更多相关《基于MATLAB65遗传算法程序.docx(11页珍藏版)》请在冰豆网上搜索。
![基于MATLAB65遗传算法程序.docx](https://file1.bdocx.com/fileroot1/2023-2/11/413d2d10-59e1-4350-8a69-b6f569b4373e/413d2d10-59e1-4350-8a69-b6f569b4373e1.gif)
基于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(ry2=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;
她含着笑,切着冰屑悉索的萝卜,
她含着笑,用手掏着猪吃的麦糟,
她含着笑,扇着炖肉的炉子的火,
她含着笑,背了团箕到广场上去
晒好那些大豆和小麦,
大堰河,为了生活,
在她流尽了她的乳液之后,
她就用抱过我的两臂,劳动了。
大堰河,深爱着她的乳儿;
在年节里,为了他,忙着切那冬米的糖,
为了他,常悄悄地走到村边的她的家里去,
为了他,走到她的身边叫一声“妈”,
大堰河,把他画的大红大绿的关云长
贴在灶边的墙上,
大堰河,会对她的邻居夸口赞美她的乳儿;
大堰河曾做了一个不能对人说的梦:
在梦里,她吃着她的乳儿的婚酒,
坐在辉煌的结彩的堂上,
而她的娇美的媳妇亲切的叫她“婆婆”
…………
大堰河,深爱她的乳儿!
大堰河,在她的梦没有做醒的时候已死了。
她死时,乳儿不在她的旁侧,
她死时,平时打骂她的丈夫也为她流泪,
五个儿子,个个哭得很悲,
她死时,轻轻地呼着她的乳儿的名字,
大堰河,已死了,
她死时,乳儿不在她的旁侧。
大堰河,含泪的去了!
同着四十几年的人世生活的凌侮,
同着数不尽的奴隶的凄苦,
同着四块钱的棺材和几束稻草,
同着几尺长方的埋棺材的土地,
同着一手把的纸钱的灰,
大堰河,她含泪的去了。
这是大堰河所不知道的:
她的醉酒的丈夫已死去,
大儿做了土匪,
第二个死在炮火的烟里,
第三,第四,第五
而我,我是在写着给予这不公道的世界的咒语。
当我经了长长的飘泊回到故土时,
在山腰里,田野上,
兄弟们碰见时,是比六七年
她含着笑,切着冰屑悉索的萝卜,
她含着笑,用手掏着猪吃的麦糟,
她含着笑,扇着炖肉的炉子的火,
她含着笑,背了团箕到广场上去
晒好那些大豆和小麦,
大堰河,为了生活,
在她流尽了她的乳液之后,
她就用抱过我的两臂,劳动了。
大堰河,深爱着她的乳儿;
在年节里,为了他,忙着切那冬米的糖,
为了他,常悄悄地走到村边的她的家里去,
为了他,走到她的身边叫一声“妈”,
大堰河,把他画的大红大绿的关云长
贴在灶边的墙上,
大堰河,会对她的邻居夸口赞美她的乳儿;
大堰河曾做了一个不能对人说的梦:
在梦里,她吃着她的乳儿的婚酒,
坐在辉煌的结彩的堂上,
而她的娇美的媳妇亲切的叫她“婆婆”
…………
大堰河,深爱她的乳儿!
大堰河,在她的梦没有做醒的时候已死了。
她死时,乳儿不在她的旁侧,
她死时,平时打骂她的丈夫也为她流泪,
五个儿子,个个哭得很悲,
她死时,轻轻地呼着她的乳儿的名字,
大堰河,已死了,
她死时,乳儿不在她的旁侧。
大堰河,含泪的去了!
同着四十几年的人世生活的凌侮,
同着数不尽的奴隶的凄苦,
同着四块钱的棺材和几束稻草,
同着几尺长方的埋棺材的土地,
同着一手把的纸钱的灰,
大堰河,她含泪的去了。
这是大堰河所不知道的:
她的醉酒的丈夫已死去,
大儿做了土匪,
第二个死在炮火的烟里,
第三,第四,第五
而我,我是在写着给予这不公道的世界的咒语。
当我经了长长的飘泊回到故土时,
在山腰里,田野上,
兄弟们碰见时,是比六七年