Genopt is a high level framework that helps optimizing functions using the power of genetic algorithms.
Genopt is available at PyPI
$ pip install genopt
#defining a fixed set of Parameters for 4 variables
params = {
'x': [35, -51, 0, 1, 2, 3, 4, 66, 11, 50, 90],
'y': [-100, -51, 0, 7, 32, 31, 4, 51, 121, 50, 90, 1000, 231]
'z': [-10, -51, 0, 12, 2, 43, 43, 5, 1231, 50, 90],
'k': [-56, -51, 0, 1, 2, 13, 4, 5, 11, 50, 90]
}
from genopt.parameters import Parameters
#defining a 4 variable search space of float values from -100.0 to 100.0
params = {
'x': Parameters.suggest_float(-100, 100),
'y': Parameters.suggest_float(-100, 100),
'z': Parameters.suggest_float(-100, 100),
'k': Parameters.suggest_float(-100, 100)
}
#defining an objective function
def objective(individual):
x = individual['x']
y = individual['y']
z = individual['z']
k = individual['k']
return (x**2 - 4*y**3 / z**4) * k**3
#defining an objective function
def objective(individual):
x = individual['x']
y = individual['y']
z = individual['z']
k = individual['k']
objective_1 = ((x**2 - 4*y**3 / z**4) * k**3)
objective_2 = (k**3 / x)
return objective_1, objective_2
from genopt.environment import Environment
if __name__ == '__main__':
#defining our Environment instance with a population of 100 individuals,
#roulette selection for 50% of the population, one-point crossover,
#a single gene mutation with 10% probability of mutation,
#10% elite rate, some verbose and without a seed for reproducibility
environment = Environment(
params=params
)
#minimizing the objective function and adding a 60 seconds timeout
#as an stop criteria and a single core execution (n_jobs=1)
results = environment.optimize(
objective=objective,
direction='minimize',
timeout=60
)
from genopt.environment import Environment
if __name__ == '__main__':
#defining our Environment instance with a population of 100 individuals,
#tournament selection for 80% of the population, one-point crossover,
#a single gene mutation with 25% probability of mutation, some verbose and a seed for reproducibility
environment = Environment(
params=params,
num_population=100,
selection_type='tournament',
selection_rate=0.8,
crossover_type='one-point',
mutation_type='single-gene',
prob_mutation=0.25,
verbose=1,
random_state=42
)
#minimizing the objective function and adding
#3 stop criterias (num_generations, timeout, stop_score)
results = environment.optimize(
objective=objective,
direction='minimize',
num_generations=9999,
timeout=60,
stop_score=-np.inf
)
from genopt.environment import Environment
if __name__ == '__main__':
#defining our Environment instance with a population of 100 individuals,
#ranking selection for 70% of the population, one-point crossover,
#a single gene mutation with 25% probability of mutation, some verbose and a seed for reproducibility
environment = Environment(
params=params,
num_population=100,
selection_type='ranking',
selection_rate=0.7,
crossover_type='one-point',
mutation_type='single-gene',
prob_mutation=0.25,
verbose=1,
random_state=42
)
#minimizing the first value and maximazing the second value of the objective function,
#adding 1 stop criterias (timeout), adding 50% weight to each objective and
#assigning a name to each objective score for the final dataframe
results = environment.optimize(
objective=objective,
direction=['minimize', 'maximize'],
weights=[0.5, 0.5],
timeout=60,
score_names=['complex_equation_score', 'simple_equation_score']
)
print(f'EXECUTION TIME={results.execution_time}')
print(f'BEST SCORE={results.best_score}')
print(f'BEST INDIVIDUAL={results.best_individual}')
print('BEST PER GENERATION:')
print(results.best_per_generation_dataframe)
print('LAST GENERATION INDIVIDUALS:')
print(results.last_generation_individuals_dataframe)