blob.png


 

%% 遗传算法求解


clc
clear all
close all

%% 画一个圆
figure(1)
hold on;
lb=1;ub=2; %%范围
ezplot('sin(10*pi*X)/X',[lb,ub]); %画出曲线图
xlabel(' x/X');
ylabel(' y/Y');

%% 定义遗传算法参数
NIND =40; %种群大小
MAXGEN = 20; %最大遗传代数
PRECI = 20; %个体长度
GGAP = 0.95; %代沟
px = 0.7 %交叉率
pm = 0.01 %变异概率
trace = zeros(2,MAXGEN); %寻优结果初始值
FieldD = [PRECI;lb;ub;1;0;1;1]; %区域描述器
Chrom = crtbp(NIND,PRECI);%创建任务离散随机种群

%% 优化
gen =0; %代计数器
X = bs2rv(Chrom,FieldD); %初始种群二进制到十进制转换
ObjV = sin(10*pi*X) ./ X; %计算目标函数值

while gen< MAXGEN
    
    FitnV = ranking(ObjV); %分配适度值
    SelCh = select('sus',Chrom,FitnV,GGAP); %选择
    SelCh = recombin('xovsp',SelCh,px); %重组
    SelCh = mut(SelCh,pm); %变异
    X = bs2rv(SelCh,FieldD); %子代个体十进制转换
    ObjVSel = sin(10*pi*X)./X; %计算子代目标函数值
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重新插入子代到父代、产生新的种群
    X=bs2rv(Chrom,FieldD);
    gen =gen+1 ; %代数累加
    %获取每一代最优解及其序号、Y是最优解、I为个体序号
    [Y,I]=min(ObjV);
    trace(1,gen)=X(I); %记下每代最优值
    trace(2,gen)=Y; %记下每代最优值
    
end

plot(trace(1,:),trace(2,:),'bo'); %画出每代最优点
grid on;
plot(X,ObjV,'b*'); %画出最后一代种群
hold off;

%% 画进化图

figure(2);
plot(1:MAXGEN,trace(2,:));
grid on;
xlabel('遗传代数');
ylabel('解的变化');
title('进化过程');
bestY = trace(2,end);
bestX = trace(1,end);
fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n']);