Beispiel #1
0
 def __init__(self, individuals: List = None):
     if individuals is None:
         self.individuals: List[Genome] = [
             Genome() for _ in range(Const.N_INDIVIDUALS)
         ]
     else:
         self.individuals: List[Genome] = individuals
Beispiel #2
0
def linear_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    a: float = rd.uniform(0, 1)
    new_genes = (genome_1.genes * a + (1 - a) * genome_2.genes)
    for i in range(len(new_genes)):
        new_genes[i] = round(new_genes[i], 0)

    return Genome(new_genes)
Beispiel #3
0
def multi_point_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    num_of_points = randint(0, const.GENOME_LENGTH)
    selection = rd.choices([0, 1], weights=[5, 5], k=1)
    new_genes = []
    multi_points = []
    for i in range(num_of_points):
        multi_points.append(randint(0, const.GENOME_LENGTH))
    # remove duplicate variables from the list
    multi_points = list(dict.fromkeys(multi_points))
    multi_points.sort()
    counter = 0
    if selection[0] == 0:
        for i in range(const.GENOME_LENGTH):
            if i >= multi_points[counter]:
                counter += 1
            if counter % 2 == 0:
                new_genes.append(genome_1.genes[i])
            else:
                new_genes.append(genome_2.genes[i])
    else:
        for i in range(const.GENOME_LENGTH):
            if i >= multi_points[counter]:
                counter += 1
            if counter % 2 == 0:
                new_genes.append(genome_2.genes[i])
            else:
                new_genes.append(genome_1.genes[i])
    return Genome(new_genes)
Beispiel #4
0
def old_old_load_file_and_show_graph(file_name):
    f = open(file_name, )
    data = json.load(f)
    pop_data = dict(data['population'])
    colors = plt.get_cmap('plasma')(np.linspace(0, 0.8, len(Room.rooms)))
    x = np.arange(len(pop_data))

    avg_fitness = []
    best_fitness = []
    diversity = []
    room_data = {i: [] for i in range(len(Room.rooms))}

    for generation in data['population']:
        c_data = data['population'][generation]
        genes = [Genome(genes=g['genes']) for g in c_data['individuals']]
        population = Population(genes)
        individual_fitness = [g['fitness'] for g in c_data['individuals']]

        diversity.append(population.compute_diversity())
        best_fitness.append(np.max(individual_fitness))
        avg_fitness.append(np.mean(individual_fitness))

    fig, (ax1, ax2) = plt.subplots(1, 2)
    fig.suptitle('Genetic Algorithm - Fitness - 1 Room')

    ax1.plot(x, avg_fitness, color="blue", label="AVG Fitness")
    ax1.plot(x, best_fitness, color="green", label="Best Fitness")
    leg1 = interactive_legend(ax1)

    ax2.plot(x, diversity, color="red", label='diversity')
    leg3 = interactive_legend(ax2)

    plt.show()
Beispiel #5
0
def load_file_and_show_graph(file_name):
    f = open(file_name, )
    data = json.load(f)
    pop_data = dict(data['population'])
    colors = plt.get_cmap('plasma')(np.linspace(0, 0.8, len(Room.rooms)))
    x = np.arange(len(pop_data))

    avg_fitness = []
    best_fitness = []
    diversity = []
    room_data = {i: [] for i in range(len(Room.rooms))}
    room_names = [
        'Empty', 'Triangle', 'Room', 'Small Box', 'Bigger Box', 'Trapezoid',
        'Labyrinth', 'Propeller', 'Slope'
    ]

    for generation in data['population']:
        c_data = data['population'][generation]
        genes = [Genome(genes=g['genes']) for g in c_data['individuals']]
        population = Population(genes)
        individual_fitness = [g['fitness'] for g in c_data['individuals']]

        for room_idx in range(len(Room.rooms)):
            room_data[room_idx].append(
                np.mean([
                    individual_fitness[i][str(room_idx)]
                    for i in range(len(individual_fitness))
                ]))

        generall_fitness = [
            np.mean(list(individual_fitness[i].values()))
            for i in range(len(individual_fitness))
        ]
        diversity.append(population.compute_diversity())
        best_fitness.append(np.max(generall_fitness))
        avg_fitness.append(np.mean(generall_fitness))

    fig, (ax1, ax2) = plt.subplots(1, 2)
    fig.suptitle('Genetic Algorithm - Fitness - Random Rooms')

    ax1.plot(x, avg_fitness, color="blue", label="AVG Fitness")
    ax1.plot(x, best_fitness, color="green", label="Best Fitness")
    # ax1.plot(x, diversity, color="red")
    leg1 = interactive_legend(ax1)

    ax3 = ax1.twinx()
    ax3.plot(x, diversity, color="red", label='diversity')
    leg3 = interactive_legend(ax3)

    max_length = np.max([len(ro_data) for ro_data in room_data.values()])

    for key, ro_data in room_data.items():
        ax2.plot(np.arange(len(ro_data)),
                 ro_data,
                 color=colors[key],
                 label=room_names[key])

    leg2 = interactive_legend(ax2)
    plt.show()
Beispiel #6
0
def uniform_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    new_genes = []
    for i in range(const.GENOME_LENGTH):
        selection = rd.choices([0, 1], weights=[5, 5], k=1)
        if selection[0] == 0:
            new_genes.append(genome_1.genes[i])
        else:
            new_genes.append(genome_2.genes[i])
    return Genome(new_genes)
Beispiel #7
0
def one_point_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    first_point = randint(0, const.GENOME_LENGTH)
    new_genes = []
    for i in range(const.GENOME_LENGTH):
        if first_point < i:
            new_genes.append(genome_1.genes[i])
        else:
            new_genes.append(genome_2.genes[i])
    return Genome(new_genes)
Beispiel #8
0
 def load_generation(self, generation):
     loaded_data = self.sim_data['population'][str(generation)]
     genes = [
         Genome(genes=g['genes'], fitness=g['fitness'])
         for g in loaded_data['individuals']
     ]
     population = Population(genes)
     if self.show_best is not None:
         population.get_top(self.show_best)
     self.c_seed = loaded_data['seed']
     return population
Beispiel #9
0
def two_point_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    first_point = randint(0, const.GENOME_LENGTH)
    # Normally both have to be a random number but it makes sense to start them that way since after the 1st point then the second starts
    second_point = randint(first_point, const.GENOME_LENGTH)
    new_genes = []
    selection = rd.choices([0, 1], weights=[5, 5], k=1)
    if selection[0] == 0:
        for i in range(const.GENOME_LENGTH):
            if i < first_point or i > second_point:
                new_genes.append(genome_1.genes[i])
            else:
                new_genes.append(genome_2.genes[i])
    else:
        for i in range(const.GENOME_LENGTH):
            if i < first_point or i > second_point:
                new_genes.append(genome_2.genes[i])
            else:
                new_genes.append(genome_1.genes[i])
    return Genome(new_genes)
Beispiel #10
0
 def generate_new(self, next_population):
     while len(next_population) < Const.N_INDIVIDUALS:
         next_population.append(Genome())
Beispiel #11
0
def arithmetic_crossover(genome_1: Genome, genome_2: Genome) -> Genome:
    new_genes = []
    for i in range(const.GENOME_LENGTH):
        new_genes.append((genome_1.genes[i] + genome_2.genes[i]) / 2)
    return Genome(new_genes)
Beispiel #12
0
def avg_data(folder):

    runs = listdir(folder)

    data_list = []

    for run in runs[:2]:
        f = open(f'{folder}/{run}', )
        data = json.load(f)
        pop_data = dict(data['population'])
        data_list.append(pop_data)

    colors = plt.get_cmap('plasma')(np.linspace(0, 0.8, len(Room.rooms)))
    x = np.arange(len(pop_data))

    sum_avg_fitness = []
    up_std_error_avg_fitness = []
    down_std_error_avg_fitness = []

    sum_best_fitness = []
    up_std_error_best_fitness = []
    down_std_error_best_fitness = []

    sum_diversity = []
    up_std_error_diversity = []
    down_std_error_diversity = []

    sum_room_data = {i: [] for i in range(len(Room.rooms))}
    room_names = [
        'Empty', 'Triangle', 'Room', 'Small Box', 'Bigger Box', 'Trapezoid',
        'Labyrinth', 'Propeller', 'Slope'
    ]

    for gen in range(100):
        avg_fitness = []
        best_fitness = []
        diversity = []
        room_data = {i: [] for i in range(len(Room.rooms))}
        for data_entry in data_list:
            c_data = data_entry[str(gen)]
            genes = [Genome(genes=g['genes']) for g in c_data['individuals']]
            population = Population(genes)
            individual_fitness = [g['fitness'] for g in c_data['individuals']]

            for room_idx in range(len(Room.rooms)):
                room_data[room_idx].append(
                    np.mean([
                        individual_fitness[i][str(room_idx)]
                        for i in range(len(individual_fitness))
                    ]))

            generall_fitness = [
                np.mean(list(individual_fitness[i].values()))
                for i in range(len(individual_fitness))
            ]
            diversity.append(population.compute_diversity())
            best_fitness.append(np.max(generall_fitness))
            avg_fitness.append(np.mean(generall_fitness))

        avg_of_avg_fitness = np.mean(avg_fitness)
        sum_avg_fitness.append(avg_of_avg_fitness)

        differences = []
        for c_avg_fitness in avg_fitness:
            differences.append(avg_of_avg_fitness - c_avg_fitness)
        up_std_error_avg_fitness.append(
            np.max(avg_fitness) - avg_of_avg_fitness)
        down_std_error_avg_fitness.append(avg_of_avg_fitness -
                                          np.min(avg_fitness))

        avg_of_best_fitness = np.mean(best_fitness)
        sum_best_fitness.append(avg_of_best_fitness)

        differences = []
        for c_best_fitness in avg_fitness:
            differences.append(avg_of_best_fitness - c_best_fitness)

        up_std_error_best_fitness.append(
            np.max(best_fitness) - avg_of_best_fitness)
        down_std_error_best_fitness.append(avg_of_best_fitness -
                                           np.min(best_fitness))

        avg_diversity = np.mean(diversity)
        sum_diversity.append(avg_diversity)
        differences = []
        for c_diversity in diversity:
            differences.append(avg_diversity - c_diversity)

        up_std_error_diversity.append(np.max(diversity) - avg_diversity)
        down_std_error_diversity.append(avg_diversity - np.min(diversity))

        for room_idx in range(len(Room.rooms)):
            sum_room_data[room_idx].append(np.mean(room_data[room_idx]))

    fig, (ax1, ax2) = plt.subplots(1, 2)
    fig.suptitle('Genetic Algorithm - Fitness - Avg Rooms')

    # ax1.errorbar(x, sum_avg_fitness, [down_std_error_avg_fitness, up_std_error_avg_fitness], color="blue", marker = '^', label='avg_fitness')
    # # ax1.plot(x, sum_avg_fitness, color="blue")
    # ax1.errorbar(x, sum_best_fitness, [down_std_error_best_fitness, up_std_error_best_fitness], color = "green", marker = 'x', label='best_fitness')
    # # ax1.plot(x, sum_best_fitness, color="green")
    # leg1 = interactive_legend(ax1)

    ax3 = ax1.twinx()
    ax3.errorbar(x,
                 sum_diversity,
                 [down_std_error_diversity, up_std_error_diversity],
                 color="red",
                 marker='^',
                 label='diversity')
    # ax3.plot(x, sum_diversity, color="red", label='diversity')
    leg3 = interactive_legend(ax3)

    for key, ro_data in sum_room_data.items():
        ax2.plot(np.arange(len(ro_data)),
                 ro_data,
                 color=colors[key],
                 label=room_names[key])

    leg2 = interactive_legend(ax2)
    plt.show()