InicioCiencia EducacionPrograme un algoritmo genetico en MATLAB

Bienvenidos hoy hablaremos sobre algoritmos genéticos



Cuando hablamos de algoritmos genéticos, hay que hablar de John Holland que en 1962 asienta las bases para sus posteriores desarrollos hasta llegar a lo que se conoce hoy por algoritmos genéticos.
Un algoritmo genético es un método de búsqueda que imita la teoría de la evolución biológica de Darwin para la resolución de problemas. Para ello, se parte de una población inicial de la cual se seleccionan los individuos más capacitados para luego reproducirlos y mutarlos para finalmente obtener la siguiente generación de individuos que estarán más adaptados que la anterior generación.




CodificacióndelasVariables
Los cromosomas de alguna manera deberán contener información acerca de la solución que representa. La codificación se puede realizar de varias formas. La más utilizada es mediante una cadena de números binarios (1s o 0s). Pero también se puede realizar la codificación mediante números enteros o incluso cadenas de palabras.
La elección de la codificación dependerá también del problema a resolver pues puede darse la situación en la que la resolución de un caso sea más óptimo el uso de una codificación basada en números reales mientras que esa codificación complique la solución en otro caso. Así pues hay que estudiar la codificación más óptima según el caso que se esté estudiando.



Algoritmo basico para un algoritmo genético

Inicio (1) t = 0; 
    inicializar P(t);
    evaluar P(t);
    Mientras (no se cumpla la condición de parada) hacer Inicio(2)
      t= t+1
      seleccionar P(t) desde P(t-1) recombinar P(t) 
      mutación P(t)
      evaluar P(t)
    Final(2) 
Final(1)


Ejemplo resolviendo la ruta mas corta que cruze todas las ciudades

Como se vio en el algoritmo el primer paso es inicializar una población de individuos, en este caso son genes, traducidos a la computación vectores en este caso, la representación del gen será mediante números, cada numero debería representar una ciudad, las ciudades hipoteticamente hablando están relacionadas en un grafo cada arista tiene un valor que es el coste de ir de tal ciudad a tal ciudad , no lo puse por que no se vería en la imagen.

un grafo anterior es la representación de una matriz de adyacencia en este caso de la siguiente matriz


k=[  0   29  20  21  16  31  100 12  4   31  18;
     29  0   15  29  28  40  72  21  29  41  12;
     20  15  0   15  14  25  81  9   23  27  13;
     21  29  15  0   4   12  92  12  25  13  25;
     16  28  14  4   0   16  94  9   20  16  22;
     31  40  25  12  16  0   95  24  36  3   37;
     100 72  81  92  94  95  0   90  101 99  84;
     12  21  9   12  9   24  90  0   15  25  13;
     4   29  23  25  20  36  101 15  0   35  18;
     31  41  27  13  16  3   99  25  35  0   38;
     18  12  13  25  22  37  84  13  18  38  0];


Una matriz de adyacencia describe la relación que existe entre cada nodo de un grado con otro nodo cada columna siendo los nodos por eso en la diagonal tiende a cero pues el nodo en relación con si mismo no tiene un costo.


Empezamos con el código primero la generación de la población inicial


pl=zeros(1,1);
%creamos un arreglo del tamaño de las ciudades en este caso 11. [1,2,3,4,5,6,7,8,9,10,11]
seed=[1:size];

% creacion de nuetra poblacion permutada
%este ciclo nos genera una matriz de 11x150 donde serán 150 cromosomas diferentes que son %combinaciones del vector de 11 ciudades, en pocas palabras simples combinaciones 
for i=1:150
   pob(i,:)= seed(randperm(length(seed)));
end
pobsize=length(pob);
x=zeros(1,pobsize);
%iniciamos a los padres que generaran otra población 
padres=zeros(10,size);



después se realiza el proceso que replica el comportamiento de la evolución , los padres se van cruzando (fallan mas que los taringeros ) con otros cromosomas (padres igual aquí creo no vale el genero :V), posterior a esto, se realiza una mutación de un porcentaje pequeño de la población que resulto de la cruza , la mutación cambia en este caso algún cromosoma del gen (en este problema la mutación hace algún cambio entre posiciones ) , ya teniendo esto se realiza la agregación de los hijos resultantes de la cruza si como los mutados(deformes o genios jaja) y se procede a evaluar cada gen de la población utilizando una función fitness esta es la siguiente :


%recibe c que es el cromosoma o gen y g que es la matriz de adyacencia y nos regresa un valor del coste total que recorre esa combinación de ciudades recordemos que queremos buscar la combinación o ruta que pase por todas las ciudades que cueste menos, entonces entre menos nos cueste es mejor la solucion.
function[fit]=fitness(c,g)

   sigma=0;
    for i=1:length(c)-1
    sigma=sigma+g(c(i),c(i+1));
    end
    fit=sigma;
end


finalmente de evaluar la población se escogen los mejores y se procede a matar a los demás jajaja, se eliminan los cromosomas mas débiles y se dejan los mejores para que las próximas generaciones tengan mejores hijos y así sucesivamente hasta que el resultado del fitness sea el mejor.




for k=1:alp
for i=1:pobsize
    x(i)=fitness(pob(i,:),matrixAdj);
end
%seleccion por ruleta;
x=x/sum(x);

for i=1:pobsize*.50
    a=rand;
    sig=0;
    for j=1:pobsize
    sig=sig+x(j);
      if sig>a
        padres(i,:)=pob(j,:);
        break;
      end
    end
end
sons=zeros(10,size);
 %cruza
 for i=1:2:pobsize*.50
    ar1=randi([1,pobsize*.50],1,1);
    ar2=randi([1,pobsize*.50],1,1);
    [ch1,ch2]=OX(padres(ar1,:),padres(ar2,:));
    sons(i,:)=ch1;
    sons(i+1,:)=ch2;
 end

%mutacion
len=length(sons);
    for j=1:4
         a=randi([1,pobsize*.50],1,1);         
         v=padres(a,:);
         sons(len+j,:)=v(randperm(length(v)));
    end
 len=length(pob);
 %add hujos to poblation 
 for j=1:length(sons)
       pob(len+j,:)=sons(j,:);
 end
 
 temp=pob;
  %evaluacion
   for i=1:length(pob(:,1))
      pob(i,size+1)=fitness(temp(i,:),matrixAdj);
   end
   temp=zeros(10,size);
   %sort poblation
   
   sortPop=sortrows(pob,size+1);
   for i=1:pobsize
    temp(i,:)=sortPop(i,1:size);
   end
   pob=temp;
  
   pl(k)=sortPop(1,size+1);
end
   pob=pob(1,:); 
end

Para finalizar utilizando la matriz de adyacencia que mencionamos al principio y aplicando el algoritmo mencionado nos devuelve una ruta siguiente 


 7     2    11     9     1     8     3     5     4    10    6

nos quiere decir que empezar por la ciudad 7 pasar las ciudades mencionadas 2,11,9 etc y finalizar en la ciudad 6 nos da la combinación mas optima, se puede ver en la siguiente figura la ruta.




las lineas rojas marcan la ruta que debe seguir para realizar el recorrido.




Les comparto el código completo en Github
https://github.com/Cosijopiii/AlgoritmoGeneticoTSP

también si quieren pueden pasarse por mis anteriores post's




Cualquier duda o comentario escríbanlo abajo, con gusto repondere no olvides dejarme unos puntos y recomendarme , seguiré con esta serie de post un poco técnicos pero interesantes.




Datos archivados del Taringa! original
603puntos
2,261visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
0visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

No hay comentarios nuevos todavía

Autor del Post

k
kosimac🇦🇷
Usuario
Puntos0
Posts2
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.