Acerca de la implementación del algoritmo genético en MATLAB
[x fx string]=fun_SuiJiSuanFa2(6, 16, 0.7, 0.01, -3, 3 , 100)
f representa la función
N representa el tamaño del grupo de cromosomas
genLenth representa la longitud del cromosoma
Pc representa el cruce probabilidad
Pm representa la probabilidad de mutación
Enlace descendente
Enlace ascendente
Álgebra del ciclo de generación
Codificación decimal, escrita en binario aquí
num=2;
initdata=randi([0 num-1], N, genLenth);
Peso codificado en binario
peso =(num).^(genLenth/2-1:-1:0);
pesos=repmat(peso, N, 1);
Guardar el valores mejores y promedio para cada generación,
meanally=zeros(1,generación);
maxally=zeros(1,generación);
Nowx=zeros (generación,genLenth );
para k=1: generación
Decodificar entero
allx1=sum(initdata(:, 1.genLenth/2). *weights, 2 );
allx2=sum(initdata(:, genLenth/2 1: end).*weights, 2
Asignar al rango numérico
delt =(ascendente-descendente)/(num^(genLenth/2)-1);
allx1=allx1.*delt descendente;
allx2=allx2.* delt hacia abajo;
Aptitud cromosómica
ally=f(allx1, allx2);
Valor máximo promedio
medialmente(k) =mean (ally);
maxally(k)=max (ally);
Encuentra el índice para determinar qué cromosoma
index=find(ally= =maxally (k));
Nowx(k,:)=initdata(index(1),:);
El valor máximo no aumenta, toma el último
if (kgt;=2amp;amp;maxally(k)lt;maxally(k-1))
maxally(k)=maxally(k-1);
Nowx (k,:)=Nowx(k-1,:);
end
Tasa de aptitud cromosómica
ratio=ally./ sum(ally);
Cruce, mutación
Cuántas veces cruzar, comenzando desde la primera.
Aquí solo hay 1 crossover (de 6 en total), y uno se da al azar.
sumRatio=cumsum(ratio);
data=zeros(N, genLenth
para i=1:N/2
<); p> Seleccionar1=buscar(sumRatiogt;=rand);Seleccionar2 =buscar(sumRatiogt;=rand);
datos(2*i-1,:)=initdata(Select1 (1),:);
data(2*i,:)=initdata(Select2(1),:);
if(randlt.Pc)
cruz
ubicación=randi([1, genLenth]);
temp=data(2*i-1, ubicación: fin
datos(2*i-1, ubicación: fin)=datos(2*i, ubicación: fin
datos(2*i, ubicación: fin)=temp; p> else
variante
if(randlt;Pm)
ubicación=randi([1, genLenth]);
datos (2*i-1, ubicación)=1-data(2*i-1, ubicación);
end
if (randlt; Pm)
ubicación=randi([1, genLenth]);
datos(2*i, ubicación)=1-datos(2*i, ubicación
fin
fin
fin
initdata=datos;
fin
fx=max(maxally);
lastIndex=find(maxally==fx);
string=Nowx(lastIndex(1),:);
x(1)=sum(string(1: genLenth/2).*peso).*(arriba-descendente)/(num^(genLenth/2)-1) descendente;
x(2)=sum(string(1 genLenth/2: end).*weight).*(upbound-downbound)/(num^(genLenth/2)-1) downbound;
rendimiento de la trama
cifra, espera; p>
figura p>
clf; figura(1), espera;
plot((1. k)', es decir, 'b.-');
plot(( 1: k)', maxally, 'r.:');
fin
función fun=f(x, y)
diversión=(1 -x).^2.*exp(-x.^2-(1 y).^2)-(x-x.^3-y.^3).*exp(-x.^ 2-y.^2 );
diversión=-(x-1).^2-3.*(y-2).^2 100;
fin p>