def setUp(self) -> None: self.data: Dict[str, Any] = { 'tamano': 10, 'pesos': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'valores': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'capacidad': 15, 'elementos': [None for i in range(10)] } self.padre: Mochila = Mochila( elementos=[0, 1, 1, 0, 1, 1, 1, 0, 1, 0], tamano=self.data['tamano'], pesos=self.data['pesos'], valores=self.data['valores'], capacidad=self.data['capacidad'] ) self.madre: Mochila = Mochila( elementos=[0, 1, 1, 1, 0, 0, 1, 0, 1, 1], tamano=self.data['tamano'], pesos=self.data['pesos'], valores=self.data['valores'], capacidad=self.data['capacidad'] ) seed(30) # aleatorio_1=8, aleatorio_2=4, aleatorio_3=9, aleatorio_4=0, aleatorio_5=9, aleatorio_6=3 return super().setUp()
def test_mochila_sin_elementos(self): individuo: Mochila = Mochila(tamano=self.data['tamano'], pesos=self.data['pesos'], valores=self.data['valores'], capacidad=self.data['capacidad']) lista_vacia: list = [] self.assertNotEqual(individuo.elementos, lista_vacia)
def swap(hijo: Mochila, n: int) -> Mochila: hijo_mutado: Mochila = hijo.copy() aleatorio_1: int = randint(1, n) - 1 aleatorio_2: int = randint(1, n) - 1 temp: int = hijo_mutado.elementos[aleatorio_1] hijo_mutado.elementos[aleatorio_1] = hijo_mutado.elementos[aleatorio_2] hijo_mutado.elementos[aleatorio_2] = temp hijo_mutado.elementos = hijo_mutado.elementos # Actualizar cálculos return hijo_mutado
def seleccion_torneo(poblacion: List[Mochila], tamano_muetra: int, data: Dict[str, Any]) -> Mochila: vector_aleatorios: List[Mochila] = choices(poblacion, k=tamano_muetra) individuo: Mochila = Mochila(**data) for i in vector_aleatorios: if i.es_factible: if i.f_objetivo > individuo.f_objetivo: individuo = i.copy() return individuo
def test_mochila_elementos_ceros(self): individuo: Mochila = Mochila(elementos=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], tamano=self.data['tamano'], pesos=self.data['pesos'], valores=self.data['valores'], capacidad=self.data['capacidad']) comparacion: str = ('Solución: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]' + '\n' + 'Función Objetivo: 0' + '\n' + 'Ocupación: [ ]0.00%' + '\n' + 'Es Factible: True') self.assertEqual(individuo.__str__(), comparacion)
def test_mochila_con_elementos(self): individuo: Mochila = Mochila(elementos=[0, 1, 1, 0, 1, 1, 1, 0, 1, 0], tamano=self.data['tamano'], pesos=self.data['pesos'], valores=self.data['valores'], capacidad=self.data['capacidad']) comparacion: str = ('Solución: [0, 1, 1, 0, 1, 1, 1, 0, 1, 0]' + '\n' + 'Función Objetivo: 32' + '\n' + 'Ocupación: [■■■■■■■■■■■■■■■■■■■■]213.33%' + '\n' + 'Es Factible: False') self.assertEqual(individuo.__str__(), comparacion)
def cruzamiento(padre: Mochila, madre: Mochila, data: Dict[str, Any], cantidad_articulos: int) -> Dict[str, Mochila]: """ Cruzamiento PMX para el problema de la mochila. >>> from typing import Any, Dict, List >>> from models.Mochila import Mochila >>> from random import randint, seed >>> data: Dict[str, Any] = { ... 'tamano': 5, ... 'pesos': [1, 2, 3, 4, 5], ... 'valores': [4, 4, 2, 1, 3], ... 'capacidad': 15, ... 'elementos': [None for i in range(5)] ... } >>> padre = Mochila( ... elementos=[0, 1, 1, 0, 1], ... tamano=data['tamano'], ... pesos=data['pesos'], ... valores=data['valores'], ... capacidad=data['capacidad'] ... ) >>> madre = Mochila( ... elementos=[0, 1, 1, 1, 0], ... tamano=data['tamano'], ... pesos=data['pesos'], ... valores=data['valores'], ... capacidad=data['capacidad'] ... ) >>> seed(30) # aleatorio_1 = 2, aleatorio_2 = 4 >>> hijos = cruzamiento(padre=padre, madre=madre, data=data, cantidad_articulos=data['tamano']) >>> hijo_1 = hijos['hijo_1'] >>> hijo_2 = hijos['hijo_2'] >>> print(hijo_1.elementos) [0, 1, 1, 1, 1] >>> print(hijo_2.elementos) [0, 1, 1, 0, 0] """ # 1. Se generan aleatoriamente dos puntos de corte Pc1 y Pc2. aleatorio_1: int = randint(1, cantidad_articulos) - 1 aleatorio_2: int = randint(1, cantidad_articulos) - 1 if aleatorio_1 > aleatorio_2: temp: int = aleatorio_1 aleatorio_1 = aleatorio_2 aleatorio_2 = temp # 2. Genes por fuera de la franja. hijo_1: Mochila = Mochila(**data) hijo_2: Mochila = Mochila(**data) for i in range(cantidad_articulos): if (i <= aleatorio_1 or i >= aleatorio_2): hijo_1.elementos[i] = padre.elementos[i] hijo_2.elementos[i] = madre.elementos[i] # 3. Genes por dentro de la franja. ## Hijo 1 posiciones_ceros: List[int] = [ i for i in range(cantidad_articulos) if hijo_1.elementos[i] == None ] for i in posiciones_ceros: hijo_1.elementos[i] = madre.elementos[i] ## Hijo 2 posiciones_ceros: List[int] = [ i for i in range(cantidad_articulos) if hijo_2.elementos[i] == None ] for i in posiciones_ceros: hijo_2.elementos[i] = padre.elementos[i] hijo_1.elementos = hijo_1.elementos # Actualizar calculos hijo_2.elementos = hijo_2.elementos # Actualizar calculos hijos: Dict[str, Mochila] = {'hijo_1': hijo_1, 'hijo_2': hijo_2} return hijos