Utilice MATLAB para comprender a fondo el principio del algoritmo genético + explicación del código + ejemplos específicos

Inicializar la población

Siga los ejemplos para aprender el algoritmo genético, como calcular \Piel valor óptimo de y=xsin(3 x), primero mire el código

​
clear;clc;close all;

%%遗传参数设置
NUMPOP=100;%初始种群大小
irange_l=-1; %问题解区间
irange_r=2;
LENGTH=22; %二进制编码长度
ITERATION = 10000;%迭代次数
CROSSOVERRATE = 0.7;%杂交率
SELECTRATE = 0.5;%选择率
VARIATIONRATE = 0.001;%变异率

​

Aquí necesitamos establecer los parámetros de los parámetros genéticos. El tamaño de la población inicial se puede cambiar, como 100, 1000, 2000, etc. El intervalo de solución del problema es el rango de valores de la variable independiente correspondiente a la función , y la longitud del código binario también se puede cambiar.El número de iteraciones, la tasa de hibridación, la tasa de selección y la tasa de mutación son valores dados.

%初始化种群
pop=m_InitPop(NUMPOP,irange_l,irange_r);
pop_save=pop;
%绘制初始种群分布
x=linspace(-1,2,1000);
y=m_Fx(x);
plot(x,y);
hold on
for i=1:size(pop,2)
    plot(pop(i),m_Fx(pop(i)),'ro');
end
hold off
title('初始种群');

El siguiente paso es inicializar la población. Para m_InitPop y m_Fx, echemos un vistazo a la forma de función específica:

function pop=m_InitPop(numpop,irange_l,irange_r)
%% 初始化种群
%  输入:numpop--种群大小;
%       [irange_l,irange_r]--初始种群所在的区间
pop=[];
for i=1:numpop
    pop(:,i)=irange_l+(irange_r-irange_l)*rand;
end
end
    

 pop(:,i)=irange_l+(irange_r-irange_l)*rand; Generamos una población inicial en el intervalo de la variable independiente, y esta población también puede establecer sus propios datos.

function y=m_Fx(x)
%% 要求解的函数
    y=x.*sin(3*pi.*x);
end

La imagen de la población inicial es:

empezar a iterar

Nuestro objetivo es encontrar \Piel valor óptimo de y=xsin(3 x) según el algoritmo genético.

%开始迭代
for time=1:ITERATION
    %计算初始种群的适应度
    fitness=m_Fitness(pop);
    %选择
    pop=m_Select(fitness,pop,SELECTRATE);
    %编码
    binpop=m_Coding(pop,LENGTH,irange_l);
    %交叉
    kidsPop = crossover(binpop,NUMPOP,CROSSOVERRATE);
    %变异
    kidsPop = Variation(kidsPop,VARIATIONRATE);
    %解码
    kidsPop=m_Incoding(kidsPop,irange_l);
    %更新种群
    pop=[pop kidsPop];
end

Luego comience a iterar, mire el diagrama de iteración

 adaptabilidad

Veamos cómo calcular la aptitud, la selección, el cruce y la mutación de la población, y explicarlos con subfunciones.

    %计算初始种群的适应度
    fitness=m_Fitness(pop);

Calculamos el fitness de la población según la función m_Fitness:

function fitness=m_Fitness(pop)
%% Fitness Function
%y=xsin(3x)在[-1,2]上,最大值也不会超过2
%所以计算函数值到2的距离,距离最小时,即为最优解
%适应度函数为1/距离
for n=1:size(pop,2)
    fitness(n)=1/(2-m_Fx(pop(:,n)));
end

end

 Ingrese el pop de población inicial y genere el fitness correspondiente a cada individuo, fitness(n)=1/(2-m_Fx(pop(:,n))); aquí puede agregar un valor pequeño como esp. Evita que el denominador parezca 0.

elegir

    %选择
    pop=m_Select(fitness,pop,SELECTRATE);

De acuerdo con la tasa de selección de SELECTRATE = 0.5, después de generar la solución de población inicial, en primer lugar, de acuerdo con la tasa de selección, por ejemplo, el 50% de los individuos se seleccionan para el proceso de cruce y mutación. Se debe prestar especial atención al hecho de que la tasa de selección (también llamada brecha generacional) no se puede establecer en 100%, aunque se registra el valor óptimo en cada ciclo, el valor óptimo se puede obtener más rápido, pero viola el principio del algoritmo.

function parentPop=m_Select(matrixFitness,pop,SELECTRATE)
%% 选择
% 输入:matrixFitness--适应度矩阵
%      pop--初始种群
%      SELECTRATE--选择率

sumFitness=sum(matrixFitness(:));%计算所有种群的适应度

accP=cumsum(matrixFitness/sumFitness);%累积概率
%轮盘赌选择算法
for n=1:round(SELECTRATE*size(pop,2))
    matrix=find(accP>rand); %找到比随机数大的累积概率
    if isempty(matrix)
        continue
    end
    parentPop(:,n)=pop(:,matrix(1));%将首个比随机数大的累积概率的位置的个体遗传下去
end
end

Sobre la base de la evaluación de la aptitud del individuo, el individuo optimizado se hereda directamente a la siguiente generación a través de la operación de selección, o se genera un nuevo individuo a través del cruce por parejas y luego se transmite a la siguiente generación. Sea el tamaño del grupo size(pop,2), y la probabilidad de que un individuo sea seleccionado sea accP.

codificación

    %编码
    binpop=m_Coding(pop,LENGTH,irange_l);

La función principal es convertir decimal a binario.

function binPop=m_Coding(pop,pop_length,irange_l)
%% 二进制编码(生成染色体)
% 输入:pop--种群
%      pop_length--编码长度
pop=round((pop-irange_l)*10^6);
for n=1:size(pop,2) %列循环
    for k=1:size(pop,1) %行循环
        dec2binpop{k,n}=dec2bin(pop(k,n));%dec2bin的输出为字符向量;
                                          %dec2binpop是cell数组
        lengthpop=length(dec2binpop{k,n});
        for s=1:pop_length-lengthpop %补零
            dec2binpop{k,n}=['0' dec2binpop{k,n}];
        end
    end
    binPop{n}=dec2binpop{k,n};   %取dec2binpop的第k行
end

    

cruz

Intercalar después de convertir a binario:

    %交叉
    kidsPop = crossover(binpop,NUMPOP,CROSSOVERRATE);
%% 子函数
%
%题  目:Crossover
%
%%
%输   入:
%           parentsPop       上一代种群
%           NUMPOP           种群大小
%           CROSSOVERRATE    交叉率
%输   出:
%           kidsPop          下一代种群
%
%% 
function kidsPop = Crossover(parentsPop,NUMPOP,CROSSOVERRATE)
kidsPop = {[]};n = 1;
while size(kidsPop,2)<NUMPOP-size(parentsPop,2)
    %选择出交叉的父代和母代
    father = parentsPop{1,ceil((size(parentsPop,2)-1)*rand)+1};
    mother = parentsPop{1,ceil((size(parentsPop,2)-1)*rand)+1};
    %随机产生交叉位置
    crossLocation = ceil((length(father)-1)*rand)+1;
    %如果随即数比交叉率低,就杂交
    if rand<CROSSOVERRATE
        father(1,crossLocation:end) = mother(1,crossLocation:end);
        kidsPop{n} = father;
        n = n+1;
    end
end

Mutaciones

No explicaré demasiado aquí, el código se puede usar directamente. Lo siguiente es la mutación

    %变异
    kidsPop = Variation(kidsPop,VARIATIONRATE);
%% 子函数
%
%题  目:Variation
%
%
%输   入:
%           pop              种群
%           VARIATIONRATE    变异率
%输   出:
%           pop              变异后的种群
%% 
function kidsPop = Variation(kidsPop,VARIATIONRATE)
for n=1:size(kidsPop,2)
    if rand<VARIATIONRATE
        temp = kidsPop{n};
        %找到变异位置
        location = ceil(length(temp)*rand);
        temp = [temp(1:location-1) num2str(~temp(location))...
            temp(location+1:end)];
       kidsPop{n} = temp;
    end
end

descodificación

La decodificación se realiza después de la mutación, es decir, el binario se convierte en decimal.

    %解码
    kidsPop=m_Incoding(kidsPop,irange_l);
function pop=m_Incoding(binPop,irange_l)
%% 解码
popNum=1;
popNum = 1;%染色体包含的参数数量
for n=1:size(binPop,2)
    Matrix = binPop{1,n};
    for num=1:popNum
        pop(num,n) = bin2dec(Matrix);
    end
end
pop = pop./10^6+irange_l;

actualizar la población

Luego actualice la población,

    %更新种群
    pop=[pop kidsPop];

Finalmente, dibuje la población de terminación después de la iteración del algoritmo genético:

figure
x=linspace(-1,2,1000);
y=m_Fx(x);
plot(x,y);
hold on
for i=1:size(pop,2)
    plot(pop(i),m_Fx(pop(i)),'ro');
end
hold off
title('终止种群');

acabar con la población

Puedes ver la solución óptima para la imagen:

 También podemos generar la solución óptima y la máxima aptitud:

disp(['最优解:' num2str(max(m_Fx(pop)))]);
disp(['最大适应度:' num2str(max(m_Fitness(pop)))]);   

producción:

最优解:1.491
最大适应度:1.9645

Esto es para la optimización de funciones unidimensionales, y la optimización de funciones bidimensionales se seguirá explicando en artículos futuros.

Supongo que te gusta

Origin blog.csdn.net/weixin_48266700/article/details/126190148
Recomendado
Clasificación