最近疯了,光做这种作业!代码是COPY过来的,然后稍加修改就完工了!本想找找代码的出处的,发现网上各种转来转去,所以也没找到。
唯一的收获就是花了好几个小时把Matlab的画图函数看了看,看了N遍,终于画了个自己满意的图,就此,感觉Matlab还是非常强大的。
本事求一个方程的最大值,感觉需要用微分手算,可惜都忘了,不会算。但说回来,还是感觉这个结果又问题,求0-2PI的最大值,方程为targetfun这个中间的。
最后面附源代码:
文件:IfCroIfMut.m
文件:crossover.m
%子程序:新物种交叉操作
function scro=crossover(population,seln,pc)
BitLength=size(population,2);
pcc=IfCroIfMut(pc);%根据交叉概率决定是否进行交叉操作,1则是,0则否
if pcc==1
chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范围内随机产生一个交叉位
scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)];
scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)];
else
scro(1,:)=population(seln(1),:);
scro(2,:)=population(seln(2),:);
end
function scro=crossover(population,seln,pc)
BitLength=size(population,2);
pcc=IfCroIfMut(pc);%根据交叉概率决定是否进行交叉操作,1则是,0则否
if pcc==1
chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范围内随机产生一个交叉位
scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)];
scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)];
else
scro(1,:)=population(seln(1),:);
scro(2,:)=population(seln(2),:);
end
文件:fitnessfun.m
%子程序:计算适应度函数
function [Fitvalue,cumsump]=fitnessfun(population)
global BitLength
global boundsbegin
global boundsend
popsize=size(population,1);%有popsize个个体
for i=1:popsize
x=transform2to10(population(i,:));%将二进制转换为十进制
%转化为[0,2]区间的实数
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
Fitvalue(i)=targetfun(xx);%计算函数值,即适应度
end
%给适应度函数加上一个大小合理的数以便保证种群适应度值为正数
Fitvalue=Fitvalue'+10;
%计算选择概率
fsum=sum(Fitvalue);
Pperpopulation=Fitvalue/fsum;
%计算累计概率
cumsump(1)=Pperpopulation(1);
for i=2:popsize
cumsump(i)=cumsump(i-1)+Pperpopulation(i);
end
cumsump=cumsump';
function [Fitvalue,cumsump]=fitnessfun(population)
global BitLength
global boundsbegin
global boundsend
popsize=size(population,1);%有popsize个个体
for i=1:popsize
x=transform2to10(population(i,:));%将二进制转换为十进制
%转化为[0,2]区间的实数
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
Fitvalue(i)=targetfun(xx);%计算函数值,即适应度
end
%给适应度函数加上一个大小合理的数以便保证种群适应度值为正数
Fitvalue=Fitvalue'+10;
%计算选择概率
fsum=sum(Fitvalue);
Pperpopulation=Fitvalue/fsum;
%计算累计概率
cumsump(1)=Pperpopulation(1);
for i=2:popsize
cumsump(i)=cumsump(i-1)+Pperpopulation(i);
end
cumsump=cumsump';
文件:mutation.m
文件:selection.m
文件:targetfun.m
文件:transform2to10.m
文件:main.m
function main(popsize,Generationmax,pcrossover,pmutation)
clc;
close all;
global BitLength
global boundsbegin
global boundsend
bounds=[0 2];%一维自变量的取值范围
precision=0.000001;%运算精度
boundsbegin=bounds(:,1);
boundsend=bounds(:,2);
%计算如果满足求解精度至少需要多长的染色体
BitLength=ceil(log2((boundsend-boundsbegin)'./precision));
%popsize=50;%初始种群大小
%Generationmax=50;%最大代数
%pcrossover=0.90;%交配概率
%pmutation=0.09;%变异概率
%产生初始种群
population=round(rand(popsize,BitLength));
%计算适应度值,返回Fitvalue和累计概率cumsump
[Fitvalue,cumsump]=fitnessfun(population);
Generation=1;
while Generation<Generationmax+1
for j=1:2:popsize
%选择操作
seln=selection(population,cumsump);
%交叉操作
scro=crossover(population,seln,pcrossover);
scnew(j,:)=scro(1,:);
scnew(j+1,:)=scro(2,:);
%变异操作
smnew(j,:)=mutation(scnew(j,:),pmutation);
smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);
end%产生了新种群
population=smnew;
%计算新种群的适应度
[Fitvalue,cumsump]=fitnessfun(population);
%记录当前代最好的适应度和平均适应度
[fmax,nmax]=max(Fitvalue);
fmean=mean(Fitvalue);
ymax(Generation)=fmax;
ymean(Generation)=fmean;
%记录当前代的最佳染色体个体
x=transform2to10(population(nmax,:));
%自变量取值范围是[0 2],需要把经过遗传运算的最佳染色体整合到[0 2]区间
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
xmax(Generation)=xx;
yvalue(Generation)=targetfun(xx);
Generation=Generation+1;
end
Generation=Generation-1;
Bestpopuation=xx;
Besttargetfunvalue=targetfun(xx);
%绘制经过遗传运算后的适应度曲线。一般地,如果进化过程中种群的平均适应度与最大适
%应度在曲线上有相互趋同的形态,表示算法收敛进行得很顺利,没有出现震荡;在这种前
%提下,最大适应度个体连续若干代都没有发生进化表明种群已经成熟
figure(1);
x=1:Generation;
[AX,h1,h2] = plotyy(x,ymean,x,yvalue);
set(get(AX(1),'Ylabel'),'String','适应度');
set(get(AX(2),'Ylabel'),'String','最大值');
set(h1,'linestyle',':','marker','x','color','b');
hold on;
set(h2,'linestyle','-','marker','o','color','r');
hold on;
h3=plot(x,ymax,'-g*');
set(h3);
xlabel('进化代数');
legend([h1,h3,h2],'平均适应度','最大适应度','函数最大值');
title(['初始种群:',num2str(popsize),',最大值:',num2str(max(yvalue)),', 当前最优:',num2str(Besttargetfunvalue)]);
box off;hold off;
clc;
close all;
global BitLength
global boundsbegin
global boundsend
bounds=[0 2];%一维自变量的取值范围
precision=0.000001;%运算精度
boundsbegin=bounds(:,1);
boundsend=bounds(:,2);
%计算如果满足求解精度至少需要多长的染色体
BitLength=ceil(log2((boundsend-boundsbegin)'./precision));
%popsize=50;%初始种群大小
%Generationmax=50;%最大代数
%pcrossover=0.90;%交配概率
%pmutation=0.09;%变异概率
%产生初始种群
population=round(rand(popsize,BitLength));
%计算适应度值,返回Fitvalue和累计概率cumsump
[Fitvalue,cumsump]=fitnessfun(population);
Generation=1;
while Generation<Generationmax+1
for j=1:2:popsize
%选择操作
seln=selection(population,cumsump);
%交叉操作
scro=crossover(population,seln,pcrossover);
scnew(j,:)=scro(1,:);
scnew(j+1,:)=scro(2,:);
%变异操作
smnew(j,:)=mutation(scnew(j,:),pmutation);
smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);
end%产生了新种群
population=smnew;
%计算新种群的适应度
[Fitvalue,cumsump]=fitnessfun(population);
%记录当前代最好的适应度和平均适应度
[fmax,nmax]=max(Fitvalue);
fmean=mean(Fitvalue);
ymax(Generation)=fmax;
ymean(Generation)=fmean;
%记录当前代的最佳染色体个体
x=transform2to10(population(nmax,:));
%自变量取值范围是[0 2],需要把经过遗传运算的最佳染色体整合到[0 2]区间
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
xmax(Generation)=xx;
yvalue(Generation)=targetfun(xx);
Generation=Generation+1;
end
Generation=Generation-1;
Bestpopuation=xx;
Besttargetfunvalue=targetfun(xx);
%绘制经过遗传运算后的适应度曲线。一般地,如果进化过程中种群的平均适应度与最大适
%应度在曲线上有相互趋同的形态,表示算法收敛进行得很顺利,没有出现震荡;在这种前
%提下,最大适应度个体连续若干代都没有发生进化表明种群已经成熟
figure(1);
x=1:Generation;
[AX,h1,h2] = plotyy(x,ymean,x,yvalue);
set(get(AX(1),'Ylabel'),'String','适应度');
set(get(AX(2),'Ylabel'),'String','最大值');
set(h1,'linestyle',':','marker','x','color','b');
hold on;
set(h2,'linestyle','-','marker','o','color','r');
hold on;
h3=plot(x,ymax,'-g*');
set(h3);
xlabel('进化代数');
legend([h1,h3,h2],'平均适应度','最大适应度','函数最大值');
title(['初始种群:',num2str(popsize),',最大值:',num2str(max(yvalue)),', 当前最优:',num2str(Besttargetfunvalue)]);
box off;hold off;
运行不了,难道你没有提示Not enough input arguments的错误?
很抱歉,过去太久了,我已经看不懂这个东西了,但我能确定以前是可以,你多试试
可参考: http://tieba.baidu.com/p/4011328972
http://wenku.baidu.com/view/42b05f6d011ca300a6c39082.html
你的博客中的头像是怎么更改了,还显示出来。
一直用本地缓存Gravatar头像和QQ头像,然后挂个七牛CDN。
新人报道
什么时候冒出新人一说!
我来个这木
我们也学matlab 不过完全看不懂
上课都打酱油去了,不是么
恩 是的
感觉很难的样子
是的,真的很难。
我又回来啦,哈哈
欢迎!!
你这是在自己做作业,还是在考大家呢。
有点这个意思吧,毕竟想着这个公式应该可以用微分求出来的
好高深,看不懂。
一般这种算法一次看懂的都不正常
我能说最近课多,作业多,我们学校又有一个人跳楼了么?
就期望他还活着吧
我能说我看不懂吗
其实我也不懂,拿过来用用而已