Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2009-03-23
年龄: 39
帖子: 6
声望力: 0 ![]() |
![]()
我最近在做毕业论文,想把用遗传算法求最小值问题的代码建成simulink模型,我弄了很久都做不好,请各位大侠帮帮忙啊!!!!!代码如下:
function ga; %遗传算法极小值问题 clear clc bn=30; %个体串长度 inn=50; %初始种群大小 gnmax=300; %最大迭代次数 pc=0.85; %交叉概率 pm=0.2; %变异概率 %产生初始种群 fps=1200*(rand(inn,bn)-0.5*ones(inn,bn)); %十进制编码,使初始解在[-600,600]范围内 select=fps; gn=0;%第一代解 n = 30; fr = 4000; while gn<gnmax, %分别将种群代入目标函数计算适应度 q = 0; p = 1; for i = 1:50, for j = 1:30, x(j)=select(i,j:j); q = q+x(j)^2; p = p*cos(x(j)/sqrt(j)); end y(i) = q/fr-p+1; q=0; p=1; end [pmin,i]=min(y);%将当前种群中最优解保存在pmin pmin1=pmin; vari=mean(select(i, ![]() l=i;%将最优染色体行坐标传送给l [pmax,z]=max(y);%求取适应度最差的染色体 select(z, ![]() ![]() %进行交叉,进一步选择优秀的解 for i=1:2:50, pcc=pro(pc);%根据交叉概率判断是否进行交叉 if pcc==1, if 0<=l-i<=1,%判断是不是最优染色体,如果是不进行交叉 cross(i, ![]() ![]() cross(i+1, ![]() ![]() else %将30个变量分为五个范围,相临两个染色体分别从五位进行交叉 crb1=round(rand*(bn/5-1))+1; %在[1,6]范围内随机产生一个交叉位 cross(i,crb1:crb1)=0.1*select(i,crb1:crb1)+0.9*select(i+1,crb1:crb1); cross(i+1,crb1:crb1)=0.1*select(i,crb1:crb1)+0.9*select(i+1,crb1:crb1); cross(i,2*crb1:2*crb1)=0.1*select(i,2*crb1:2*crb1)+0.9*select(i+1,2*crb1:2*crb1); cross(i+1,2*crb1:2*crb1)=0.1*select(i,2*crb1:2*crb1)+0.9*select(i+1,2*crb1:2*crb1); cross(i,3*crb1:3*crb1)=0.1*select(i,3*crb1:3*crb1)+0.9*select(i+1,3*crb1:3*crb1); cross(i+1,3*crb1:3*crb1)=0.1*select(i,3*crb1:3*crb1)+0.9*select(i+1,3*crb1:3*crb1); cross(i,4*crb1:4*crb1)=0.1*select(i,4*crb1:4*crb1)+0.9*select(i+1,4*crb1:4*crb1); cross(i+1,4*crb1:4*crb1)=0.1*select(i,4*crb1:4*crb1)+0.9*select(i+1,4*crb1:4*crb1); cross(i,5*crb1:5*crb1)=0.1*select(i,5*crb1:5*crb1)+0.9*select(i+1,5*crb1:5*crb1); cross(i+1,5*crb1:5*crb1)=0.1*select(i,5*crb1:5*crb1)+0.9*select(i+1,5*crb1:5*crb1); end else cross(i, ![]() ![]() cross(i+1, ![]() ![]() end end %变异操作 for i=1:50; pmm=pro(pm); if pmm==1, if i==l, change(i, ![]() ![]() else change(i, ![]() ![]() chb=round(rand*(bn-1))+1; %在[1,bn]范围内随机产生一个变异位 change(i,chb:chb)= vari*(rand-0.5);%变异为变化为一个[-600,600]的随机数 end else change(i, ![]() ![]() end end select=change; gn=gn+1; plot(gn,pmin,'ro') hold on end gn pmin%最优解 strt=['最大迭代次数' num2str(gn)]; text(80,250,strt); strt=['最小值' num2str(pmin)]; text(80,200,strt); %根据交叉概率判断是否交叉函数 function pcc=pro(pc); test(1:100)=0; b=round(100*pc); test(1:b)=1; n=round(rand*99)+1; pcc=test(n); end end |
![]() |
![]() |
|
|
![]() |
||||
主题 | 主题作者 | 版面 | 回复 | 最后发表 |
matlab7.1用ga函数求解约束最优化问题时出错 | 上善若水zm | 进化计算 | 0 | 2009-05-13 13:22 |
[MATLAB基础] 大家帮忙看一下这个程序吧,求信号PSD的, | daizy2009 | MATLAB论坛 | 0 | 2009-05-12 20:08 |
[求助]matlab小波变换问题 | derrick | MATLAB论坛 | 5 | 2008-12-18 17:17 |
[求助]关于t的函数 | 红日 | MATLAB论坛 | 1 | 2008-07-24 09:56 |
[求助]有段采集的数据,怎么在matlab下看一下其频谱特性 | sjszhb | MATLAB论坛 | 3 | 2008-07-03 20:28 |