Exemple #1
0
def new_population(problem_type: str, old_population: list,
                   mutated_children: list, evaluator):
    """
    Genereaza o populatie noua dupa urmatoarele reguli:
    -se pastreaza toti copiii obtinuti dupa mutatii(acestia se repara in cazul problemei de tip knapsack)
    -locurile libere din populatie se vor umple cu parintii ramasi
    :param problem_type: poate avea valorile "knapsack" sau "tsp"
    :param old_population: populatia precedenta
    :param mutated_children: copiii obtinuti dupa mutatie
    :param evaluator: in cazul unei probleme de tip Kanpsack va avea contine o lista de obiecte si capacitatea maxima
                    in cazul uneil probleme de tip TSP va contine matricea de distante
    :return population: noua popullatie obtinuta
    """
    population = []
    mc = mutated_children[:]
    if problem_type == "knapsack":
        for i in range(len(mc)):
            if not Knapsack.is_valid(evaluator[0], mc[i], evaluator[1]):
                mc[i] = Knapsack.make_it_valid(evaluator[0], mc[i],
                                               evaluator[1])
        population = old_population + mc
        population = sorted(
            population,
            key=lambda x: Knapsack.fitness(evaluator[0], x, evaluator[1]),
            reverse=True)
    elif problem_type == "tsp":
        population = old_population + mc
        population = sorted(population,
                            key=lambda x: TSP.fitness_TSP(x, evaluator),
                            reverse=False)
    population = population[:len(old_population)]
    return population
Exemple #2
0
def evaluate_population(problem_type: str, population: list,
                        population_size: int, evaluator):
    """
    Evaluarea populatiei pentru a obtine best, average si worst
    :param problem_type: poate avea valorile "knapsack" sau "tsp"
    :param population: populatia evaluata
    :param population_size: marimea populatiei
    :param evaluator: in cazul unei probleme de tip Kanpsack va avea contine o lista de obiecte si capacitatea maxima
                    in cazul uneil probleme de tip TSP va contine matricea de distante
    :return best: cel mai bun fitness din populatie
    :return avg: valoare medie pentru fitness-ul populatie
    :return worst: cel mai slab fitness din populatie
    """
    best, avg, worst = 0, 0, 0
    if problem_type == "knapsack":
        eval_population = sorted(
            population,
            key=lambda x: Knapsack.fitness(evaluator[0], x, evaluator[1]),
            reverse=True)
        best = Knapsack.fitness(evaluator[0], eval_population[0], evaluator[1])
        for i in range(population_size):
            avg += Knapsack.fitness(evaluator[0], eval_population[i],
                                    evaluator[1])
        avg /= population_size
        worst = Knapsack.fitness(evaluator[0], eval_population[-1],
                                 evaluator[1])
    elif problem_type == "tsp":
        eval_population = sorted(population,
                                 key=lambda x: TSP.fitness_TSP(x, evaluator),
                                 reverse=False)
        best = TSP.fitness_TSP(eval_population[0], evaluator)
        for i in range(population_size):
            avg += TSP.fitness_TSP(eval_population[i], evaluator)
        avg /= population_size
        worst = TSP.fitness_TSP(eval_population[-1], evaluator)
    return best, avg, worst
Exemple #3
0
def selection(problem_type: str, population: list, population_size: int,
              evaluator):
    """
    Aici se selecteaza un parinte din populatia initiala. Se foloseste selectia turnir de marime 5.
    :param population_size: marimea populatiei
    :param problem_type: poate avea valorile "knapsack" sau "tsp"
    :param population: populatia initiala
    :param evaluator: in cazul unei probleme de tip Kanpsack va avea contine o lista de obiecte si capacitatea maxima
                    in cazul uneil probleme de tip TSP va contine matricea de distante
    :return parent: lista
    """
    parent1, parent2 = [], []
    p = population[:]  # copie a populatiei initiale
    for i in range(2):
        sample = np.random.default_rng().choice(population_size,
                                                size=2,
                                                replace=False)
        possible_parents = [p[s] for s in sample]
        if sample[0] > sample[1]:
            sample[0], sample[1] = sample[1], sample[0]
        del p[sample[0]]
        del p[sample[1] - 1]
        population_size -= 2
        parent = []
        if problem_type == "knapsack":
            parent = sorted(
                possible_parents,
                key=lambda x: Knapsack.fitness(evaluator[0], x, evaluator[1]),
                reverse=True)
        elif problem_type == "tsp":
            parent = sorted(possible_parents,
                            key=lambda x: TSP.fitness_TSP(x, evaluator),
                            reverse=False)
        if i == 0:
            parent1 = parent[0]
        else:
            parent2 = parent[0]
    return parent1, parent2