% 主函数
clc;
clear all;
M = 30;N =60; %N为染色体长度、M为种群(规模)个体数
generation = 100; %遗传代数
gen = 1; %从第一代开始遗传
maxdata = -10; %初始化一个最大
pm = 0.08; %变异概率
pc = 0.60; %交叉概率
%sum1_fit_eve(0)=0.00; %总适应度
pop = round(rand(M,N)); %随机初始化矩阵,产生初始种群(取整)
x = decode_x(pop(:,1:30)); %选取前半染色体
y = decode_y(pop(:,31:end));%选取后半染色体
%对x1 x2进行解码
fitness = y.*3.226+((6.452*(x.*1+y.*0.125).*(cos(x.*1)-cos(y.*2)).^2)./((0.8+(x.*1-4.2).^2).^0.5+2.*(y.*1-7).^2)); %自己定义的适应度函数
while gen < generation
[B] = seclection(fitness,pop); %轮盘赌选择
[newpop] = crossover(pc,B); %单点交叉
[B] = mutation(pm,newpop); %单点变异操作
pop = B;
x = decode_x(pop(:,1:30));
y = decode_y(pop(:,31:end));
fitness = y.*3.226+((6.452*(x+y.*0.125).*(cos(x)-cos(y.*2)).^2)./((0.8+(x-4.2).^2).^0.5+2.*(y-7).^2)); %计算适应度
[fit_best,index] = max(fitness);%本代中的最优目标值
sum(gen)=fit_best+sum(gen-1);
sum1_fit_eve(gen)=sum(gen)/gen; %求平均适应度
if fit_best >= maxdata
maxdata = fit_best;
verter = pop(index,:);
x_1 = decode_x(verter(1:30));%找到最优解的这个染色体
y_1 = decode_y(verter(31:end));
end
num(gen) = maxdata;
numx(gen) = x_1;
numy(gen) = y_1;
gen = gen + 1;
end
disp(sprintf('max=:%.15f',num(gen-1))); %输出最优解
disp(sprintf('x=:%.15f y=:%.15f',x_1,y_1));%最优解对应的x1 x2的值
figure(1)
plot(num,'k');%绘制最佳适应度图形
xlabel('迭代次数');
ylabel('最佳适应度');
hold on;
figure(2)
%hold on;
plot(numx,'r--');%绘制x最佳解图形
hold on;
plot(numy,'b');%绘制y最佳解图形
legend('x值','y值')
figure(3)
plot(sum1_fit_eve,'b*');%绘制平均适应度图形