import random
individuos={} #Diccionario de individuos
def distancia(n1,n2): #Funcion para cualcular la distancia entre dos numeros
d=n1-n2
return abs(d)
def poblacion_inicial(): #Genera la poblacion inicial. cada individuo tiene asociado un numero aleatorio entre un rango predeterminado
for individuo in range(n_individuos):
individuos[individuo]=random.uniform(limite_inferior, limite_superior)
def seleccion(): #Selecciona el individuo cuyo numero mas se acerco al objetivo. tambien hace un print con los datos del individuo seleccionado
global numero_seleccionado
distancia_minima=1000000000000000000000000
individuo_seleccionado=0
numero_seleccionado=0
for individuo in individuos:
dis=distancia(individuos[individuo], numero_objetivo)
if dis<distancia_minima:
distancia_minima=dis
individuo_seleccionado=individuo
numero_seleccionado=individuos[individuo]
print("Individuo:", individuo_seleccionado, "Numero del individuo:", individuos[individuo_seleccionado], "Distancia:", distancia_minima)
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
for individuo in individuos:
if not individuo==0:
individuos[individuo]=random.uniform(numero_seleccionado-rango_mutacion,numero_seleccionado+rango_mutacion)
else:
individuos[individuo]=numero_seleccionado
#Se ingresan las variables y se da info
print(" ALGORITMO GENETICO - Camilo2001")
print("")
print("ATENCION!. El programa fue creado por un (muy) principiante.")
print("")
print("Si se insertan datos mal crasheara porque no contemple errores")
print("")
print("Con amor, Camilo2001")
print("")
n_individuos=int(input("Seleccione la cantidad de individuos por generacion ->"))
n_generaciones=int(input("Seleccione el numero de generaciones limite ->"))
numero_objetivo=float(input("Seleccione el numero objetivo ->"))
rango_mutacion=float(input("Seleccione el rango de mutacion ->"))
print("Seleccione entre que valores oscilaran los valores iniciales de cada individuo. Se admiten numeros negativos.")
limite_inferior=float(input("Limite inferior ->"))
limite_superior=float(input("Limite superior ->"))
#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
poblacion_inicial()
for generacion in range(n_generaciones):
print(generacion)
seleccion()
if numero_seleccionado==numero_objetivo: #revisa si se alcanzo el numero objetivo. Si es asi lo avisa y rompe el bucle.
print("Se alcanzo el numero objetivo")
break
mutacion()
print("Resultado final -->", numero_seleccionado)
input()