n=300;
p=3;
e=10;
bb=[3 3 5];
aa=[-3 -3 -3];
cishu=0;
for z=1:100
cishu=cishu+1
%函数
for i=1:30
x(i)=i;
y(i)=1+2*x(i)+3*x(i)^2;
end
%生成随机变量
u=rand(n,p);
%求出各变量的取值区间:
for i=1:p
d(i)=(bb(i)-aa(i))/(2^e-1);
end
%求出各随机数所对应的函数值
for i=1:n
for j=1:p
r(i,j)=fix(u(i,j)*2^e);
c(i,j)=aa(j)+r(i,j)*d(j);
end
end
for i=1:n
f(i)=0;
for k=1:30
f(i)=f(i)+abs(c(i,1)+c(i,2)*x(k)+c(i,3)*x(k)^2-y(k));
end
end
ww=0;
for w=1:2
ww=ww+1;
%排序
for i=1:n-1
for j=i+1:n
if f(i)>f(j)
t=f(j);
f(j)=f(i);
f(i)=t;
for k=1:3
t=r(j,k);
r(j,k)=r(i,k);
r(i,k)=t;
end
end
end
end
%适应问题
fff=0;
for i=1:n
ff(i)=1/(f(i)^2+0.001);
fff=fff+ff(i);
end
%pp(i)--每个样本的选择概率;p1(i)--累加的概率
for i=1:n
pp(i)=ff(i)/fff;
end
p1(1)=pp(1);
for i=2:n
p1(i)=p1(i-1)+pp(i);
end
%以概率pp(i)选择第个个体,组成含有n个个体的组
for i=1:n
xx=rand;
if xx>0&xx<=p1(1)
for j=1:p
xuan1(i,j)=r(1,j);
end
elseif xx>p1(1)
for k=2:n
if xx>p1(k-1)&xx<=p1(k)
for l=1:p
xuan1(i,l)=r(k,l);
end
end
end
end
end
%生成另一个组
for i=1:n
xx=rand;
if xx>0&xx<=p1(1)
for j=1:p
xuan2(i,j)=r(1,j);
end
elseif xx>p1(1)
for k=2:n
if xx>p1(k-1)&xx<=p1(k)
for l=1:p
xuan2(i,l)=r(k,l);
end
end
end
end
end
%杂交
pm=1;
for i=1:n
for j=1:p
a=dec2bin(xuan1(i,j));
b=dec2bin(xuan2(i,j));
%若a,b的长度小于e,则在其前面加上0
if length(a)<e
e1=e-length(a);
for k=1:e1
a=strcat('0',a);
end
end
if length(b)<e
e1=e-length(b);
for k=1:e1
b=strcat('0',b);
end
end
u1=rand;
u2=rand;
iu1=fix(u1*e);
iu2=fix(u2*e);
%对iu1,iu2进行排序
if iu1>iu2
t=iu2;
iu2=iu1;
iu1=t;
end
%iu1,iu2不能为零,为零时取1
if iu2==0
iu1=1;
iu2=1;
end
if iu1==0
iu1=1;
end
for k=iu1:iu2
t=a(k);
a(k)=b(k);
b(k)=t;
end
%变异
iuu1=rand;
iuu4=rand;
if iuu1<=0.5&iuu4<=pm
cc=a;
iuu2=fix(rand*e);
iuu3=fix(rand*e);
if iuu2==0
iuu2=1;
end
if iuu3==0
iuu3=1;
end
elseif iuu1>0.5&iuu4<=pm
cc=b;
iuu2=fix(rand*e);
iuu3=fix(rand*e);
if iuu2==0
iuu2=1;
end
if iuu3==0
iuu3=1;
end
end
if cc(iuu2)=='0'
cc(iuu2)='1';
else
cc(iuu2)='0';
end
if cc(iuu3)=='0'
cc(iuu3)='1';
else
cc(iuu3)='0';
end
r(i,j)=0;
for l=1:e
r(i,j)=r(i,j)+2^(e-l)*str2num(cc(l));
end
end
end
for i=1:n
for j=1:p
c(i,j)=aa(j)+r(i,j)*d(j);
end
end
for i=1:n
f(i)=0;
for k=1:30
f(i)=f(i)+abs(c(i,1)+c(i,2)*x(k)+c(i,3)*x(k)^2-y(k));
end
end
%排序
for i=1:n-1
for j=i+1:n
if f(i)>f(j)
t=f(j);
f(j)=f(i);
f(i)=t;
for k=1:3
t=c(j,k);
c(j,k)=c(i,k);
c(i,k)=t;
end
end
end
end
if ww==1
for j=1:3
aaa(j)=c(1,j);
bbb(j)=c(1,j);
for i=2:10
if aaa(j)>c(i,j)
aaa(j)=c(i,j);
end
if bbb(j)<c(i,j)
bbb(j)=c(i,j);
end
end
end
end
if ww==2
for j=1:3
for i=1:10
if aaa(j)>c(i,j)
aaa(j)=c(i,j);
end
if bbb(j)<c(i,j)
bbb(j)=c(i,j);
end
end
end
end
end
for j=1:3
aa(j)=aaa(j);
bb(j)=bbb(j);
end
if f(1)<=0.1
break;
end
end
f(1)
c(1,1)
c(1,2)
c(1,3)
评论1