Updated tournament selection
On small populations, there is now a lower bound on the tournament size.
This commit is contained in:
@ -29,12 +29,13 @@ class GA:
|
|||||||
# Selection variables
|
# Selection variables
|
||||||
self.parent_ratio = 0.1
|
self.parent_ratio = 0.1
|
||||||
self.selection_probability = 0.95
|
self.selection_probability = 0.95
|
||||||
|
self.tournament_size_ratio = 0.1
|
||||||
|
|
||||||
# Termination variables
|
# Termination variables
|
||||||
self.current_generation = 0
|
self.current_generation = 0
|
||||||
self.current_fitness = 0
|
self.current_fitness = 0
|
||||||
|
|
||||||
self.generation_goal = 250
|
self.generation_goal = 15
|
||||||
self.fitness_goal = 9
|
self.fitness_goal = 9
|
||||||
|
|
||||||
# Mutation variables
|
# Mutation variables
|
||||||
|
|||||||
@ -7,16 +7,14 @@ from initialization.chromosome_structure.chromosome import Chromosome
|
|||||||
class Parent_Selection:
|
class Parent_Selection:
|
||||||
class Tournament:
|
class Tournament:
|
||||||
def with_replacement(ga):
|
def with_replacement(ga):
|
||||||
tournament_size = int(len(ga.population.get_all_chromosomes())*ga.parent_ratio/10)
|
tournament_size = int(len(ga.population.get_all_chromosomes())*ga.parent_ratio*ga.tournament_size_ratio)
|
||||||
if tournament_size < 3:
|
if tournament_size < 5:
|
||||||
tournament_size = int(len(ga.population.get_all_chromosomes())*ga.parent_ratio/3)
|
tournament_size = 5
|
||||||
|
|
||||||
# Probability used for determining if a chromosome should enter the mating pool.
|
# Probability used for determining if a chromosome should enter the mating pool.
|
||||||
selection_probability = ga.selection_probability
|
selection_probability = ga.selection_probability
|
||||||
|
|
||||||
# Repeat tournaments until the mating pool is large enough.
|
# Repeat tournaments until the mating pool is large enough.
|
||||||
while (len(ga.population.mating_pool) < len(ga.population.get_all_chromosomes())*ga.parent_ratio):
|
while (len(ga.population.mating_pool) < len(ga.population.get_all_chromosomes())*ga.parent_ratio):
|
||||||
|
|
||||||
# Generate a random tournament group and sort by fitness.
|
# Generate a random tournament group and sort by fitness.
|
||||||
tournament_group = ga.sort_by_best_fitness([random.choice(ga.population.get_all_chromosomes()) for n in range(tournament_size)])
|
tournament_group = ga.sort_by_best_fitness([random.choice(ga.population.get_all_chromosomes()) for n in range(tournament_size)])
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ class Parent_Selection:
|
|||||||
# second ranked fitness has probability: selection_probability * (1-selection_probability)
|
# second ranked fitness has probability: selection_probability * (1-selection_probability)
|
||||||
# third ranked fitness has probability: selection_probability * (1-selection_probability)^2
|
# third ranked fitness has probability: selection_probability * (1-selection_probability)^2
|
||||||
# etc.
|
# etc.
|
||||||
if random.uniform(0, 1) < selection_probability * pow(1-selection_probability, index+1):
|
if random.uniform(0, 1) < selection_probability * pow(1-selection_probability, index):
|
||||||
ga.population.mating_pool.append(tournament_group[index])
|
ga.population.mating_pool.append(tournament_group[index])
|
||||||
|
|
||||||
class Roulette:
|
class Roulette:
|
||||||
|
|||||||
@ -1,17 +1,14 @@
|
|||||||
import EasyGA
|
import EasyGA
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
# Create the Genetic algorithm
|
# Create the Genetic algorithm
|
||||||
ga = EasyGA.GA()
|
ga = EasyGA.GA()
|
||||||
|
|
||||||
|
ga.population_size = 15
|
||||||
|
ga.chromosome_length = 10
|
||||||
|
ga.generation_goal = 100
|
||||||
|
ga.gene_impl = [random.randint,1,10]
|
||||||
|
|
||||||
|
|
||||||
ga.gene_impl = [random.randrange,1,100]
|
|
||||||
|
|
||||||
# Run Everything
|
|
||||||
ga.evolve()
|
ga.evolve()
|
||||||
|
|
||||||
# Print the current population
|
ga.population.print_all()
|
||||||
print(f"Current Generation: {ga.current_generation}")
|
|
||||||
ga.population.print_all()
|
|
||||||
Reference in New Issue
Block a user