def make_next_generation(population, pizza): mating_pool = population[:int(c_par * P)] next_generation = [] for _ in range(int(c_rec * P) // 2): A, B = random.sample(mating_pool, 2) C, D = A.recombine(B, pizza) next_generation += [C, D] next_generation += mating_pool for _ in range(int(c_mut * P)): # A = random.choice(next_generation) A = mating_pool[0] B = A.copy() levels = random.choice([1, 2, 3]) B.mutate(pizza, levels) next_generation.append(B) for _ in range(int(c_ran * P)): A = Individual({}, slices, n_col, n_row, L, H) A.fill_layout(pizza) next_generation.append(A) next_generation.sort(key=lambda x: x.efficiency(), reverse=True) return next_generation
for pos, k in s_list: _lay[tuple(pos)] = k A = Individual(_lay, slices, n_col, n_row, L, H) population.append(A) return population pizza, n_row, n_col, L, H = read_setup(inp_fpath) slices = generate_possible_slices(L, H) if resume == False: population = [] for i in range(P): A = Individual({}, slices, n_col, n_row, L, H) A.fill_layout(pizza) population.append(A) population.sort(key=lambda x: x.efficiency(), reverse=True) else: print("Continuing previous optimization.") population = load_population( res_path + "generations_backup/G_%s.json" % i2s(i_start, 4), slices, n_col, n_row, L, H, pizza) print(len(population), P) if len(population) < P: print( "Loaded population is smaller than the given max population.\nExtending it with random individuals." ) while len(population) < P: A = Individual({}, slices, n_col, n_row, L, H) A.fill_layout(pizza)