GA implementation
- DONE fitness function
This commit is contained in:
parent
6c905621ca
commit
301e05268c
@ -13,12 +13,18 @@ def genetic_algorithm_setup(field):
|
||||
|
||||
# new_population to be
|
||||
population_text = []
|
||||
population_text_single = []
|
||||
|
||||
population_size = 3
|
||||
|
||||
# Populate the population_text array
|
||||
for k in range(population_size):
|
||||
population_text_single = []
|
||||
for row in range(D.GSIZE):
|
||||
population_text.append([])
|
||||
population_text_single.append([])
|
||||
for column in range(D.GSIZE):
|
||||
population_text[row].append(random.choice(population_units))
|
||||
population_text_single[row].append(random.choice(population_units))
|
||||
population_text.append(population_text_single)
|
||||
|
||||
# printer
|
||||
for _ in population_text:
|
||||
@ -31,18 +37,8 @@ def genetic_algorithm_setup(field):
|
||||
"""
|
||||
|
||||
# units per population in generation
|
||||
sol_per_pop = 8
|
||||
num_parents_mating = 4
|
||||
|
||||
population_values = []
|
||||
fitness_row = []
|
||||
|
||||
# population Fitness
|
||||
for i in range(0, D.GSIZE):
|
||||
for j in range(D.GSIZE):
|
||||
fitness_row.append(local_fitness(field, i, j, population_text))
|
||||
population_values.append(fitness_row)
|
||||
|
||||
best_outputs = []
|
||||
num_generations = 10
|
||||
|
||||
@ -55,13 +51,15 @@ def genetic_algorithm_setup(field):
|
||||
print("Generation : ", generation)
|
||||
# Measuring the fitness of each chromosome in the population.
|
||||
|
||||
fitness = cal_pop_fitness(population_values)
|
||||
# population Fitness
|
||||
fitness = population_fitness(population_text, field, population_size)
|
||||
|
||||
print("Fitness")
|
||||
print(fitness)
|
||||
|
||||
# best_outputs.append(best_Output(new_population))
|
||||
best_outputs.append(best_Output(new_population))
|
||||
# The best result in the current iteration.
|
||||
# print("Best result : ", best_Output(new_population))
|
||||
print("Best result : ", best_Output(new_population))
|
||||
|
||||
# Selecting the best parents in the population for mating.
|
||||
parents = select_mating_pool(new_population, fitness,
|
||||
|
@ -5,34 +5,37 @@ import src.dimensions as D
|
||||
|
||||
# Genetic Algorithm methods
|
||||
|
||||
def local_fitness(field, x, y, plants):
|
||||
def local_fitness(field, x, y, plants_case):
|
||||
soil_value = 0
|
||||
if field[x][y].field_type == "soil":
|
||||
soil_value = 1
|
||||
else:
|
||||
soil_value = 0.5
|
||||
|
||||
if plants[x][y] == "":
|
||||
if plants_case[x][y] == "":
|
||||
plant_value = 0
|
||||
elif plants[x][y] == "w":
|
||||
elif plants_case[x][y] == "w":
|
||||
plant_value = 1
|
||||
elif plants[x][y] == "p":
|
||||
elif plants_case[x][y] == "p":
|
||||
plant_value = 2
|
||||
elif plants[x][y] == "s":
|
||||
elif plants_case[x][y] == "s":
|
||||
plant_value = 3
|
||||
else:
|
||||
plant_value = 1
|
||||
|
||||
neighbour_bonus = 1
|
||||
print(D.GSIZE, x, y)
|
||||
if x - 1 >= 0:
|
||||
if plants[x][y] == plants[x - 1][y]:
|
||||
if plants_case[x][y] == plants_case[x - 1][y]:
|
||||
neighbour_bonus += 1
|
||||
if x + 1 < D.GSIZE:
|
||||
if plants[x][y] == plants[x + 1][y]:
|
||||
if plants_case[x][y] == plants_case[x + 1][y]:
|
||||
neighbour_bonus += 1
|
||||
if y - 1 >= 0:
|
||||
if plants[x][y] == plants[x][y - 1]:
|
||||
if plants_case[x][y] == plants_case[x][y - 1]:
|
||||
neighbour_bonus += 1
|
||||
if y + 1 < D.GSIZE:
|
||||
if plants[x][y] == plants[x][y + 1]:
|
||||
if plants_case[x][y] == plants_case[x][y + 1]:
|
||||
neighbour_bonus += 1
|
||||
|
||||
# TODO * multiculture_bonus
|
||||
@ -40,10 +43,24 @@ def local_fitness(field, x, y, plants):
|
||||
return local_fitness_value
|
||||
|
||||
|
||||
def cal_pop_fitness(pop):
|
||||
def population_fitness(population_text, field, population_size):
|
||||
# Calculating the fitness value of each solution in the current population.
|
||||
# The fitness function calulates the sum of products between each input and its corresponding weight.
|
||||
fitness = sum(map(sum, pop))
|
||||
fitness = []
|
||||
|
||||
for k in range(population_size):
|
||||
population_values_single = []
|
||||
population_values_single_row = []
|
||||
fitness_row = []
|
||||
|
||||
for i in range(0, D.GSIZE):
|
||||
for j in range(0, D.GSIZE):
|
||||
population_values_single_row.append(local_fitness(field, i, j, population_text))
|
||||
population_values_single.append(population_values_single_row)
|
||||
|
||||
for i in range(D.GSIZE):
|
||||
fitness_row.append(sum(population_values_single[i]))
|
||||
fitness.append(sum(fitness_row))
|
||||
return fitness
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user