Algoritmo Genético C#

  • 3 Respuestas
  • 350 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Andr0z

  • *
  • Colaborador
  • *
  • Mensajes: 15
  • Actividad:
    30%
  • Country: mx
  • Reputación 2
    • Yahoo Instant Messenger - Andr0z
    • Ver Perfil
    • Email

Algoritmo Genético C#

  • en: Abril 05, 2020, 02:06:23 pm
Ejemplo básico de un algoritmo genético en C#

Nota: puedes experimentar variando la cantidad de individuos y tasa de mutación y ver como esta afecta a la convergencia y tiempo de solución

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class Program
  10.     {
  11.         /*Idea original DanielShiffman, The nature of code*/
  12.         public static string objetivo;
  13.      
  14.         static void Main(string[] args)
  15.         {
  16.             objetivo = "Hola Mundo <img src="https://underc0de.org/foro/Smileys/default/cheesy.gif" alt="&#58;D" title="Cheesy" class="smiley" />";
  17.             int numero_ind = 100; //Se puede experimentar con la variacion de numero de individuos y tasa de mutacion
  18.             float tasa_mutacion = 0.02f;
  19.             Poblacion poblacion = You are not allowed to view links. Register or Login Poblacion(tasa_mutacion,numero_ind,objetivo);
  20.             while (true)
  21.             {
  22.  
  23.                 Console.WriteLine(" Generacion: " + poblacion.generacion + " | Mejor Individuo= " + poblacion.Mejor_individuo() + " | Promedio de aptitud por generación= " + poblacion.Promedio());
  24.                 poblacion.Seleccion();
  25.                 poblacion.Generacion();
  26.                 if (poblacion.Mejor_individuo() == objetivo) break;
  27.                 poblacion.Calcular_aptitud();
  28.  
  29.             }
  30.             Console.ReadKey();
  31.  
  32.         }
  33.  
  34.         //Generador de numeros aleatorios enteros entre n1 y n2-1
  35.         public static int random_entero(int n1,int n2)
  36.         {
  37.             Guid guid = Guid.NewGuid();
  38.             string justNumbers = You are not allowed to view links. Register or Login String(guid.ToString().Where(Char.IsDigit).ToArray());
  39.             int seed = int.Parse(justNumbers.Substring(0, 4));
  40.             Random random= You are not allowed to view links. Register or Login Random(seed);
  41.             return random.Next(n1, n2);  
  42.         }
  43.  
  44.         //Generador de numeros aleatorios decimales entre  0 y 1
  45.         public static double random_decimal()
  46.         {
  47.             Guid guid = Guid.NewGuid();
  48.             string justNumbers = You are not allowed to view links. Register or Login String(guid.ToString().Where(Char.IsDigit).ToArray());
  49.             int seed = int.Parse(justNumbers.Substring(0, 4));
  50.             Random random = You are not allowed to view links. Register or Login Random(seed);
  51.             return random.NextDouble();
  52.         }
  53.     }
  54. }
  55.  


Clase ADN.cs

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class ADN
  10.     {
  11.         public char[] genes;
  12.         public float aptitud;
  13.  
  14.         //Constructor clase ADN
  15.         public ADN(int num)
  16.         {
  17.             genes = You are not allowed to view links. Register or Login char[num];
  18.             for (int i = 0; i < genes.Length; i++) genes[i] = Convert.ToChar(Program.random_entero(32, 129));
  19.         }
  20.  
  21.         //Convertimos nuestra cadena de caracteres a string
  22.         public string ConseguirADN()
  23.         {
  24.             return You are not allowed to view links. Register or Login string(genes);
  25.         }
  26.  
  27.         //Calculamos la aptitud comparando elemento a elemento el string del ADN con el objetivo
  28.         public float Aptitud(string objetivo)
  29.         {
  30.             int puntos = 0;
  31.             for (int i = 0; i < genes.Length; i++) if (genes[i] == objetivo[i]) puntos++;
  32.             aptitud = (float)puntos / (float)objetivo.Length;
  33.             return aptitud;
  34.         }
  35.  
  36.         //Se mezcla la la informacion entre dos ADN  para crear un hijo
  37.         public ADN Reproduccion(ADN padre)
  38.         {
  39.             int punto_cruce = Program.random_entero(0, genes.Length);
  40.             ADN hijo = You are not allowed to view links. Register or Login ADN(genes.Length);
  41.             for (int i=0;i<genes.Length;i++)
  42.             {
  43.                 if (i < punto_cruce) hijo.genes[i] = genes[i];
  44.                 else hijo.genes[i] = padre.genes[i];
  45.             }
  46.             return hijo;
  47.         }
  48.  
  49.         //Se muta(modifica) el elemento del ADN si el numero obtenido aleatoriamente es menor que la tasa de mutacion
  50.         public void Mutacion(float tasa_mutacion)
  51.         {
  52.             for (int i = 0;i< genes.Length; i++) if (Program.random_decimal() < tasa_mutacion) genes[i] = Convert.ToChar(Program.random_entero(32,129));
  53.         }
  54.  
  55.     }
  56. }
  57.  

Clase Poblacion.cs

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class Poblacion
  10.     {
  11.         public int generacion=1;
  12.         public ADN[] poblacion;
  13.         List<ADN> contenedor;
  14.         float tasa_mutacion;
  15.         string objetivo;
  16.  
  17.         //Constructor de la población
  18.         public Poblacion(float tm, int num,string objetivo)
  19.         {
  20.             this.objetivo = objetivo;
  21.             tasa_mutacion = tm;
  22.             poblacion = You are not allowed to view links. Register or Login ADN[num];
  23.             for (int i = 0; i < poblacion.Length; i++)  poblacion[i] = You are not allowed to view links. Register or Login ADN(objetivo.Length);
  24.             contenedor = You are not allowed to view links. Register or Login List<ADN>();
  25.             Calcular_aptitud();
  26.         }
  27.  
  28.         //Se calcula la aptitud de cada uno de los individuos de la poblacion. La mayor aptitud es de 1
  29.         public void Calcular_aptitud()
  30.         {
  31.             for (int i = 0; i < poblacion.Length; i++) poblacion[i].Aptitud(objetivo);
  32.         }
  33.  
  34.         //Se le asigna al contenedor cuantas veces sea un individuo en proporcion a su aptitud. Mayor aptitud, mayor veces estara ese individuo en nuestro contenedor
  35.         public void Seleccion()
  36.         {
  37.             float val_Max = 0;
  38.             contenedor.Clear();
  39.             for (int i = 0; i < poblacion.Length; i++) if (poblacion[i].aptitud > val_Max)  val_Max = poblacion[i].aptitud;
  40.             for (int i = 0; i < poblacion.Length; i++)
  41.             {
  42.                 float map_aptitud = Map(poblacion[i].aptitud, 0, val_Max, 0, 1);
  43.                 int numero = (int)(map_aptitud)*100;
  44.                 for (int j = 0; j < numero; j++) contenedor.Add(poblacion[i]);
  45.             }      
  46.         }
  47.  
  48.         /*Se selecciona al azar individuos de nuestro contenedor para realizar su cruza, obtener el hijo
  49.         y remplazar la antigua generacion con los nuevos hijos*/
  50.  
  51.         public void Generacion()
  52.         {
  53.             for(int i=0;i<poblacion.Length;i++)
  54.             {
  55.                 int A = Program.random_entero(0, contenedor.Count - 1);
  56.                 int B = Program.random_entero(0, contenedor.Count - 1);
  57.                 ADN madre = contenedor[A];
  58.                 ADN padre = contenedor[B];
  59.                 ADN hijo = madre.Reproduccion(padre);
  60.                 hijo.Mutacion(tasa_mutacion);
  61.                 poblacion[i] = hijo;
  62.             }
  63.             generacion++;
  64.         }
  65.  
  66.         //Se selecciona el mejor individuo de la generacion para retornar su string
  67.         public string Mejor_individuo()
  68.         {
  69.             float val_Max = 0;
  70.             int indice = 0;
  71.             for (int i = 0; i < poblacion.Length; i++)
  72.             {
  73.                 if (poblacion[i].aptitud > val_Max)
  74.                 {
  75.                     val_Max = poblacion[i].aptitud;
  76.                     indice = i;
  77.                 }
  78.             }
  79.             return You are not allowed to view links. Register or Login string(poblacion[indice].genes);
  80.         }
  81.  
  82.         // Se calcula el promedio de aptitud por generacion
  83.         public float Promedio()
  84.         {
  85.             float promedio = 0;
  86.             for (int i = 0; i < poblacion.Length; i++)  promedio += poblacion[i].aptitud;
  87.             return (float)promedio / (poblacion.Length);
  88.         }
  89.  
  90.         //Método de mapeo
  91.         float Map(float val, float x1, float x2, float y1, float y2)
  92.         {
  93.             return ((val - x1) / (x2 - x1)) * (y2 - y1) + y1;
  94.         }
  95.     }
  96. }
  97.  
  98.  


« Última modificación: Abril 05, 2020, 02:10:27 pm por Andr0z »

Desconectado Bartz

  • *
  • Moderador Global
  • Mensajes: 211
  • Actividad:
    16.67%
  • Reputación 8
  • ~Afaik~
    • Ver Perfil

Re:Algoritmo Genético C#

  • en: Abril 06, 2020, 02:33:03 pm
Gracias por el aporte !

Podrias comentar un poco mas sobre este tipo de algoritmos ? Para que se usa, cual es su finalidad.


Con la fuerza del mar, con la paz del rio


Desconectado Andr0z

  • *
  • Colaborador
  • *
  • Mensajes: 15
  • Actividad:
    30%
  • Country: mx
  • Reputación 2
    • Yahoo Instant Messenger - Andr0z
    • Ver Perfil
    • Email

Re:Algoritmo Genético C#

  • en: Abril 06, 2020, 05:43:38 pm
Hola Bartz!!, por nada hermano.
La información vendrá en la edición próxima a salir, es complementario a la revista  ;)

Desconectado Bartz

  • *
  • Moderador Global
  • Mensajes: 211
  • Actividad:
    16.67%
  • Reputación 8
  • ~Afaik~
    • Ver Perfil

Re:Algoritmo Genético C#

  • en: Abril 09, 2020, 06:11:34 pm
Excelente !


Con la fuerza del mar, con la paz del rio


 

[VB2010] Algoritmo encryptacion AES

Iniciado por noxonsoftwares

Respuestas: 9
Vistas: 9223
Último mensaje Agosto 19, 2016, 12:56:51 pm
por 79137913