Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. # CREADO NDD Sept 2019
  2. import random
  3. import numpy as np
  4.  
  5.  
  6. """ Comentarios son Una Linea: #
  7. O triple comilla doble: Un bloque"""
  8.  
  9. """Si se desea una población inicial no aleatoria
  10. cromosoma1 = [1, 0, 0, 0, 1]
  11. cromosoma2 = [0, 1, 0, 0, 0]
  12. cromosoma3 = [1, 1, 0, 0, 1]
  13. cromosoma4 = [1, 1, 1, 0, 1]
  14. poblInicial = np.array([cromosoma1, cromosoma2, cromosoma3, cromosoma4]
  15. """
  16.  
  17. # MEJORA: Tamaño de la Población como parametro
  18. # random.seed(1)
  19. # print("\n","aletorio:", random.randrange(2)) #Entero 0 o 1
  20.  
  21. # FUNCIONES PARA OPERADORES
  22.  
  23.  
  24. def evalua(n, x, poblIt, utilidad):
  25. suma = 0
  26. total = 0
  27. for i in range(0, n):
  28. for j in range(0, x):
  29. suma += poblIt[i, j]*utilidad[j]
  30. fitness[i] = suma
  31. total += suma
  32. suma = 0
  33. return fitness, total
  34.  
  35.  
  36. def imprime(n, total, fitness, poblIt):
  37. # Tabla de evaluación de la Población
  38. acumula = 0
  39. print("\n", 'Tabla Iteración:', "\n")
  40. for i in range(0, n):
  41. probab = fitness[i]/total
  42. acumula += probab
  43. print([i+1], " ", poblIt[i], " ", fitness[i], " ", es_factible(poblIt[i])[1], " ",
  44. "{0:.3f}".format(probab), " ", "{0:.3f}".format(acumula))
  45. acumulado[i] = acumula
  46. print("Total Fitness: ", total)
  47. return acumulado
  48.  
  49.  
  50. def seleccion(acumulado):
  51. escoje = np.random.rand()
  52. print("escoje: ", escoje)
  53.  
  54. for i in range(0, n):
  55. if acumulado[i] > escoje:
  56. padre = poblIt[i]
  57. break
  58. return (padre)
  59.  
  60.  
  61. def cruce(a1, p1, p2):
  62. if a1 < Pcruce:
  63. print("Mas grande", Pcruce, "que ", a1, "-> Si Cruzan")
  64. corte = np.random.randint(1, len(p1))
  65. temp1 = p1[0:corte] # [i:j] corta desde [i a j)
  66. temp2 = p1[corte:len(p1)]
  67. print(temp1, temp2)
  68. temp3 = p2[0:corte]
  69. temp4 = p2[corte:len(p2)]
  70. print(temp3, temp4)
  71. hijo1 = list(temp1)
  72. hijo1.extend(list(temp4))
  73. hijo2 = list(temp3)
  74. hijo2.extend(list(temp2))
  75.  
  76. else:
  77. print("Menor", Pcruce, "que ", a1, "-> NO Cruzan")
  78. hijo1 = p1
  79. hijo2 = p2
  80.  
  81. return hijo1, hijo2
  82.  
  83.  
  84. def mutacion(individuo):
  85. for i in range(0, len(individuo)):
  86. rpmuta = np.random.rand()
  87. if rpmuta < Pmuta:
  88. individuo[i] = 0 if individuo[i] else 1
  89.  
  90. return individuo
  91.  
  92.  
  93. def es_factible(individuo):
  94. total = 0
  95. for i in range(0, len(individuo)):
  96. total += individuo[i] * pesos[i]
  97.  
  98. return total < peso_max, total
  99.  
  100.  
  101. #### Parametros #####
  102. x = 5 # numero de variables de decision - Elementos diferentes: x
  103. n = 4 # numero de individuos en la poblacion - cromosomas: n
  104. Pcruce = 0.9 # Probabilidad de Cruce
  105. Pmuta = 0.1 # Probabilidad de Mutación
  106.  
  107.  
  108. fitness = np.empty((n))
  109. acumulado = np.empty((n))
  110. suma = 0
  111. total = 0
  112.  
  113. # Individuos, soluciones o cromosomas
  114. # aleatorios (n por x) enteros entre [0 y2)
  115. poblInicial = np.empty((n, x), dtype='int')
  116. cont_individuos_pobl_ini = 0
  117. # Ingresar los datos del Problema de la Mochila - Peso y Utilidad de los Elementos
  118. pesos = [5, 7, 10, 30, 25]
  119. utilidad = [10, 20, 15, 30, 15]
  120. peso_max = 55
  121.  
  122.  
  123. while(cont_individuos_pobl_ini < 4):
  124. posible_individuo = np.random.randint(0, 2, (1, x))[0]
  125.  
  126. if es_factible(posible_individuo)[0]:
  127. poblInicial[cont_individuos_pobl_ini] = posible_individuo
  128. cont_individuos_pobl_ini += 1
  129.  
  130. # random.random((4,5)) # 4 individuos 5 genes
  131.  
  132.  
  133. print("Poblacion inicial Aleatoria:", "\n", poblInicial)
  134. print("\n", "Utilidad:", utilidad)
  135. print("\n", "Pesos", pesos)
  136. poblIt = poblInicial
  137.  
  138. # FIN DE LOS DATOS INICIALES
  139.  
  140.  
  141. # Llama función evalua, para calcular el fitness de cada individuo
  142. fitness, total = evalua(n, x, poblIt, utilidad)
  143.  
  144. #####print("\n","Funcion Fitness por individuos", fitness)
  145. #####print("\n","Suma fitness: ", total)
  146.  
  147. # imprime la tabla de la iteracion
  148. imprime(n, total, fitness, poblIt)
  149.  
  150. # ***************************************
  151. # Inicia Iteraciones
  152.  
  153. for iter in range(1):
  154. print("\n", "Iteración ", iter+1)
  155. poblacion_aux = np.empty((n, x), dtype='int')
  156. cont_hijo = 0
  157.  
  158. while(cont_hijo < 4):
  159. # for i in [0, 2]: # Para el bloque de 2 hijos cada vez
  160. papa1 = seleccion(acumulado) # Padre 1
  161. print("padre 1:", papa1)
  162. papa2 = seleccion(acumulado) # Padre 2
  163. print("padre 2:", papa2)
  164. hijoA, hijoB = cruce(np.random.rand(), papa1, papa2)
  165. hijoA = mutacion(hijoA)
  166. hijoB = mutacion(hijoB)
  167. print(cont_hijo)
  168.  
  169. if es_factible(hijoA)[0]:
  170. print("hijo1: ", hijoA)
  171. poblacion_aux[cont_hijo] = hijoA
  172. cont_hijo += 1
  173.  
  174. if cont_hijo >= 4:
  175. break
  176.  
  177. if es_factible(hijoB)[0]:
  178. print("hijo2: ", hijoB)
  179. poblacion_aux[cont_hijo] = hijoB
  180. cont_hijo += 1
  181.  
  182. poblIt = poblacion_aux
  183. print("\n", "Poblacion Iteración ", iter+1, "\n", poblIt)
  184. fitness, total = evalua(n, x, poblIt, utilidad)
  185. #### print("\n","Funcion Fitness por individuos", fitness)
  186. #### print("\n","Suma fitness: ", total)
  187.  
  188. # imprime la tabla de la iteracion
  189. imprime(n, total, fitness, poblIt)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement