Matlab - Programa que cambia bits de o a uno siendo compoara con un numero aleatorio r<0.05

 
Vista:
sin imagen de perfil

Programa que cambia bits de o a uno siendo compoara con un numero aleatorio r<0.05

Publicado por Marco Antonio (61 intervenciones) el 07/10/2017 15:56:31
Tengo un programa cuya poblacion maxima puede ser 100 cual es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
clear
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
 
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
aj3=-8
bj3=8
N=input('Tamaño de la poblacion: ')
P=[N,1]
P1=rand([P])                                                                    % crea una poblacion aleatoria de 10 numeros entre 0 y 1
P2=P1*(bj3-aj3)+aj3                                                             % convierte la poblacion en numeros reales
x2=P2
for n = 1:size(P1)                                                              % crea un lazo for que asigna valores 1 al 10 a n
    x2(n,2) = (2^Max_Number_of_Bits-1)*(x2(n,1)-aj2)/(bj2-aj2)                % calcula los valores decimales y los guarda en x2(n,2)
end
 
Mas1=2^21-1
Mas2=2^42-(2^21-1)-1
for n = 1:size(P1)
x3(n,1)=bitand(Mas2,round(x2(n,2)))
end
for n = 1:size(P1)
x4(n,1)=bitand(Mas1,round(x2(n,2)))
end
 
for n=1:size(P1)                                                                % Calcula el valor de x1 para calcular fitness
    x5(n,1)=aj1+(x3(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+(x4(n,1)*((bj2-aj2)/(2^Number_of_bits2-1)))
end
 
 
%21.5 + x1 * sin(4*pi*x1) + x2 * sin(20*pi*x2)
 
m=input('Seleccione 1 para minimizar o 2 para maximizar: ')
 
for n1=1:size(P1)
    for n2=1:size(P1)
        if m==1
            fx1(n1,1)=1/(50000000+(21.5 + x5(n1,1) * sin(4*pi*x5(n1,1)) + x5(n1,2) * sin(20*pi*x5(n1,2))))
                else m==2
                    fx1(n2,1)=(1+(21.5 + x5(n2,1) * sin(4*pi*x5(n2,1)) + x5(n2,2) * sin(20*pi*x5(n2,2))))+50000000
        end
    end
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
for n=1:size(P1)
PDEC(n,1)=x2(n,2)
end
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
 
%Cruce
 
j=1
while j<length(P1)
    macho=PDEC(j)
    hembra=PDEC(j+1)
    r=rand(1)
    if r<=0.8
    ptocruce=randi([1,42],1)
    Mas1=2^ptocruce-1
    mane1=(2^Max_Number_of_Bits)-Mas1
    a=bitand(round(hembra),round(mane1))
    b=bitand(round(macho),round(mane1))
    c=bitand(round(hembra),round(Mas1))
    d=bitand(round(macho),round(Mas1))
    w1=bitor(d,a)
    w2=bitor(c,a)
    else
    w1=x11(j)
    w2=x11(j+1)
    end
    x12(j)=w1
    x12(j+1)=w2
    j=j+2
end
x13=x12'

para una poblacion de 30 la variable x13 es igual a:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
x13 =
 
   1.0e+12 *
 
   2.280883104499000
   2.967698287028000
   1.925360979049000
   1.925553511473000
   3.583007949009000
   3.583007962247000
   1.082934129507000
   1.082922698745000
   1.652307718790000
   1.652311505618000
   2.471350774575000
   2.471350973988000
   2.967698287027965
   1.750998125685160
   2.891849899975000
   2.891849906609000
   3.176922396484000
   3.176922363238000
   3.657944873086000
   3.658608841626000
   0.265482502475000
   0.265935675368000
   0.051373542287015
   1.759569328253805
   1.326076299647000
   1.327008399791000
   2.374527617935000
   2.374527714332000
   0.644378332947000
   0.644379153201000

estos valores los tengo que cambiar a binario y después que sean binarios ahora tengo que ahacer una matriz con esos numeros binarios de 1 fila y la multiplicacion de Max_Number_of_Bits por la poblecion me dara el tamño de las columnas por ejemplo para este caso:

1
2
3
x14 =
 
100001001100001111001110100010101011110011101011001011111000100110100010100110110100011100000001001000011101010000110001101001011100000001010011111011101101110000110001110100001000111011111010101000000011010001110100001000111011111010101011010010000111001111110000100011111001110111001101100011001111110000100011001110010000011111111001011000000010110101001101101111001010000110011000000010110101011100001011101011010010100011111101100111111111000010101100101111100011111101100111111111110011011000100100101011001011111000100110100010100110110011011001011110101111100111110000110001110101101010000101001111101011111001111111000111101010000101001111101011111011100110110001101110001110101111010101001011011101000100101110001110101111010101000011010101100110110101001110101110100000010011100001111110110101001111010110000101001001001110011010000011110111001111111111011000000101001011000011110111101011000000000101111111101000000000101111110110000110100000101110001111011001100110101110100000010011100001111101010011010011000000010011101000100101111111010011010011110111110111010100000110101111100010100011011100111000000000101110001111100010100011011100111000011000010000011100001001011000000111111100010000111100010011001001011000000111111111011001001100110001

donde x14 es una matris de una fila.

ahora tengo que comparar un numero aleatorio r que sea menor que 0.05 a cada bit, por ejemplo el primer bit lo selecciono y genero un numero r y lo comparo con 0.05 si es menor lo cambio de 0 a 1, en el caso del bit 4 genero un numero r si es menor a 0.05 lo cambio de 1 a 0 y así con todos los bits, después que el lazo termino y cambio los bit que fueron seleccionados para ser cambiadnos necesito saber que bits fueron cambiados, ahora tengo una matriz de 1 fila por n columnas x15 con los bit cambiados ahora necesito romper x15 en numeros sea digitales o binarios en el formato de x13 por ejemplo agarro los primeros 42 bit y los combierto en un numero decimal y lo guardo en x16(1,1) agarro los siguientes 42 bits y los combierto en numeros decimales y los guardo en X16(2,1) y haci sucecivamente hasta terminar y tener una matris de 30x1

Atentamente Marco
Muchas gracias de antemano
espero su pronta respuesta con ansias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder