Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Camilo2001 en 12 Marzo 2017, 04:21 am



Título: Algoritmo Genetico Python
Publicado por: Camilo2001 en 12 Marzo 2017, 04:21 am
Hola ;D. Llevo unos dias en esto de la programacion. Hice un algoritmo genetico super simple para aproximarse a un numero. Lo hice solo for fun y recien estoy aprendiendo (empece hace una semana mas o menos). Nada, dejaba el codigo porque me pinto compartirlo y si quieren comentar alguna mejora o alguna critica me viene barbaro asi sigo aprendiendo. Salu2



Código
  1. import random
  2.  
  3.  
  4. individuos={} #Diccionario de individuos
  5.  
  6.  
  7.  
  8. def distancia(n1,n2):   #Funcion para cualcular la distancia entre dos numeros
  9.        d=n1-n2
  10.        return abs(d)
  11.  
  12.  
  13.  
  14. def poblacion_inicial():  #Genera la poblacion inicial. cada individuo tiene asociado un numero aleatorio entre un rango predeterminado
  15.  
  16. for individuo in range(n_individuos):
  17.  
  18. individuos[individuo]=random.uniform(limite_inferior, limite_superior)
  19.  
  20.  
  21.  
  22.  
  23. def seleccion(): #Selecciona el individuo cuyo numero mas se acerco al objetivo. tambien hace un print con los datos del individuo seleccionado
  24.  
  25.        global numero_seleccionado
  26.  
  27.        distancia_minima=1000000000000000000000000
  28.  
  29.        individuo_seleccionado=0
  30.  
  31.        numero_seleccionado=0
  32.  
  33.        for individuo in individuos:
  34.  
  35.                dis=distancia(individuos[individuo], numero_objetivo)
  36.  
  37.                if dis<distancia_minima:
  38.                        distancia_minima=dis
  39.                        individuo_seleccionado=individuo
  40.                        numero_seleccionado=individuos[individuo]
  41.  
  42.        print("Individuo:", individuo_seleccionado, "Numero del individuo:", individuos[individuo_seleccionado], "Distancia:", distancia_minima)
  43.  
  44.  
  45.  
  46.  
  47. def mutacion(): #A cada individuo le asocia un nuevo numero aleatorio, solo que en este caso va a estar oscilando cerca del numero que se selecciono en la seleccion. la magnitud de la oscilacion la determina el usuario
  48.  
  49.        for individuo in individuos:
  50.  
  51.                if not individuo==0:
  52.  
  53.                 individuos[individuo]=random.uniform(numero_seleccionado-rango_mutacion,numero_seleccionado+rango_mutacion)
  54.                else:
  55.                 individuos[individuo]=numero_seleccionado
  56.  
  57.  
  58.  
  59.  
  60.  
  61. #Se ingresan las variables y se da info
  62. print("                              ALGORITMO GENETICO - Camilo2001")
  63. print("")
  64. print("ATENCION!. El programa fue creado por un (muy) principiante.")
  65. print("")
  66. print("Si se insertan datos mal crasheara porque no contemple errores")
  67. print("")
  68. print("Con amor, Camilo2001")
  69. print("")
  70.  
  71. n_individuos=int(input("Seleccione la cantidad de individuos por generacion ->"))
  72. n_generaciones=int(input("Seleccione el numero de generaciones limite ->"))
  73. numero_objetivo=float(input("Seleccione el numero objetivo ->"))
  74. rango_mutacion=float(input("Seleccione el rango de mutacion ->"))
  75. print("Seleccione entre que valores oscilaran los valores iniciales de cada individuo. Se admiten numeros negativos.")
  76. limite_inferior=float(input("Limite inferior ->"))
  77. limite_superior=float(input("Limite superior ->"))
  78.  
  79. #BUCLE PRINCIPAL. Genera una poblacion inicial. El bucle se ejecuta una vez para cada generacion. Hace un print del num de la generacion, y ejecuta las funciones
  80.  
  81. poblacion_inicial()
  82.  
  83. for generacion in range(n_generaciones):
  84.        print(generacion)
  85.        seleccion()
  86.        if numero_seleccionado==numero_objetivo: #revisa si se alcanzo el numero objetivo. Si es asi lo avisa y rompe el bucle.
  87.                print("Se alcanzo el numero objetivo")
  88.                break
  89.  
  90.        mutacion()
  91.  
  92. print("Resultado final -->", numero_seleccionado)
  93.  
  94. input()
  95.  
  96.