Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # CREADO NDD Sept 2019
- import random
- import numpy as np
- """ Comentarios son Una Linea: #
- O triple comilla doble: Un bloque"""
- """Si se desea una población inicial no aleatoria
- cromosoma1 = [1, 0, 0, 0, 1]
- cromosoma2 = [0, 1, 0, 0, 0]
- cromosoma3 = [1, 1, 0, 0, 1]
- cromosoma4 = [1, 1, 1, 0, 1]
- poblInicial = np.array([cromosoma1, cromosoma2, cromosoma3, cromosoma4]
- """
- # MEJORA: Tamaño de la Población como parametro
- # random.seed(1)
- # print("\n","aletorio:", random.randrange(2)) #Entero 0 o 1
- # FUNCIONES PARA OPERADORES
- def evalua(n, x, poblIt, utilidad):
- suma = 0
- total = 0
- for i in range(0, n):
- for j in range(0, x):
- suma += poblIt[i, j]*utilidad[j]
- fitness[i] = suma
- total += suma
- suma = 0
- return fitness, total
- def imprime(n, total, fitness, poblIt):
- # Tabla de evaluación de la Población
- acumula = 0
- print("\n", 'Tabla Iteración:', "\n")
- for i in range(0, n):
- probab = fitness[i]/total
- acumula += probab
- print([i+1], " ", poblIt[i], " ", fitness[i], " ", es_factible(poblIt[i])[1], " ",
- "{0:.3f}".format(probab), " ", "{0:.3f}".format(acumula))
- acumulado[i] = acumula
- print("Total Fitness: ", total)
- return acumulado
- def seleccion(acumulado):
- escoje = np.random.rand()
- print("escoje: ", escoje)
- for i in range(0, n):
- if acumulado[i] > escoje:
- padre = poblIt[i]
- break
- return (padre)
- def cruce(a1, p1, p2):
- if a1 < Pcruce:
- print("Mas grande", Pcruce, "que ", a1, "-> Si Cruzan")
- corte = np.random.randint(1, len(p1))
- temp1 = p1[0:corte] # [i:j] corta desde [i a j)
- temp2 = p1[corte:len(p1)]
- print(temp1, temp2)
- temp3 = p2[0:corte]
- temp4 = p2[corte:len(p2)]
- print(temp3, temp4)
- hijo1 = list(temp1)
- hijo1.extend(list(temp4))
- hijo2 = list(temp3)
- hijo2.extend(list(temp2))
- else:
- print("Menor", Pcruce, "que ", a1, "-> NO Cruzan")
- hijo1 = p1
- hijo2 = p2
- return hijo1, hijo2
- def mutacion(individuo):
- for i in range(0, len(individuo)):
- rpmuta = np.random.rand()
- if rpmuta < Pmuta:
- individuo[i] = 0 if individuo[i] else 1
- return individuo
- def es_factible(individuo):
- total = 0
- for i in range(0, len(individuo)):
- total += individuo[i] * pesos[i]
- return total < peso_max, total
- #### Parametros #####
- x = 5 # numero de variables de decision - Elementos diferentes: x
- n = 4 # numero de individuos en la poblacion - cromosomas: n
- Pcruce = 0.9 # Probabilidad de Cruce
- Pmuta = 0.1 # Probabilidad de Mutación
- fitness = np.empty((n))
- acumulado = np.empty((n))
- suma = 0
- total = 0
- # Individuos, soluciones o cromosomas
- # aleatorios (n por x) enteros entre [0 y2)
- poblInicial = np.empty((n, x), dtype='int')
- cont_individuos_pobl_ini = 0
- # Ingresar los datos del Problema de la Mochila - Peso y Utilidad de los Elementos
- pesos = [5, 7, 10, 30, 25]
- utilidad = [10, 20, 15, 30, 15]
- peso_max = 55
- while(cont_individuos_pobl_ini < 4):
- posible_individuo = np.random.randint(0, 2, (1, x))[0]
- if es_factible(posible_individuo)[0]:
- poblInicial[cont_individuos_pobl_ini] = posible_individuo
- cont_individuos_pobl_ini += 1
- # random.random((4,5)) # 4 individuos 5 genes
- print("Poblacion inicial Aleatoria:", "\n", poblInicial)
- print("\n", "Utilidad:", utilidad)
- print("\n", "Pesos", pesos)
- poblIt = poblInicial
- # FIN DE LOS DATOS INICIALES
- # Llama función evalua, para calcular el fitness de cada individuo
- fitness, total = evalua(n, x, poblIt, utilidad)
- #####print("\n","Funcion Fitness por individuos", fitness)
- #####print("\n","Suma fitness: ", total)
- # imprime la tabla de la iteracion
- imprime(n, total, fitness, poblIt)
- # ***************************************
- # Inicia Iteraciones
- for iter in range(1):
- print("\n", "Iteración ", iter+1)
- poblacion_aux = np.empty((n, x), dtype='int')
- cont_hijo = 0
- while(cont_hijo < 4):
- # for i in [0, 2]: # Para el bloque de 2 hijos cada vez
- papa1 = seleccion(acumulado) # Padre 1
- print("padre 1:", papa1)
- papa2 = seleccion(acumulado) # Padre 2
- print("padre 2:", papa2)
- hijoA, hijoB = cruce(np.random.rand(), papa1, papa2)
- hijoA = mutacion(hijoA)
- hijoB = mutacion(hijoB)
- print(cont_hijo)
- if es_factible(hijoA)[0]:
- print("hijo1: ", hijoA)
- poblacion_aux[cont_hijo] = hijoA
- cont_hijo += 1
- if cont_hijo >= 4:
- break
- if es_factible(hijoB)[0]:
- print("hijo2: ", hijoB)
- poblacion_aux[cont_hijo] = hijoB
- cont_hijo += 1
- poblIt = poblacion_aux
- print("\n", "Poblacion Iteración ", iter+1, "\n", poblIt)
- fitness, total = evalua(n, x, poblIt, utilidad)
- #### print("\n","Funcion Fitness por individuos", fitness)
- #### print("\n","Suma fitness: ", total)
- # imprime la tabla de la iteracion
- imprime(n, total, fitness, poblIt)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement