Comparar valores de una corrida anterior con una corrida actual
Publicado por Marco Antonio (61 intervenciones) el 24/10/2017 02:08:41
Buenas tengo el siguiente problema el programa que e escrito calcula fx1 de 10 individuos y luego hago un sort y busco el maximo valor y lo guardo en FX1 .
fx1 seria de la siguiente forma
fx1 =
38.110585482186082
25.157891551707259
37.206807146213876
37.946548883917956
37.911437874607174
32.370925746848002
34.350947232188929
33.105836279331939
35.104955268577996
29.736825792286183
este programa es parte de un bucle for donde en cada iteracion los diez individuos se cruzan y mutan dando una nueva población y a esa nueva población tengo que calcularle de nuevo un nuevo fx1 similar al que puse anterior pero con valores diferentes ahora tengo un nuevo valor maximo, los valores maximos los e logrado guardar en FX1(k) donde k es la variable del bucle for que hace que se repita todo.
El problema que se presenta ahora es que necesito comparar el valor de la corrida anterior con la corrida actual y guardarlo en una variable FX1Elite la cual me va a dar el valor mas alto en el total de corridas.
Ahora e logrado identificar el individuo correspondiente a esa fx1 con este programa
fX1=sort(fx1,'descend');
[maximo]=max(fX1)
[minimo]=min(fX1)
[fila1, columna1]=find(fx1==maximo)
[fila2, columna2]=find(fx1==minimo)
valor_correspondiente1(k)=P12(fila1,columna1)
valor_correspondiente2(k)=P13(fila2,columna2)
yo trate con if [maximo](k)<[maximo](k-1)
pero me dice que ai error.
ahora que se el valor del individuo con la fx1 mas alta ahora tengo que en cada corrida que el sea el mayor que el fx1 obtenido en ese valor tengo que cambiarlo por el individuo con el fx1 menor.
Por ejemplo hago 2 corridas y tengo una poblacion inicial donde el valor de fx1 es 5 y el individuo es 7.865 despues del cruce y mutacion tengo una nueva poblacion y ahora cuando calculo el fx1 me da que la fx1 es de 4 entonces tomo el valor del minimo de fx1 sabiendo el individuo y lo cambio por el individuo de la corrida anterior y si ai un mayor que 5 digamos 6 no pasa nada.
aqui pongo el programa
clear all
close all
clear var
clc
format long
% Rango de x1 [-8 8] length 16
% rango de x2 [-8 8] length 16
% Debe ser dividido en 16*100000
% El total de de length del cromosoma es 32
N=input('Tamaño de la poblacion: ')%pregunta al usuario por el tamaño de la poblacio
m=input('Seleccione 1 para minimizar o 2 para maximizar: ')
numerodeiteracione=input('Numero de Iteraciones: ')
% numerodeiteraciones=input('Numero de iteraciones: ')
aj1=-8% Añade el valor 0 a aj, limite inferior del rango de la poblacion
bj1=8% Asigna el valor 10 a bj, limite superior del rango de la poblacion
n1=5% Asigna el valor 1 a n, numero de digitos despues del punto decimal
a1=(log((bj1-aj1)*(10^n1)+1))/log(2)% Calcula el Numero de bits requeridos
Number_of_bits1 = ceil(a1)% Redondea mj al prximo numero superior
aj2=-8% Añade el valor 0 a aj, limite inferior del rango de la poblacion
bj2=8% Asigna el valor 10 a bj, limite superior del rango de la poblacion
n2=5% Asigna el valor 1 a n, numero de digitos despues del punto decimal
a2=(log((bj1-aj1)*(10^n2)+1))/log(2)% Calcula el Numero de bits requeridos
Number_of_bits2 = ceil(a2)% Redondea mj al prximo numero superior
Max_Number_of_Bits=Number_of_bits1+Number_of_bits2% Suma numero de bit 1 y 2 para tener el total de bits
P1=randi([0 (2^Max_Number_of_Bits-1)],N,1)%Asigna valore decimales de forma aleatoria a P1
x14=P1
o5=dec2bin(x14)
Poblaciones=[]
%calcular decimales separado
Mas1=(2^Number_of_bits1)-1%Crea una Mascara
Mas2=2^Max_Number_of_Bits-(2^(Number_of_bits1)-1)-1%Crea una Mascara
for k=1:numerodeiteracione
for p=1:length(P1)
P1
%Crea un lazo que hace el bitand y bitshift y lo guarda en P11
for n = 1:size(P1)
x3(n,1)=bitand(Mas2,P1(n))
P11(n)=bitshift(x3(n,1),-Number_of_bits2); %X
end
P12=(P11*(bj1-aj1)/(2^Number_of_bits1-1)+aj1)'% X escalada. Escala los valores decimales a el rango
%Crea un lazo que hace el bitand y bitshift y lo guarda en P11
for n = 1:size(P1)
x4(n,1)=bitand(Mas1,P1(n)) %Y
end
P13=x4*(bj2-aj2)/(2^Number_of_bits2-1)+aj2 % Y escalada. Escala los valores decimales a el rango
%Calculando fitness
% for n=1:size(P1) % Calcula el valor de x1 para calcular fitness
% x5(n,1)=aj1+(P12(n,1)*((bj1-aj1)/(2^Number_of_bits1-1)))
% end
% for n=1:size(P1) % Calcula el valor de x3 para calcular fitness
% x5(n,2)=aj2+(P13(n,1)*((bj2-aj2)/(2^Number_of_bits2-1)))
% end
for n1=1:size(P1)
if m==1
fx1(n1,1)=1/(1+(21.5 + P12(n1) * sin(4*pi*P12(n1)) + P13(n1) * sin(20*pi*P13(n1))))
else m==2
fx1(n1,1)=((21.5 + P12(n1) * sin(4*pi*P12(n1)) + P13(n1) * sin(20*pi*P13(n1))))+10
end
end
fX1=sort(fx1,'descend');
[maximo]=max(fX1)
[minimo]=min(fX1)
[fila1, columna1]=find(fx1==maximo)
[fila2, columna2]=find(fx1==minimo)
valor_correspondiente1(k)=P12(fila1,columna1)
valor_correspondiente2(k)=P13(fila2,columna2)
% if maximo(k+1)>maximo(k)
%
% maximo(k)
% end
%
% Calculando el Fitness Promedio
fxt=sum(fx1)
% Calculando el Ti
for n=1:size(P1)
x6(n,1) = fx1(n,1)/fxt
end
x7 = sum(x6)
% Calculando qi
x9(1,1) = x6(1,1)
for i=2:length(x6);
x9(i,1) = x9(i-1,1)+x6(i,1)
end
x9
x10=rand(size(P1))
% Ruleta
PDEC=P1;
x11(1)=0;
for i=1:size(x10,1)
for j=1:size(x10,1)
if x10(i,1)<=x9(j,1)
x11(i,1)=PDEC(j,1);
break
end
end
end
x11
o1=dec2bin(x11)
o2=find(o1)
%Cruce
j=1
while j<length(P1)
macho=x11(j)
hembra=x11(j+1)
r=rand(1)
if r<=0.8
ptocruce=randi([1,41],1)
% ptocruce=1
mane1=2^ptocruce-1
mane2=(2^Max_Number_of_Bits)-mane1
a=bitand(round(hembra),round(mane2))
b=bitand(round(macho),round(mane2))
c=bitand(round(hembra),round(mane1))
d=bitand(round(macho),round(mane1))
w1=bitor(d,a)
w2=bitor(c,b)
else
w1=x11(j)
w2=x11(j+1)
end
x12(j)=w1
x12(j+1)=w2
j=j+2
end
x13=x12'
o6=dec2bin(x13)
[a,b] = size(o5)
[c,d] = size(o6)
s=b-d
A0=[str2num(o6(:))]'
find(A0)
A2=reshape(A0,length(x13),d)
A1_zeros = [zeros(size(A2,1),s) A2];
A2_zeros = cat(2, zeros(size(A2,1),s), A2)
A5=num2str(A2_zeros,-6)
A6=bin2dec(A5)
x13=A6
%Mutacion
u=dec2bin(x13)%cambia los numeros decimales de x13 a binarios
%combierte u en una cell array
for i=1:size(x13,1)
A{i}=u(i,:);
end
%Guarda los valores de A en P3 los une en una sola matris de 1xn
P3=[];
for i=1:length(A)
P3=[P3,A{i}];
end
P3
Prueba=P3
%Compara los bits de P3 con un numero aleatorio r < 0.05 y si es menor lo
%cambia de 0 a 1 o de 1 a 0
for i=1:length(P3)
b=str2double(P3(i));
r=rand;
if r<0.05;
P3mutada(i)=num2str(~b);
P3(i)=num2str(~b);
end
end
[e,f] = size(x14)
f1=length(P3)/e
A6=reshape(P3,f1,length(x13))
A7=A6'
A8=bin2dec(A7)
x13=A8'
o6=dec2bin(x13)
% o6=dec2bin(x14)
[a,b] = size(o5)
[c,d] = size(o6)
s=b-d
A00=[str2num(o6(:))]'
find(A00)
A22=reshape(A00,length(x13),d)
A11_zeros = [zeros(size(A22,1),s) A22];
A22_zeros = cat(2, zeros(size(A22,1),s), A22)
A55=num2str(A22_zeros,-6)
A66=bin2dec(A55)
x13=A66
P1=x13
Poblaciones(p,k)=P1(p)
Fitnessglobal(p,k)=fx1(p)
end
end
fx1 seria de la siguiente forma
fx1 =
38.110585482186082
25.157891551707259
37.206807146213876
37.946548883917956
37.911437874607174
32.370925746848002
34.350947232188929
33.105836279331939
35.104955268577996
29.736825792286183
este programa es parte de un bucle for donde en cada iteracion los diez individuos se cruzan y mutan dando una nueva población y a esa nueva población tengo que calcularle de nuevo un nuevo fx1 similar al que puse anterior pero con valores diferentes ahora tengo un nuevo valor maximo, los valores maximos los e logrado guardar en FX1(k) donde k es la variable del bucle for que hace que se repita todo.
El problema que se presenta ahora es que necesito comparar el valor de la corrida anterior con la corrida actual y guardarlo en una variable FX1Elite la cual me va a dar el valor mas alto en el total de corridas.
Ahora e logrado identificar el individuo correspondiente a esa fx1 con este programa
fX1=sort(fx1,'descend');
[maximo]=max(fX1)
[minimo]=min(fX1)
[fila1, columna1]=find(fx1==maximo)
[fila2, columna2]=find(fx1==minimo)
valor_correspondiente1(k)=P12(fila1,columna1)
valor_correspondiente2(k)=P13(fila2,columna2)
yo trate con if [maximo](k)<[maximo](k-1)
pero me dice que ai error.
ahora que se el valor del individuo con la fx1 mas alta ahora tengo que en cada corrida que el sea el mayor que el fx1 obtenido en ese valor tengo que cambiarlo por el individuo con el fx1 menor.
Por ejemplo hago 2 corridas y tengo una poblacion inicial donde el valor de fx1 es 5 y el individuo es 7.865 despues del cruce y mutacion tengo una nueva poblacion y ahora cuando calculo el fx1 me da que la fx1 es de 4 entonces tomo el valor del minimo de fx1 sabiendo el individuo y lo cambio por el individuo de la corrida anterior y si ai un mayor que 5 digamos 6 no pasa nada.
aqui pongo el programa
clear all
close all
clear var
clc
format long
% Rango de x1 [-8 8] length 16
% rango de x2 [-8 8] length 16
% Debe ser dividido en 16*100000
% El total de de length del cromosoma es 32
N=input('Tamaño de la poblacion: ')%pregunta al usuario por el tamaño de la poblacio
m=input('Seleccione 1 para minimizar o 2 para maximizar: ')
numerodeiteracione=input('Numero de Iteraciones: ')
% numerodeiteraciones=input('Numero de iteraciones: ')
aj1=-8% Añade el valor 0 a aj, limite inferior del rango de la poblacion
bj1=8% Asigna el valor 10 a bj, limite superior del rango de la poblacion
n1=5% Asigna el valor 1 a n, numero de digitos despues del punto decimal
a1=(log((bj1-aj1)*(10^n1)+1))/log(2)% Calcula el Numero de bits requeridos
Number_of_bits1 = ceil(a1)% Redondea mj al prximo numero superior
aj2=-8% Añade el valor 0 a aj, limite inferior del rango de la poblacion
bj2=8% Asigna el valor 10 a bj, limite superior del rango de la poblacion
n2=5% Asigna el valor 1 a n, numero de digitos despues del punto decimal
a2=(log((bj1-aj1)*(10^n2)+1))/log(2)% Calcula el Numero de bits requeridos
Number_of_bits2 = ceil(a2)% Redondea mj al prximo numero superior
Max_Number_of_Bits=Number_of_bits1+Number_of_bits2% Suma numero de bit 1 y 2 para tener el total de bits
P1=randi([0 (2^Max_Number_of_Bits-1)],N,1)%Asigna valore decimales de forma aleatoria a P1
x14=P1
o5=dec2bin(x14)
Poblaciones=[]
%calcular decimales separado
Mas1=(2^Number_of_bits1)-1%Crea una Mascara
Mas2=2^Max_Number_of_Bits-(2^(Number_of_bits1)-1)-1%Crea una Mascara
for k=1:numerodeiteracione
for p=1:length(P1)
P1
%Crea un lazo que hace el bitand y bitshift y lo guarda en P11
for n = 1:size(P1)
x3(n,1)=bitand(Mas2,P1(n))
P11(n)=bitshift(x3(n,1),-Number_of_bits2); %X
end
P12=(P11*(bj1-aj1)/(2^Number_of_bits1-1)+aj1)'% X escalada. Escala los valores decimales a el rango
%Crea un lazo que hace el bitand y bitshift y lo guarda en P11
for n = 1:size(P1)
x4(n,1)=bitand(Mas1,P1(n)) %Y
end
P13=x4*(bj2-aj2)/(2^Number_of_bits2-1)+aj2 % Y escalada. Escala los valores decimales a el rango
%Calculando fitness
% for n=1:size(P1) % Calcula el valor de x1 para calcular fitness
% x5(n,1)=aj1+(P12(n,1)*((bj1-aj1)/(2^Number_of_bits1-1)))
% end
% for n=1:size(P1) % Calcula el valor de x3 para calcular fitness
% x5(n,2)=aj2+(P13(n,1)*((bj2-aj2)/(2^Number_of_bits2-1)))
% end
for n1=1:size(P1)
if m==1
fx1(n1,1)=1/(1+(21.5 + P12(n1) * sin(4*pi*P12(n1)) + P13(n1) * sin(20*pi*P13(n1))))
else m==2
fx1(n1,1)=((21.5 + P12(n1) * sin(4*pi*P12(n1)) + P13(n1) * sin(20*pi*P13(n1))))+10
end
end
fX1=sort(fx1,'descend');
[maximo]=max(fX1)
[minimo]=min(fX1)
[fila1, columna1]=find(fx1==maximo)
[fila2, columna2]=find(fx1==minimo)
valor_correspondiente1(k)=P12(fila1,columna1)
valor_correspondiente2(k)=P13(fila2,columna2)
% if maximo(k+1)>maximo(k)
%
% maximo(k)
% end
%
% Calculando el Fitness Promedio
fxt=sum(fx1)
% Calculando el Ti
for n=1:size(P1)
x6(n,1) = fx1(n,1)/fxt
end
x7 = sum(x6)
% Calculando qi
x9(1,1) = x6(1,1)
for i=2:length(x6);
x9(i,1) = x9(i-1,1)+x6(i,1)
end
x9
x10=rand(size(P1))
% Ruleta
PDEC=P1;
x11(1)=0;
for i=1:size(x10,1)
for j=1:size(x10,1)
if x10(i,1)<=x9(j,1)
x11(i,1)=PDEC(j,1);
break
end
end
end
x11
o1=dec2bin(x11)
o2=find(o1)
%Cruce
j=1
while j<length(P1)
macho=x11(j)
hembra=x11(j+1)
r=rand(1)
if r<=0.8
ptocruce=randi([1,41],1)
% ptocruce=1
mane1=2^ptocruce-1
mane2=(2^Max_Number_of_Bits)-mane1
a=bitand(round(hembra),round(mane2))
b=bitand(round(macho),round(mane2))
c=bitand(round(hembra),round(mane1))
d=bitand(round(macho),round(mane1))
w1=bitor(d,a)
w2=bitor(c,b)
else
w1=x11(j)
w2=x11(j+1)
end
x12(j)=w1
x12(j+1)=w2
j=j+2
end
x13=x12'
o6=dec2bin(x13)
[a,b] = size(o5)
[c,d] = size(o6)
s=b-d
A0=[str2num(o6(:))]'
find(A0)
A2=reshape(A0,length(x13),d)
A1_zeros = [zeros(size(A2,1),s) A2];
A2_zeros = cat(2, zeros(size(A2,1),s), A2)
A5=num2str(A2_zeros,-6)
A6=bin2dec(A5)
x13=A6
%Mutacion
u=dec2bin(x13)%cambia los numeros decimales de x13 a binarios
%combierte u en una cell array
for i=1:size(x13,1)
A{i}=u(i,:);
end
%Guarda los valores de A en P3 los une en una sola matris de 1xn
P3=[];
for i=1:length(A)
P3=[P3,A{i}];
end
P3
Prueba=P3
%Compara los bits de P3 con un numero aleatorio r < 0.05 y si es menor lo
%cambia de 0 a 1 o de 1 a 0
for i=1:length(P3)
b=str2double(P3(i));
r=rand;
if r<0.05;
P3mutada(i)=num2str(~b);
P3(i)=num2str(~b);
end
end
[e,f] = size(x14)
f1=length(P3)/e
A6=reshape(P3,f1,length(x13))
A7=A6'
A8=bin2dec(A7)
x13=A8'
o6=dec2bin(x13)
% o6=dec2bin(x14)
[a,b] = size(o5)
[c,d] = size(o6)
s=b-d
A00=[str2num(o6(:))]'
find(A00)
A22=reshape(A00,length(x13),d)
A11_zeros = [zeros(size(A22,1),s) A22];
A22_zeros = cat(2, zeros(size(A22,1),s), A22)
A55=num2str(A22_zeros,-6)
A66=bin2dec(A55)
x13=A66
P1=x13
Poblaciones(p,k)=P1(p)
Fitnessglobal(p,k)=fx1(p)
end
end
Valora esta pregunta
0