Implement position crossover operator

This commit is contained in:
coolneng 2021-05-25 16:53:59 +02:00
parent a80b8842e3
commit f2584f87cb
Signed by: coolneng
GPG Key ID: 9893DA236405AF57
1 changed files with 33 additions and 13 deletions

View File

@ -1,5 +1,5 @@
from numpy import sum, append, arange, delete, where
from numpy.random import randint, choice
from numpy.random import randint, choice, shuffle
from pandas import DataFrame
@ -44,14 +44,22 @@ def evaluate_element(element, data):
return sum(fitness)
def select_random_genes(matching_genes, parents, m):
def select_distinct_genes(matching_genes, parents, m):
cutoff = randint(m)
distinct_genes = delete(arange(m), matching_genes)
first_parent_genes = parents[0].point.iloc[distinct_genes[cutoff:]]
second_parent_genes = parents[1].point.iloc[distinct_genes[:cutoff]]
distinct_indexes = delete(arange(m), matching_genes)
first_parent_genes = parents[0].point.iloc[distinct_indexes[cutoff:]]
second_parent_genes = parents[1].point.iloc[distinct_indexes[:cutoff]]
return first_parent_genes, second_parent_genes
def select_random_genes(matching_genes, parents, m):
random_parent = parents[randint(len(parents))]
distinct_indexes = delete(arange(m), matching_genes)
genes = random_parent.point.iloc[distinct_indexes].values
shuffle(genes)
return genes
def repair_offspring(offspring, parents, m):
while len(offspring) != m:
if len(offspring) > m:
@ -64,6 +72,7 @@ def repair_offspring(offspring, parents, m):
offspring = offspring.append(
{"point": best_point, "distance": 0}, ignore_index=True
)
random_parent.drop(index=best_index, inplace=True)
return offspring
@ -73,20 +82,31 @@ def get_matching_genes(parents):
return where(first_parent == second_parent)
def uniform_crossover(parents, m):
def populate_offspring(values):
offspring = DataFrame(columns=["point", "distance"])
matching_genes = get_matching_genes(parents)
offspring["point"] = parents[0].point.iloc[matching_genes]
first_genes, second_genes = select_random_genes(matching_genes, parents, m)
offspring["point"] = offspring["point"].append(first_genes)
offspring["point"] = offspring["point"].append(second_genes)
for element in values:
aux = DataFrame(columns=["point", "distance"])
aux["point"] = element
offspring = offspring.append(aux)
offspring["distance"] = 0
offspring = offspring[1:]
return offspring
def uniform_crossover(parents, m):
matching_indexes = get_matching_genes(parents)
matching_genes = parents[0].point.iloc[matching_indexes]
first_genes, second_genes = select_distinct_genes(matching_genes, parents, m)
offspring = populate_offspring(values=[matching_genes, first_genes, second_genes])
viable_offspring = repair_offspring(offspring, parents, m)
return viable_offspring
def position_crossover(parents, n):
genotypes = [parents[0].point.values, parents[1].point.values]
def position_crossover(parents, m):
matching_genes = get_matching_genes(parents)
shuffled_genes = select_random_genes(matching_genes, parents, m)
offspring = populate_offspring(values=[matching_genes, shuffled_genes])
return offspring
def crossover(mode, parents, m):