% f(x)=11*sin(6x)+7*cos(5x),0<=x<=2*pi;
%%初始化参数
L=16;%编码为16位二进制数
N=32;%初始种群规模
M=48;%M个中间体,运用算子选择出M/2对母体,进行交叉;对M个中间体进行变异
T=100;%进化代数
Pc=0.8;%交叉概率
Pm=0.03;%%变异概率
%%将十进制编码成16位的二进制,再将16位的二进制转成格雷码
for i=1:1:N
x1(1,i)= rand()*2*pi;
x2(1,i)= uint16(x1(1,i)/(2*pi)*65535);
grayCode(i,:)=num2gray(x2(1,i),L);
end
%% 开始遗传算子操作
for t=1:1:T
y1=11*sin(6*x1)+7*cos(5*x1);
for i=1:1:M/2
[a,b]=min(y1);%找到y1中的最小值a,及其对应的编号b
grayCodeNew(i,:)=grayCode(b,:);%将找到的最小数放到grayCodeNew中grayCodeNew(i+M/2,:)=grayCode(b,:);%与上面相同就可以有M/2对格雷码可以作为母体y1(1,b)=inf;%用来排除已找到的最小值
end
for i=1:1:M/2
p=unidrnd(L);%生成一个大于零小于L的数,用于下面进行交叉的位置if rand()<Pc % Pc是交叉概率
%将选定的染色体的点后的基因进行交换
for j=p:1:L
temp= grayCodeNew(i,j);
grayCodeNew(i,j)=grayCodeNew(M-i+1,j);
grayCodeNew(M-i+1,j)=temp;
end
end
end
%%将全部染色体按概率进行变异
for i=1:1:M
for j=1:1:L
if rand()<Pm %Pm为染色体变异的概率
grayCodeNew(i,j)=dec2bin(1-bin2dec(grayCodeNew(i,j)));
end
end
end
%%第一代结束后生成的较优的染色体,得以保存然后进行下一代操作
for i=1:1:M
x4(1,i)=gray2num(grayCodeNew(i,:));
end
x3=double(x4)*2*pi/65535;
y3=11*sin(6*x3)+7*cos(5*x3);
for i=1:1:N
[a,b]=min(y3);
x1(1,i)=x3(1,b);
grayCode(i,:)=grayCodeNew(b,:);
y3(1,b)=inf;
end
end
x1
y1=11*sin(6*x1)+7*cos(5*x1)。