遗传算法Matlab毕设,有同做的童鞋交流下,或者在这一方面比较擅长的童鞋指导下呗

ai_hinemon 2013-04-29 02:27:19
RT
http://bbs.csdn.net/topics/390435983 这是我的问题
...全文
67 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_hinemon 2013-04-29
  • 打赏
  • 举报
回复
如题
——————————————————————————————————————
遗传算法代码如下:
function[xv,fv]=GA_Griewank(Griewank,a,b,NP,NG,pc,pm,eps)
%待优化的目标函数:fitness
%自变量下界:a
%自变量上界:b
%种群个体数:NP
%最大进化代数:NG
%杂交概率:pc
%自变量概率:pm
%自变量离散精度:eps
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fv
L=ceil(log2((b-a)/eps+1)); %根据离散精度,确定二进制编码需要的码长
x=zeros(NP,L);
best=zeros(0,NG);
for i=1:NP
x(i,:)=Initial(L);%种群初始化
fx(i)=Griewank(Dec(a,b,x(i,:),L)); %个体适应值
end
for k=1:NG
sumfx=sum(fx); %所有个体适应值之和
px=fx/sumfx; %所有个体适应值的平均值
ppx=0;
ppx(1)=px(1);
val=zeros(0,NP);
for i=2:NP %用于轮盘赌策略的累加
ppx(i)=ppx(i-1)+px(i);
end
for i=1:NP
sita=rand();
val(i)=Griewank(Dec(a,b,x(i,:),L)); %求每个个体的适应值
for n=1:NP
if sita<=ppx(n)
SelFather=n; %根据轮盘赌策略确定的父亲
break;
end
end
Selmother=floor(rand()*(NP-1))+1; %随机选择母亲
posCut=floor(rand()*(L-2))+1; %随机选择交叉点
r1=rand();
if r1<=pc %交叉
nx(i,1:posCut)=x(SelFather,1:posCut);
nx(i,(posCut+1):L)=x(Selmother,(posCut+1):L);
r2=rand();
if r2<=pm %变异
posMut=round(rand()*(L-1)+1);
nx(i,posMut)=~nx(i,posMut);
end
else
nx(i,:)=x(SelFather,:);
end
end
x=nx;
for i=1:NP
fx(i)=Griewank(Dec(a,b,x(i,:),L));%子代适应值
end
best(k)=max(val); % 保存当代种群的最好适应值
end
fv=-inf;
for i=1:NP
fitx=Griewank(Dec(a,b,x(i,:),L));
if fitx>fv
fv=fitx; %取个体中的最好值作为最终结果
xv=Dec(a,b,x(i,:),L);
end
end
t=1:1:NG;
plot(t,best(t));
grid;
xlabel('种群进化代数');
ylabel('适应值');
title('基本遗传算法');
function result=Initial(length) %初始化函数
for i=1:length
r=rand();
result(i)=round(r);
end
function y=Dec(a,b,x,L) %二进制编码转换为十进制编码
base=2.^((L-1):-1:0);
y=dot(base,x);
y=a+y*(b-a)/(2^L-1);
%[xv,fv]=GA(@fitness,0,30,50,100,0.9,0.04,0.01)


__________________________________________________________________
评价函数代码如下:
function result=Ackley(x)
%Ackley 函数
%输入x,给出相应的y值,在x=(0,0,…,0) 处有全局极小点0,为得到最大值,返回值取相反数
[row,col]=size(x);
if row>1
error('输入的参数错误');
end
result=-20*exp(-0.2*sqrt((1/col)*(sum(x.^2))))-exp((1/col)*sum(cos(2*pi.*x)))+exp(1)+20;
%result=-result;
我画出来的图是这样的,种群不收敛,谁能解答一下

3,424

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧