Beispiel #1
0
    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)
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #7
0
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