我最近在做毕业论文,想把用遗传算法求最小值问题的代码建成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