Вы находитесь на странице: 1из 2

ESCUELA POLITÉCNICA NACIONAL

Estudiantes: Mateo Romero Fecha: 08/05/2019


Fausto Polanco
Funciones Creadas:
Función Cruce:

function [hijo1,hijo2] =cruce(padre,madre,pcruce,ngenes)


%Retorna 2 hijos producto del cruce de 2 números en binarios.
%Ingresando el padre ,madre, el número de genes y el punto de cruce aleatorio.
z=ngenes-pcruce;
hijo1=[padre(1:z) madre(z+1:end)];
hijo2=[padre(z+1:end) madre(1:z)];
if randi([1 20])==1 %Se muta a un porcentaje de la población
a=randi([1 ngenes]);
switch hijo1(a)
case 0
hijo1(a)=1;
case 1
hijo2(a)=0;
end
switch hijo2(a)
case 0
hijo2(a)=1;
case 1
hijo2(a)=0;
end
end
end

Algoritmo Genético:
Código:

clc;clear all; close all;


%Algoritmo genetico para ubicar el punto máximo de una función.
n=1;% numero de pobladores iniciales
maximo=1;minimo=3;x=0;y=0; % max y min representan el rango de trabajo y X,Y la
posicion del padre y la madre
k=1; %Contador de generaciones
% Validacion e ingreso de datos
while mod(n,2)~=0 || maximo < minimo%nos aseguramos que la poblacion sea par y que
se valide el min y max
n=input('Ingrese el numero de pobladores iniciales:');
minimo=input('ingrese punto mínimo:');
maximo=input('Ingrese el punto maximo:');
n_generaciones=input('Ingrese el numero de generaciones: ');
if mod(n,2)~=0 || maximo <= minimo
fprintf('Error en la digitacion de datos\n');
pause; clc
end
end
%PROCEDEMOS A GENERAR LA POBLACION INICAL
for i=1:n
poblacion(i)= randi([minimo maximo]); %se ESTAN GENERANDO VALORES CON NUMEROS
DECIMALES INCLUIDOS
end

%SE GENERA EL CICLO.


for j=1:n_generaciones
competencia= poblacion (randperm(length(poblacion))); %Forman pares para competir
(Se reordena aleatoriamente)
for i=1:2:n-1
if competencia(i)>competencia(i+1);
competencia(i+1)=competencia(i);

else
competencia(i)=competencia(i+1); %Se copiaron los mejores individuos
end

end
procreacion=competencia(randperm(length(competencia))); %Forman pares, pero para
procrear
mat_cruce=dec2bin(procreacion); %Se transforma a binario, toda la poblacion
[n numero_de_genes]=size(mat_cruce); %Se toma el numero de genes

for i=1:2:n-1
while 1
pcruce =randi([1,numero_de_genes]); %Se elige un punto de cruce aletorio
[hijo1,hijo2] =cruce(mat_cruce(i,:),mat_cruce(i+1,:),pcruce,numero_de_genes);
nuevo(i,:) =hijo1; %Se guarda al hijo1
nuevo(i+1,:)=hijo2; %Se guarda al hijo 2
if bin2dec(hijo1)>minimo & bin2dec(hijo2)>minimo & bin2dec(hijo1)<=maximo &
bin2dec(hijo2)<=maximo
break %Se comprueba que los 2 hijos esten dentro del rango establecido por
el usuario
end

end
end
poblacion=bin2dec(nuevo); %Se convierte la poblacion de binario a decimal, y
poblacion = nueva generacion
generacion(k,:)=(poblacion(:,:))'; %Se guarda la nueva poblacion en la matriz de
generaciones
k=k+1;
end
fprintf('Generacion final:\n ')
disp(poblacion')

Вам также может понравиться