diff --git a/genetic_algorithm.py b/genetic_algorithm.py index 1918db8..b2ef21f 100644 --- a/genetic_algorithm.py +++ b/genetic_algorithm.py @@ -1,18 +1,16 @@ import random import math -import statistics -import time ### prawdopodobieństwo mutacji -mutation_prob = 0.02 +mutation_prob = 0.03 ### ilość osobników w pokoleniu, powinna być parzysta -generation_size = 30 +generation_size = 20 ### liczba pokoleń -number_of_generations = 100 +number_of_generations = 30 ### liczba paczek -number_of_packages = 15 +number_of_packages = 45 ### liczba regałów -number_of_racks = 5 +number_of_racks = 70 ### jak bardzo promowane są osobniki wykorzystujące całą pojemność regału amount_of_promotion = 3 @@ -95,55 +93,58 @@ def mutation(individual): individual[locus] = random.randint(0,number_of_racks-1) return individual + +def gen_alg(number_of_generations, generation_size, mutation_prob, amount_of_promotion): + ### WŁAŚCIWY ALGORYTM + generation = first_gen() + global_maximum = -math.inf + + # pętla znajdująca najlepszy fitness w pierwszym pokoleniu + for i in range(generation_size): + evaluation_of_individual = evaluation(generation[i]) + if evaluation_of_individual > global_maximum: + global_maximum = evaluation_of_individual + best_individual = generation[i].copy() + + #właściwa pętla programu + for generation_index in range(number_of_generations): + print('pokolenie numer: ', generation_index) + # print(generation) + + ### RULETKA + survivors = roulette(generation) + # print('przetrwali: ',survivors) + + ### KRZYŻOWANIE + descendants = [] + for individual in range(0,generation_size,2): + pair = crossover(survivors[individual],survivors[individual+1]) + for each in pair: + descendants.append(each) + # print('potomkowie: ', descendants) + + ### MUTACJA + for individual in range(generation_size): + if random.random() <= mutation_prob: + mutation(descendants[individual]) + # print('potomkowie po mutacji: ', descendants) + + ### NAJLEPSZE DOPASOWANIE + local_maximum = -math.inf + for each in range(generation_size): + specific_fitness = evaluation(descendants[each]) + if specific_fitness > local_maximum: + local_maximum = specific_fitness + print('maximum w pokoleniu: ',local_maximum) + if local_maximum > global_maximum: + global_maximum = local_maximum + generation = descendants + print('maximum globalne: ', global_maximum) + ### lista paczek, indeks to id paczki, wartość w liście to jej waga -packages = [random.randint(2,9) for i in range(number_of_packages)] +packages = [random.randint(1,10) for i in range(number_of_packages)] ### lista regałów, indeks to id regału, wartość w liście to jego pojemność -racks = [random.randint(10,20) for i in range(number_of_racks)] +racks = [random.randint(15,18) for i in range(number_of_racks)] # print(packages) # print(racks) - -### WŁAŚCIWY ALGORYTM -generation = first_gen() -global_maximum = -math.inf - -# pętla znajdująca najlepszy fitness w pierwszym pokoleniu -for i in range(generation_size): - evaluation_of_individual = evaluation(generation[i]) - if evaluation_of_individual > global_maximum: - global_maximum = evaluation_of_individual - best_individual = generation[i].copy() - -#właściwa pętla programu -for generation_index in range(number_of_generations): - print('pokolenie numer: ', generation_index) - # print(generation) - - ### RULETKA - survivors = roulette(generation) - # print('przetrwali: ',survivors) - - ### KRZYŻOWANIE - descendants = [] - for individual in range(0,generation_size,2): - pair = crossover(survivors[individual],survivors[individual+1]) - for each in pair: - descendants.append(each) - # print('potomkowie: ', descendants) - - ### MUTACJA - for individual in range(generation_size): - if random.random() <= mutation_prob: - mutation(descendants[individual]) - # print('potomkowie po mutacji: ', descendants) - - ### NAJLEPSZE DOPASOWANIE - local_maximum = -math.inf - for each in range(generation_size): - specific_fitness = evaluation(descendants[each]) - if specific_fitness > local_maximum: - local_maximum = specific_fitness - print('maximum w pokoleniu: ',local_maximum) - if local_maximum > global_maximum: - global_maximum = local_maximum - generation = descendants -print('maximum globalne: ', global_maximum) +gen_alg(number_of_generations, generation_size, mutation_prob, amount_of_promotion)