![]() |
[求助]关于simulink建模的问题
我最近在做毕业论文,想把用遗传算法求最小值问题的代码建成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,:));%计算最优染色体的平均值并送给vari,变异自适应调节域值 l=i;%将最优染色体行坐标传送给l [pmax,z]=max(y);%求取适应度最差的染色体 select(z,:)=select(l,:);%将最优染色体引入种群参与竞争 %进行交叉,进一步选择优秀的解 for i=1:2:50, pcc=pro(pc);%根据交叉概率判断是否进行交叉 if pcc==1, if 0<=l-i<=1,%判断是不是最优染色体,如果是不进行交叉 cross(i,:)=select(i,:); cross(i+1,:)=select(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,:)=select(i,:); cross(i+1,:)=select(i+1,:); end end %变异操作 for i=1:50; pmm=pro(pm); if pmm==1, if i==l, change(i,:)=cross(i,:); else change(i,:)=cross(i,:); chb=round(rand*(bn-1))+1; %在[1,bn]范围内随机产生一个变异位 change(i,chb:chb)= vari*(rand-0.5);%变异为变化为一个[-600,600]的随机数 end else change(i,:)=cross(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 |
回复: [求助]关于simulink建模的问题
可用相应模块搭建 不过他的优势不在这里 看起来就比较费劲了
|
所有时间均为北京时间。现在的时间是 06:37。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.